Memcached的批量删除问题(版本)[占位]

终于还是遇到这个问题了,之前听 @huacnlee 说过,当时不知道具体场景也没有仔细考虑过。

这两天想了一下,看了些文章介绍,准备自己实现一个以版本号来处理的批量删除(过期)问题。

 

参考:

memcached应用策略

http://blog.sina.com.cn/s/blog_5378b2830100figs.html

memcached批量删除方案探讨

http://it.dianping.com/memcached_item_batch_del.htm

memcached缓存批量更新解决方案探讨

http://bbs.phphubei.com/thread-10038-1-1.html


另外好像看过一篇跟版本号方式处理的关的文章没找到了。

 

标签: php, memcached
posted @ 2010-03-29 00:43 果果’er 阅读(503) 评论(4) 编辑 收藏

 回复 引用 查看   
#1楼2010-03-29 09:00 | huacnlee      
你也终于开始烦恼这个问题了。

到目前为止,我一直使用 给 key 打 tag 的方式来统一清除,但是感觉仍然还不是很理想,不过想在有新的思路。

我把数据改为单条来存放,如:
posts = Post.get_recent_posts(5) 得到了 5 条最新的文章数据,我在中间加入缓存处理。
1.把那5条 post 拆分出来分别存放如缓存 cache_key 为 post<id>。
2.再把这5条的改为 id 数组[4,22,23,32],并以 get_recent_posts(5) 做为数组的 cache_key 存入缓存。

下次调用 Post.get_recent_posts(5) ,先取出 get_recent_posts(5) 的 id 数组,在循环数组,分别去除对应的单条缓存。

这样一来,清除操作将会在 Update 的时候 更新 post<id>
Insert 和 Delete 的时候清除 get_recent_posts(5)

 回复 引用 查看   
#2楼[楼主]2010-03-29 09:19 | 果果’er      
@huacnlee:
我在下一篇里面有个基本的思路,按版本号可以保证数据准确,但作废率太高了。
你这个方法也能保证数据准确,如果加上getMulti和setMulti应该也会非常快。

 回复 引用 查看   
#3楼2010-03-29 10:08 | huacnlee      
恩,这个我也正在准备改为一次多条存取

不过现在另外一个棘手的问题:

id 数组的清除问题,我现在是给 id 数组加上以表名为 tag 来存放
如:
Post.top_hot(10)
Post.top_hot(20)
Post.recent(30)
Post.recent_audited(50)
...

它们都将加上 post 的tag,但 Post 有 Insert和Delete 的时候,清除所有 tag=post 的缓存,这个清除面积太大了,而我只是动过一个数据。
我在想,还有没有跟好的处理,现在是在想不出来了。

 回复 引用 查看   
#4楼[楼主]2010-03-29 11:00 | 果果’er      
@huacnlee:
对这个问题,所以我在下一篇里有个用Version来控制的想法,还没有实现完全。

以memcached的思路,一般是不去主动清除数据的吧。让它放在那里,到时自然会被替换掉:
(1)或者被memcached替换算法替换掉,(2)或者被你取到一次无效数据后,用新数据去替换。

memcached现在没有DeleteMulti,更没有按条件Delete,如果需要自己管理一个相关列表,再用循环去跑代价太大了。

发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1699185 Ouzin2ZmTvo=