1

ディクショナリが渡されるユーザークラスなど、いくつかのモデルクラスがあり、さまざまなメソッドを提供してラップします。値を変更する必要がある場合、その一部はデータベースと通信します。ディクショナリ自体はsqlalchemyRowProxyから作成されているため、そのすべてのキーは実際にはsqlユーザーテーブルから直接取得された属性名です。(属性には、user_id、username、email、passwdなどが含まれます)

ユーザーがログインしている場合、このディクショナリをredisキー値ストアに保存し、必要に応じて新しいユーザーオブジェクトを呼び出し、redisからこのディクショナリを渡す必要があります(セッションでユーザーIDを保存するよりも高速である必要があります)そして、そのuser_idに基づいてデータベースから値を再度ロードしますか?

または、どういうわけかオブジェクト全体をシリアル化してredisに保存する必要がありますか?モデルとセッションオブジェクトを管理する別の方法があれば、それも良いと思います。

誰かが疑問に思っている場合に備えて、私はsqlalchemy式言語のみを使用しており、ormは使用していません。モデルクラスをインターフェイスとして使用し、それらに対してコーディングしています。

4

2 に答える 2

4

本当に注意しない限り、オブジェクト全体をredisにシリアル化すると問題が発生します。あなたはそれをキャッシュのように効果的に扱っているので、ユーザーが自分自身について何かを変更した場合、それらの値が期限切れになることに注意する必要があります。また、すべての値がシリアル化可能であることを確認する必要があります(おそらくpickleを介して)。これが時期尚早の最適化であるかどうかを指定しなかったので、おそらくそうだと思います。ユーザーIDを追跡し、データベースから必要なときにユーザーIDを再ロードすることをお勧めします。

于 2012-09-07T15:17:05.047 に答える
0

マイケルの答えに+1。

私もいくつかのことに注意したい-

このデータをキャッシュすることにした場合は、読み取り専用ストアとして扱う必要があります。これに基づいてデータベースを更新しないでください。

プロジェクトを2つの論理セクションに分割しています。

/ account-大量の書き込み操作、データは最新である必要があります/ everything-else-ほとんどの場合、読み取り操作、データは最新である必要があります

/ account内のすべては、常に最新バージョンのDBにヒットします。サイトの残りの部分はデータベースまたはキャッシュにヒットする可能性があります-私は気にしません。

説明したニーズに応じて、式言語を使用して、操作を行うためにキャッシュデータからオブジェクトを作成する必要はありません。

http://docs.sqlalchemy.org/en/rel_0_7/core/tutorial.html#inserts-and-updates

>>> conn.execute(users.update()。

... where(users.c.name =='jack')。

... values(name ='ed')

...)

なぜそうしないのですか?

where(users.c.id == cached_value)

于 2012-09-07T15:38:20.423 に答える