質問: python3系で、Djangoを用いたWEBアプリを開発しています。 その中で、キャッシュの仕組みを作るところで悩んでいます。 下記の場合のそれぞれで、変数の値を共有する方法を教えていただけませんでしょうか。 <調べて分かったこと> 関数(def ~)の外側で宣言した変数は、各関数で値を共有出来る。 ただし、関数内でglabalを付けて変数を呼び出さないと、変更できない。 <調べても分からなかったこと> 1.WEBで、ユーザーAとユーザーBで変数の値を共有する方法。 ユーザーAが呼び出した関数で変数が変更されると、次にユーザーBがその変数にアクセスしたときに、 変更された値を参照したい。 2.上記は、同じページを前提としていますが、異なるページ間でも変数の共有を行いたいです。 具体的には、DBから取得したマスタデータをキャッシュしたく、 アプリを立ち上げで1度だけDBにアクセスすれば、後はその値を変数にもっておき、 次からはどのユーザーがどのページから実行した関数でも、キャッシュを利用できるようにしたいです。 また、1と2で、値の更新の衝突が起こりうる場合に、それを防ぐような工夫は何かありませんでしょうか。 よろしくお願いいたします。 <追記> 2は下記のようなイメージです。 http://www.atmarkit.co.jp/fdotnet/dotnettips/122globalobj/globalobj.html
回答: > > 1.WEBで、ユーザーAとユーザーBで変数の値を共有する方法。 > > ユーザーAが呼び出した関数で変数が変更されると、次にユーザーBがその変数にアクセスしたときに、変更された値を参照したい。 > > > 通常はデータベースに記録すると思いますが、どうしても「キャッシュの仕組み」でやろうとするのであれば、Djangoのキャッシュフレームワークを使えばできそうです。 > > 2.上記は、同じページを前提としていますが、異なるページ間でも変数の共有を行いたいです。 > > 具体的には、DBから取得したマスタデータをキャッシュしたく、アプリを立ち上げで1度だけDBにアクセスすれば、後はその値を変数にもっておき、次からはどのユーザーがどのページから実行した関数でも、キャッシュを利用できるようにしたいです。 > > > これもDjangoのキャッシュフレームワークで解決できますね。 > > また、1と2で、値の更新の衝突が起こりうる場合に、それを防ぐような工夫は何かありませんでしょうか。 > > > 通常はデータベースのトランザクションを使います。 データベース以外の(キャッシュなどの)方法で行う場合、 **セマフォ**, **スピンロック**, **クリティカルセクション** といった仕組みをキャッシュか何かの、共有された領域を使って実装する必要があります。 簡単に説明すると、キャッシュに「これから更新するフラグ」を用意して、このフラグが立ってるときは別の処理はフラグを立てられなくする、という考え方です。 しかし、書かれている内容からすると、必要なのはデータベースのトランザクションのように思えるので、先にそちらを検討した方が良いかもしれません。 なお、キャッシュについては、以下の2つの回答も参照してみてください。 * *