做web,经常会用到key-value的缓存,虽然快,但缓存的维护是个问题,就拿sgementfault举例来说,如果我来做,首页的问题分页就涉及到
1.问题总数缓存
2.每页问题清单缓存
现在管理员删除了一个问题,那么为满足实时性,肯定需要更新缓存
1.问题总数缓存-1
2.每页问题清单缓存如何更新?
当然可以查数据库算出来,是否有这个必要?
这只是个例子,为了说明问题,为了更新一个缓存而造成了另外的数据库查询开销。在实际过程中,我经常用查询条件的组合作为key,这使得我在更新缓存时无从下手(虽然我自己手工维护了一个缓存key的清单,但难免会有遗漏,终归不是好办法)。但如果把缓存的key都定义死,则缓存的使用不是那么灵活。
次のように処理することをお勧めします:
1. 質問の総数をキャッシュします
リーリー参考: http://www.php.net/manual/zh/memcache...
2. 各ページの質問リストのキャッシュを更新するにはどうすればよいですか?
私だったら、おそらく end_id を終了スタンプとして使用し、新しい質問が来たときにそれをインクリメントするでしょう。これは主に 100 以上のサマリーごとに更新されます。ボリュームなしで判断するのは困難です (小規模から始める場合は、3 分に 1 回データベースを更新するだけで問題ありません)。
1. 質問の総数をキャッシュするには、@jawa が提供する memcache incr/decr を使用すると良いです
2. 各ページの質問のリストについては、リストを管理する必要はなく、質問の内容をキャッシュするだけでデータベースから確認できます。確かに、@jawaが言ったように、それは量によって異なります。詳細については、非常に詳細な方法があり、たとえば、上記のリスト自体をデータベースから確認するなど、非常に詳細な方法もあります。 Sina Weibo では 2 回取得され、コンテンツの変更 (少ない) とカウントの変更 (頻繁) が分離されます。
キャッシュを使用する主な目的は、データベースへの負荷を軽減することです。キャッシュを頻繁に更新しすぎるのは不合理です。
1. データが特定の定義済みしきい値に達すると、リアルタイムのパフォーマンスを放棄し、キャッシュを更新します。
2. Sphinx などの検索エンジンのリアルタイム増分インデックスを使用します。