首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

memcached 常见有关问题 翻译 (转)

2012-07-25 
memcached 常见问题 翻译 (转)? Then, when you get from the cache and examine the timeout and find it

memcached 常见问题 翻译 (转)

?

Then, when you get from the cache and examine the timeout and find it expired, immediately edit the embedded timeout to a time in the future and re-store the data as is. Finally, fetch from the DB and update the cache with the latest value. This does not eliminate, but drastically reduces the amount of time where a stampede can occur.

?

A decent python example can be found here: http://www.djangosnippets.org/snippets/155/

?

If you have a lot of data excelling at causing this problem, you might also consider using MySQL Cluster for it, or a tiered caching approach

?

Another (pretty cool!) idea is to use Gearman, as noted on the mailing list: http://lists.danga.com/pipermail/memcached/2007-July/004858.html

?

模拟带锁的添加命令

如果你实在需要锁,你可以通过“添加”命令模仿锁的功能。尽管在未命中的情况下它不是那么有用,但如果你用它缓存平常的数据(应用服务器池的元数据)那还是有用的。

比如,你要更新键 A 。

?????? 1. 添加一个 "lock:A" 的键,这个键有一个持续几秒的过期时间(足够长以使你能完成计算和更新,也不要很长,因为如果锁进程挂了,这个键不会立即释放)

?????? 2. 如果添加操作成功了,你就拥有了锁:

????????????? 从缓存获取键 A 的数据。

????????????? 在客户端更改数据。

????????????? 更新缓存键 A 的数据。

????????????? 删除键 "lock:A" ,如果你不需要立即再次更新,就让它存活直到失效。

?? ? 3. 如果添加操作失败,说明有人获取了锁。这时让应用做些合适的事,比如返回老数据,等待后重试,或是其他的。

以上这些操作类似 MySQL 将 GET_LOCK 的 timeout 值设置成 0 。没有办法在 memcached 中通过互斥锁模拟 GET_LOCK() 的 timeout 操作。


预热你的缓存

?

如果你有一个很高访问率的站点,并且你正想加入故障恢复功能或是其他全新的功能,你最终可能会碰到空缓存的问题。一开始缓存是空的,然后一大群人点击你的站点,在填充缓存的过程中,你的数据库可能会承受不住压力。为了解决这一问题,你可以试试任何可行的方法来 " 温暖 " 你的数据库。

?

你可以写一些脚本来缓存通用的页面。你也可以写一个命令行工具来填充缓存。两种方法都可能对你有帮助。你可以在高峰时刻在缓存里填充一些内容。

热点排行