redis缓存设计及经常使用问题node
缓存的收益与成本分析 缓存更新策略的选择以及使用场景 缓存粒度控制法 穿透问题优化 无底洞问题优化 雪崩问题优化 热点key重建优化 收益与成本redis
收益编程
加速读写后端
下降后端负载 成本数组
数据不一致性缓存
代码维护成本网络
运维成本 缓存更新策略多线程
lru,ttl,random,allkey-lru,allkey-random,no-enviction(内存达到最大值时的缓存策略) 2.超时删除 (设定过时时间) 3.主动更新(用于数据一致性较高) 缓存粒度架构
所有数据缓存以及部分数据缓存的选择运维
思考缓存粒度从几个维度考虑: 数据通用性,空间占用比,代码维护性 一般缓存所有数据 通用性好,代码维护简单,可是空间占用大,而缓存部分数据则相反 穿透问题
缘由:cache miss 后直接请求后端服务,常发生在业务代码异常,或者大量恶意攻击致使的
解决方法:
用途:快速查询一个元素是否在一个集合中
入参:失败率,集合个数
原理:用k个hash函数将结果存在一个位数组中,检查的时候对比每个位上是不是1 若是全是的话 则说明命中
说明:结果在,有可能不在 结果不在,则必定不在 无底洞问题
表现:集群增长节点依然性能不佳。耗时有可能还有增长
缘由:客户端使用mget之类批量获取key的命令时候,会致使更多的io请求。在redis cluster中 key是分布在各个slot中,批量操做的话会增长更多的网络io
解决方式:
相同节点key 合并。总时间 = node + n次命令时间
redis 强制将这些key 写入同一个slot中
性能比较
表现:在缓存层中服务不可以使用,致使后端服务负载太高,出现宕机的状况
解决办法:
表现:一般 缓存key+过时时间,能保证绝大部分需求,可是有2种状况下,这样的作法会引发性能问题
缘由。热点key中 会有大量的线程尝试重建缓存,致使后端负载过大,甚至引发宕机 解决方式: