剑客
关注科技互联网

如何提高缓存命中率

1. 产品场景分析,多用户访问统一同一数据,命中率就高,个性化信息命中就低,在就做好分布式,高可扩展,例如一致性哈西 – 秋夕

2. 应该是获得缓存数据的次数/访问缓存的次数 – 吴 仕佳

3. 缓存命中率只有memcache,lru机制才会有这样命中率的问题 – 林志勇

4. 我觉得像通过正则的方式进行的web服务器类的缓存才有命中率的问题吧。 – 如末

5. 从其他方面考虑吧…… 比如一个资源刚被修改过,缓存被删除 当时请求 就不命中缓存

提高命中率就是 删除缓存后 立马写缓存 – Nemo

6. 这就不是命中了,这是失败

命中是缓存有,但是有概率性的取不到 – 如末

7. 命中率就这么算的… get到 +1次 get不到总数+1  – Nemo

8. 缓存肯定有命中率的,基本也都是热数据被缓存 – 宋明明

9. 缓存的命中率(查询数据的次数/查询的总数)*100%  大系统40-50可以了,70-80优秀了。[微笑] – 王谷峰

10. 看看 memcache LRU 机制 以及 slab chunk 的内存原来就知道

为什么有命中率的问题了

内存分配机制 – 林志勇

11. LRU老数据被T现象,某个值过去后,并没有从内存中删除,只是看不到这个数据而已.  还有根据访问来计算热度吧。 – 王谷峰

12. 一般来说,数据粒度越小,命中率越高,但是头几次使用时非常慢,需要配合预加载 – tiyee

13. [转]memcached提高命中率,memcached server LRU 深入分析 http://breezylee.iteye.com/blog/2101605 – hello2t

14. 数据的缓存生成和修改 你们是怎么控制 比如在需要的地方硬编码处理 还是单独做一个类 在入口的地方拦截通过配置来处理 – Lee. Li

回: 我们开始的时候是放在增删该查里,后来老改动,代码一团糟,缓存加到任务队列里操作的 – tiyee

回: 理想的缓存是面向切面的。任何一种资源在被获取之前 在被获取之后,均该实现缓存的读取,写入逻辑。 – Nemo

回: 要做的就是封装… 可直接让对象类实现切面方法。也可以通过专门的切面管理类做切面管理。我之前写过一个aop框架..对象都是要通过工厂生成,开发时没有代码提示,不友好……我自己都不用了…. 不过 实现的功能还挺有意思的.. 任何对象 任何方法 都可以配置切面方法。但是要求开发人员转变普通开发思路… 比如 新建文章,只写文章表,用户的文章数+1要用切面来实现。  – Nemo

回: 正常思路就是 插入文章表 update文章数。。 然后 删除的时候 在-1 换成aop就爽多了 哈哈 – Nemo

回: 这种思路,写时爽,业务不断边跟就烦死了 – tiyee

回: 业务不断变 才爽呢  – Nemo

回:  硬变成 量少无所谓多了 不好管理 –  Lee. Li

回:  也不方便水平扩展 -tiyee

回:  aop + filter 应付变化的 王道

为何不能水平扩展?

我打算做一个基于aop message filter 的界面化代码生成工具…. 有感兴趣的么

适用于我这5年多工作的绝大部分场景  – Nemo

回: 切面 分前置和后置 应该也可以在里面加加入自定义方法去处理特殊的业务变更

在前后方法里自定义 – Lee. Li

回: 用过类似东西,后来烦死了,改任务队列了 – tiyee

回: 任务队列 可以处理 有点野路子感觉 :joy: – Lee. Li

回: 因为我们还有个场景,别的组同事要双写,多写redis或ceche,不用队列不方便

回: tiyee 你的那个双写与否,跟是否用aop其实是没有任何冲突的~~

https://github.com/wclssdn/PHP-AOP-Framework

当时的php版本,在魔术方法上的性能略低啊… 所以,用于生产的话,不太合适. 也就放弃更新了…

思路是使用统一的切面管理类做切面管理. 方法调用时候,通过切面管理类去做切面配置查找执行. – Nemo

回: 切面要用的爽,就要把握好需求方向。方向把握不好越切越乱,一般都在非功能性需求上用切面,比如日志、安全方面,我们正常需要一般都不用,越用越乱 – 上吊de鱼

15. 现在业务角度讲,命中率低,很可能是你的item分得不够细,颗粒度太大,再分拆呗 – 学在囧途

16. 命中低的话,除了被动缓存,再做一个主动缓存,小于主key的过期时间,定时去更新,保证缓存一直存在 – 青衫隐_刘

回: 这种做法在key复杂和多的时候很难实现 适用于公共使用的

不然构造会很麻烦,然后数量多,更新时间长 所以还是看业务场景 – 学在囧途

回: 学总说的是,比如商品就没法做

我现在商品是被动缓存,库存和售卖时间都是异步获取 – 青衫隐_刘

17. 缓存命中率太低,有可能是滥用缓存造成的。要具体问题具体分析。 – 李三

18. 缓存命中率低,那是说写频繁读不频繁么,如果读操作太耗资源,那写库的时候同步或者队列更新缓存了 – shawnvan

回: @shawnvan 命中率不是读写频繁与否的问题。。。你先搞清楚问题的意思。

你不会是说数据库的查询缓存吧?根本不在一个频道上。 – 李三

19. 我们目前的做法是主动清除,提高缓存的正确率 – 沈括号

20. 尽量降低缓存粒度 – tofuliang

21. 我建议大家读一读facebook关于缓存的那篇论文,理解一下缓存的存储模型。比如,为什么为了一致性,缓存几乎只存在两种操作,add和delete, replace和update会带来什么问题。

关于缓存命中率上,业务上一定要符合缓存的假设:如果访问了某一个资源,那么接下来很有可能会再次访问,也就是局部性原理。如果业务本身不符合的,用缓存没有太大的意义。另外一个现实的问题是,如果你的流量有高峰期,当从低峰期突然进入高峰期时,可能会面临缓存穿透,流量直接打到数据库上,对服务造成影响。这个可以根据情况作适当的预热,防止此类情况 – 廖强

22. 缓存无底洞问题解析 http://carlosfu.iteye.com/blog/2263813 – kdrol.li

回: @kdrol.li 你分享的这个文章里面讲得不对,现在基本都是异步io,不会说一个一个的同步拿数据。 – 廖强

23. 缓存某一时的失效,流量高的话,是不是也会好多走到数据库,这个你们怎么预防的  – 尹少爷

回: 定时去执行脚本,更新缓存 – M4tou

回: 高峰期可预测的话,就延长过期时间

现在一般遇到都是热点key问题比较多 – 一席

回: 让一个进程穿透更新  – sky

回: 这种的话,系统容量要有一定的富足,系统或者数据库这边有过载保护 – 廖强

回: 可以用加锁的机制避免缓存过期引起的惊群现象 – 海中金

回: 嗯,lock也是一种不错的方法 – 廖强

回: 高并发下还加锁,看你是什么数据了 – 一席

24. Memcache mutex设计模式 http://timyang.net/programming/memcache-mutex/ – 廖强

25. 同学们,用缓存,且仔细分析过自己缓存内容都是什么,都有多大size的,举个手?

不清楚自己每次缓存内容的具体size,不做详细分析,谈提高,是扯蛋

反问1:缓存需要更新吗?

反问2:缓存的空间(内存最好)是无限的吗?

如果是个死尸,你每次开馆,它都是那个球样。

能理解吗?

再既定环境下,你每次打开箱子,薛定谔的猫都还是那个球样。命中率是¹º‰,除非你把他憋死,或者饿死,或者毒死,或者。。。

是你需要的那份缓存数据是否还存在。

因为这个时候可能有几万只几十万几百万甚至几千万上亿兆京秭亥只猫或者干尸,可是你可能最多只有一百万个箱子。

26.  ,应该就是看业务特点

例如大部分游戏开发一段时间后活跃用户就那些,命中就大

刚开服那天全是新用户,命中就低 – 九命猫

【分享链接】

1. 以前同事的分享中提到过:实际生产环境中可能出现的问题:PHP Warning:  Unknown: Failed to write session data (memcached). Please verify that the current setting of session.save_path is correct (xx.xxx.xx.xxxx:xxxxx,xx.xxx.xx.xxxx:xxxx) in Unknown on line 0推荐的解决方法         @all。今天对线上的命中率偏低,进行了分析,发现大量的add/delete memc.sess.key.lock.$PHPSESSID.  看了看php_memcached.so的源码。原来是session_start()时,session访问mc都会加执行先执行add,等session访问mc结束时。又会delete。建意把session.auto_start关闭。参看文章:
http://breezylee.iteye.com/blog/2101605.
http://blog.libnav.com/php/307.html – HQ数字卡

2. 微信朋友圈技术之道:三个人的后台团队与每日十亿的发布量 http://mp.weixin.qq.com/s?__biz=MjM5MDE0Mjc4MA==&mid=401735823&idx=1&sn=7a4df58c22d9d3145e0692dd580f6a3d – Xiangz

3. 移动化机会_陈明_微信朋友圈技术之道 http://wenku.it168.com/d_001634122.shtml

http://www.infoq.com/cn/presentations/technology-of-weixin-moments – 学在囧途

4. 作为一个程序员,进步完全取决于自己 http://mp.weixin.qq.com/s?__biz=MjM5NTg2NTU0Ng==&mid=404174728&idx=2&sn=69d9d43880b6a053c60cec9cd1e275c6 – 黑夜路人

5. 最近研究php7扩展   这个文档写得还不错   https://github.com/beberlei/whitewashing.de/blob/master/drafts/porting_extension_to_php7.rst – :bus: xH :dash:

6. #经验# php-fpm的max_chindren的一些误区 http://mp.weixin.qq.com/s?__biz=MzI0MjEwMDMzNQ==&mid=402098160&idx=1&sn=2e5680eff51c134c77b9b2e578e236ed – 乔楚

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址