Redis 缓存设计

1. 缓存的优势和缺点

1.1. 优势

(1)加速读写 : 针对存储层通常读写性能不够强悍。
(2)降低后端负载

1.2 缺点

(1)数据不一致:缓存和存储层的数据存在着一定时间串口的不一致。

2. 缓存更新策略

2.1 LRU/FIFO 算法剔除

缓存的使用量超过了最大值的时候触发。根据maxmemory-policy 配置。

2.2 超时剔除

给缓存设置过期时间,当过期后自动删除。

2.3 主动更新

利用消息或者其他方式通知缓存更新。

4. 穿透优化

(1)缓存穿透是查询一个根本不存在的数据,缓存和存储测都不会命中。缓存穿透会导致不存在的数据每次请求都要到存储层去查询,失去了缓存保护后端存储的意义。
(2)解决方案:缓存空对象,设置一个标志位flag, 数据库为空,flag=true。

5. 无底洞优化

5.1 无底洞原因

大量节点(facebook 2010年达到3000个memcache)导致批量操作需要从很多不同节点上获取数据,网络时间消耗太大

5.2 解决方案

5.2.1 串行命令

耗时= n 次网络时间 + n 次命令时间 , 网络次数是n

5.2.2 串行IO

(1) 耗时 = n 次网络时间 + n 次命令时间,网络次数是节点数。
(2)使用jedis 客户端api 实现逻辑:使用CRC16 本地计算出每个key的slot;通过jedisCluster本地slot-> node 的映射获取slot 对应的node。这样可以得到key --> node 的对应关系。
(3)针对每个node 的 key的集合使用mget或者pipeline 操作。

5.2.3 并行IO

(1)网络耗时: max_slow(node 网络时间) + n 次命令时间, 耗时取决于最慢的节点。
(2)将5.2.3 方案中的第三步改为多线程

你可能感兴趣的:(Redis)