其他
一文读懂高并发情况下的常见缓存问题
1.缓存处理流程
1.1 前台get请求,后台服务从缓存中获取数据
1.2 前台post/put请求来创建或修改数据,后台缓存处理流程
2.缓存穿透、缓存击穿、缓存雪崩
2.1 缓存穿透
缓存穿透是指缓存和数据库中都没有的数据。用户不断发起请求,caceh拦截不了,直接使用数据库查询数据,可能会对数据库性能造成影响。 图解
解决方法(1.设置key-value,value的值为null; 2.将用户请求拦截在上游)
2.2 缓存击穿
缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期)。由于用户特别多,同时去读取数据,引起数据库压力瞬间增大。 图解
解决方法(1.设置热点数据不过期;2.加互斥锁,附参考代码) Redis回收机制不会动没有设置有效期的数据。所以未设置过期时间的cache会长期有效。
# 伪代码
dict_lock = {'lock':'开'} # 设置初始锁状态
url = ['^RebbitMQ$'] # 任务消息队列路由设置
RebbitMQ = ['server1','server2', . . .] # 服务线程添加到queue中
def open_lock(view):
"""获取数据操作权限,关锁"""
dict_lock.get('lock') = '关'
return Response(0)
def close_lock(view):
"""数据使用完毕,释放资源"""
dict_lock.get('lock') = '开'
return Response(1)
# 队列先进先出
RebbitMQ.last.open_lock() # 队列最后一个元素操作数据
RebbitMQ.last.delete() # 数据操作完毕,删除这个元素
RebbitMQ.close_lock() # 释放资源
2.3 缓存雪崩
缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是,缓存击穿指的是并发地查询同一条数据,缓存雪崩是指不同数据都过期了,很多数据缓存拦截不了,从而查数据库。 图解(同缓存击穿) 解决方法 分布式cache(多台服务器,每台服务器都启动了一个或多个redis服务) 1.设置随机的过期时间,防止同一时间大量的数据过期现象
2.设置热点数据永不过期
3.使用分布式缓存,将热点数据均匀分布在不同的缓存数据库中。
作者:mtooooo 投稿
原文地址:https://juejin.im/post/5e9cfb8cf265da47cc029cd8
参考文章
5个方案告诉你:高并发环境下,先操作数据库还是先操作缓存? 缓存穿透、缓存击穿、缓存雪崩区别和解决方案 最全的Redis操作,看完这篇就够了
▼点击成为社区会员 喜欢就点个在看吧