memcache 缓存穿透的问题

来源:互联网 发布:小猪熊网络 编辑:程序博客网 时间:2024/05/21 21:34

首先先了解下分布式锁先看这个链接

http://blog.csdn.net/lihao21/article/details/49104695

后续我会再把zookeeper的分布式锁总结下


缓存指的就是memache,我们为了加快访问速度,会经常在memache存放大量数据吧。这些数据我们都会设置个有效期的。应用程序会有访问高峰期的,比如在高峰期之前,memache大量数据早就自动销毁了,高峰期来的时候,这时会大量的缓存穿透,传统型db性能很弱的,并发高了容易挂掉。


发生缓存穿透的时候,我们先不做数据加载操作,为了保证整个流程,我们会判断如果从缓存获取为空,就枷锁获取到后释放锁返回,其他线程执行相同操作等待等待。然后再执行db加载到缓存操作。


高并发时候,对加载某个数据会同时发起多次相同的操作,比如加载a 有100次,b有200次,c有500次。这些操作都是重复的,但数据库受不了呀。为了保证db的性能和顺利加载,我们会加一个锁定,锁定就是去除相同的操作,比如给a数据加个锁定,其它重复加载a的操作就跳多了。比如:redis.setnx( ‘a’, 1, 3 * 60) 


举个例子:


比如每晚8点,视频网站发布《孤芳不自赏》这个电视剧,发布之前,孤芳数据在缓存中是没有的。
在8点左右的时候,会有成千上万的用户同时访问《孤芳》媒资数据。然而单次从数据加载可能时间比较长,而且同时会有好多次相同的查询《孤芳》操作,这时候我们把《孤芳》这个查询操作进行锁定,其它相同的操作跳过,这样就保持了数据库的稳定


 简单点的说:
热点数据,发生缓存穿透时候,会产生高频率的相同的数据库查询加载操作。我们通过redis.setnx给热点数据加个锁,这个锁就是为了过滤掉相同的查询操作,从而保证了数据库的稳定。 






菜鸟永远在努力中





0 0
原创粉丝点击