Redis 是一个开源的高性能的 Key-Value 服务器。本篇主要介绍一下缓存的设计与优化。
1. 缓存的受益与成本
- | 说明 |
---|---|
缓存的受益 | 1、加速读写,通过缓存加速读写速度,例如 CPU L1/L2/L3 Cache、Linux page Cache 加速硬盘读写、浏览器缓存、Ehcache 缓存数据库结果; 2、降低后端负载,后端服务器通过前端缓存降低负载,业务端使用 Redis 降低后端 MySQL 负载等。 |
缓存的成本 | 1、数据不一致,缓存和数据层有时间窗口不一致,和更新策略有关; 2、代码维护成本增加,多了一层缓存逻辑; 3、运维成本增加。 |
缓存的使用场景:
- 降低后端负载,对高消耗的 SQL,例如 join 结果集/分组统计结果缓存;
- 加速请求响应,利用 Redis/Memcache 优化 IO 响应时间;
- 大量写合并为批量写,例如计数器先 Redis 累加再批量写 DB。
2.单线程架构
Redis 在一个同一时间点只会执行一条命令。
大多情况下,单线程是非常慢的。Redis 单线程架构为什么这么快?
- 主要原因:纯内存;
- 非阻塞 IO,Redis 使用 Event Loop 这样的模型作为 IO 多路复用的实现,并且 Redis 自身实现了一个事件处理,将 Event Loop 连接、读写、关闭转换为自身的一个事件,不再往 IO 上浪费过多时间;
- 避免线程切换和竞态消耗;
单线程架构要注意什么?
- 一次只运行一条命令;
- 拒绝长(慢)命令,例如 keys、flushall、flushdb、slow lua scrip、mutil/exec、operate big value(collection);
2.缓存更新策略
策略 | 说明 | 一致性 | 维护成本 |
---|---|---|---|
LRU/LFU/FIFO 算法剔除 | 例如 maxmemory-policy | 最差 | 低 |
超时剔除 | 例如 expire | 较差 | 低 |
主动更新 | 开发控制生命周期 | 强 | 高 |
两条建议:
低一致性:推荐最大内存和淘汰策略;
高一致性:推荐超时剔除和主动更新结合,超时剔除是给主动更新做了一个兜底,还需要最大内存和淘汰策略二次兜底。
3.缓存粒度控制
从 MySQL 获取用户信息:select * from user where id