标签:维护 slow 空间 并行 依赖 查询 实践 常见问题 取数
LRU/LFU/FIFO算法剔除
超时剔除
主动更新
最佳实践
缓存穿透指查询一个根本不存在的数据,缓存层和存储层都不会命中,导致不存在的数据请求每次都要到存储层查询。
造成缓存穿透的基本原因有:
1.缓存空对象
当存储层不命中后,仍然将空对象保存到缓存层中,之后再访问这个数据将会从缓存中获取。
可能会引入的问题: - 空值缓存,需要更多的内存空间:针对这类数据设置一个较短的过期时间,让其自动剔除 - 不一致问题:存储层和数据层存在不一致。可用消息系统或其他方式清掉缓存中的空对象
2.布隆滤波器过滤
将存在的 key 用布隆滤波器提前保存起来,做第一层拦截。
“无底洞”现象:为了满足业务要求添加了大量新的节点,但是性能不但没有好转反而下降了。
原因:键值数据库通常采用哈希函数将 key 映射到各个节点上,造成key 的分布与业务无关,由于数据量和访问量的持续增长,造成需要添加大量节点做水平扩容,导致键值分布到更多节点上。批量操作通常需要从不同节点上获取,相当于单机批量操作只涉及一次网络操作,分布式批量操作会涉及多次网络时间。
假设批量获取n个字符串为例:
1.串行命令
逐次执行n个get命令,操作时间=n次网络时间+n次命令时间
2.串行IO
Smart客户端会保存 slot 和节点的对应关系,有了这两个数据可将属于同一个节点的 key 进行归档,得到每个节点的key子列表,之后对每个节点执行 mget 或 Pipeline 操作。操作时间=node次网络事件+n次命令时间。
3.并行IO
将上面串行IO的最后一步改为多线程执行,使用多线程网络事件变为O(1),操作时间变为:
max_slow(node网络事件) + n次命令时间
4.hash_tag实现
将多个 key 强制分配到一个节点上,操作时间=1次网络事件+n次命令时间
缓存雪崩:缓存层由于某些原因不能提供服务,于是所有请求都会达到存储层,存储层调用量暴增,造成存储层级联宕机的情况。
解决思路:
如果有两个问题同时出现:
在缓存失效瞬间,有大量线程重建缓存,造成后端负载加大,甚至可能会让应用崩溃。
解决思路:
两层意思:
标签:维护 slow 空间 并行 依赖 查询 实践 常见问题 取数
原文地址:http://www.cnblogs.com/yawen/p/7079471.html