首页 » Web前端 » phpmemcachetimeout技巧_Memcache mutex设计模式

phpmemcachetimeout技巧_Memcache mutex设计模式

访客 2024-12-07 0

扫一扫用手机浏览

文章目录 [+]

周六的S2 Web 2.0技能沙龙上先容了memcache中利用mutex场景(文后要演讲稿),有网友对详情绪兴趣,大略先容如下。

场景

phpmemcachetimeout技巧_Memcache mutex设计模式

Mutex紧张用于有大量并发访问并存在cache过期的场合,如

phpmemcachetimeout技巧_Memcache mutex设计模式
(图片来自网络侵删)
首页top 10, 由数据库加载到memcache缓存n分钟微博中名人的content cache, 一旦不存在会大量要求不能命中并加载数据库须要实行多个IO操作天生的数据存在cache中, 比如查询db多次

问题

在大并发的场合,当cache失落效时,大量并发同时取不到cache,会同一瞬间去访问db并回设cache,可能会给系统带来潜在的超负荷风险。
我们曾经在线上系统涌现过类似故障。

办理方法

方法一

在load db之前先add一个mutex key, mutex key add成功之后再去做加载db, 如果add失落败则sleep之后重试读取原cache数据。
为了防止去世锁,mutex key也须要设置过期韶光。
伪代码如下

(注:下文伪代码仅供理解思路,可能存在bug,欢迎随时指出。
)

if (memcache.get(key) == null) { // 3 min timeout to avoid mutex holder crash if (memcache.add(key_mutex, 3 60 1000) == true) { value = db.get(key); memcache.set(key, value); memcache.delete(key_mutex); } else { sleep(50); retry(); }}

方法二

在value内部设置1个超市价(timeout1), timeout1比实际的memcache timeout(timeout2)小。
当从cache读取到timeout1创造它已经由期时候,立时延长timeout1并重新设置到cache。
然后再从数据库加载数据并设置到cache中。
伪代码如下

v = memcache.get(key);if (v == null) { if (memcache.add(key_mutex, 3 60 1000) == true) { value = db.get(key); memcache.set(key, value); memcache.delete(key_mutex); } else { sleep(50); retry(); }} else { if (v.timeout <= now()) { if (memcache.add(key_mutex, 3 60 1000) == true) { // extend the timeout for other threads v.timeout += 3 60 1000; memcache.set(key, v, KEY_TIMEOUT 2); // load the latest value from db v = db.get(key); v.timeout = KEY_TIMEOUT; memcache.set(key, value, KEY_TIMEOUT 2); memcache.delete(key_mutex); } else { sleep(50); retry(); } }}

相对付方案一

优点:避免cache失落效时候大量要求获取不到mutex并进行sleep

缺陷:代码繁芜性增大,因此一样平常场合用方案一也已经足够。

方案二在Memcached FAQ中也有详细先容 How to prevent clobbering updates, stampeding requests,并且Brad还先容了用他其余一个得意的工具 Gearman 来实现单实例设置cache的方法,见 Cache miss stampedes,不过用Gearman来办理就觉得就有点奇技淫巧了。

附:本次Web2.0技能沙龙演讲主题:微博Cache设计谈,需下载请点击演讲稿下menu/download (需登录slideshare)。

微博cache设计谈 http://www.slideshare.net/iso1600/cache-4842490

标签:

相关文章

介绍百度码,技术革新背后的智慧之光

随着科技的飞速发展,互联网技术已经成为我们生活中不可或缺的一部分。而在这个信息爆炸的时代,如何快速、准确地获取信息,成为了人们关注...

Web前端 2025-01-03 阅读1 评论0

介绍皮箱密码,开启神秘之门的钥匙

皮箱,作为日常生活中常见的收纳工具,承载着我们的珍贵物品。面对紧闭的皮箱,许多人却束手无策。如何才能轻松打开皮箱呢?本文将为您揭秘...

Web前端 2025-01-03 阅读1 评论0

介绍盗号器,网络安全的隐忧与应对步骤

随着互联网的快速发展,网络安全问题日益突出。盗号器作为一种非法工具,对网民的个人信息安全构成了严重威胁。本文将深入剖析盗号器的原理...

Web前端 2025-01-03 阅读1 评论0