【自我学习1】使用REDIS解决高并发时常遇到的问题。

参数传入对象主键ID根据key从缓存中获取对象
如果对象不为空,直接返回
如果对象为空,进行数据库查询
如果从数据库查询出的对象不为空,则放入缓存(设定过期时间)

REDIS缓存穿透:
问题现象:如果传入的参数为-1,会是怎么样?这个-1,就是一定不存在的对象。就会每次都去查询数据库,而每次查询都是空,每次又都不会进行缓存。假如有恶意攻击,就可以利用这个漏洞,对数据库造成压力,甚至压垮数据库。即便是采用UUID,也是很容易找到一个不存在的KEY,进行攻击。

解决方法:查询对象为空,也当做是有值,放入缓存中(只不过这个过期时间设置短一点)

REDIS缓存雪崩:
问题现象:某个时间,缓存集中过期失效。

解决方法:正对不通分类产品,缓存不同周期,再加上随机因子,可以节省内存资源的情况下,可以缓解这种现象

REDIS缓存击穿:
问题现象:指一个Key非常热,不停地扛着巨大的并发,大并发集中对于这个点进行访问,当这个Key失效的瞬间,持续的高并发就能穿破缓存,直接请求数据库,相当于戴森球有个洞。

解决方法:粗略简单的方法,就是将主打商品缓存永不过期,只要机能够用内存换取安宁,大道至简。

使用互斥锁(mutex key):
业界比较常用的做法,是使用mutex。
在缓存失效的时候(判断拿出来的值为空),不是立即去load db,
而是先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一个mutex key
当操作返回成功时,再进行load db的操作并回设缓存
否则,就重试整个get缓存的方法。

posted @ 2020-12-10 15:52  滴滴的爸爸  阅读(125)  评论(0编辑  收藏  举报