目录
1.数据类型
数据类型 | 样例解释 | 优缺点 | 操作 | 应用场景 |
---|---|---|---|---|
string | key:value | 简单 | set、get、del expire incr、decr |
最常用 分布式锁 |
hash | bigkey: {subKey:subval,subkey2:...} |
避免了命名冲突, 可统一删除 (过大时不宜, 应scan迭代删除) 过期时间针对bigkey, 不能对subkey设置过期 |
hset hget hscan |
|
set | 无重复数据的集合 |
可求交集并集差集 | sadd |
可用作抽奖,存放点赞的人 实现共同关注的人,可能认识的人等功能 |
zset | 有序的无重复数据集合 | 可以用在时事热点信息的排序上 | ||
list | 列表 | 用于消息列表 |
2.memcached VS redis 对比
memcache适合以KV类型,数据量、并发业务量大的场景,支持多线程操作,充分利用CPU,但缓存不能持久化
Redis拥有丰富的数据类型,支持缓存持久化,宕机更容易数据恢复,单线程场景比memcache快
3.部署模式
单机 | 可用性差 | 适用于可以接受缓存穿透的场景 |
---|---|---|
哨兵 | 可用性高 提供了主从的监控,当主节点宕机,从节点快速切换成主, |
适合缓存高可用场景,缺点是不易扩容 |
集群 | 横向扩展-负载均衡 | 适合大数据量的高可用缓存场景,集群模式内存和QPS不受限于单机 通信采用gossip协议,请求逐步打到各个节点上,有一定延迟,但集群压力比较小 |
4.持久化
用于宕机恢复
类型 | 备份内容 | 恢复方式 |
---|---|---|
AOF | (oplog)操作日志 几乎实时备份命令,通常设置1秒备份一次 |
通过记录命令 重复执行进行恢复数据, 效率较低, 但数据比较全 |
RDB | 数据快照(snapshot)快照 每隔一段时间用子线程进行全量备份 |
直接数据的传输覆盖, 数据不全 |
5.过期策略expire
内存与CPU的权衡
策略 | 优点 | 缺点 | |
---|---|---|---|
定时删除 | 到key过期时间立即删除 | 保证内存尽快释放, 保证过期的准时性 |
消耗CPU时间 若过期key很多,删除这些key会比较消耗CPU时间 每设置一个过期时间会创建一个定时器,大量定时器会比较影响性能 |
定期删除 | 定期时间到了会检查key是否过期,过期则删除 | 通过限制删除操作的时长和频率, 来减少对CPU时间的占用 |
会造成一定的内存占用 |
惰性删除 | 再次通过key来获取值的时候,会检查key是否过期,过期则删除 | 删除操作只发生在通过key取值的时候,占用CPU较少 | 更占用内存,若大量数据缓存而不再调用,可能导致内存溢出 |
6.淘汰策略(内存达到阈值)
策略 | 算法 |
---|---|
volatile-lru | 从expire的数据集中挑选最近最少使用的数据淘汰 |
volatile-ttl | 从expire的数据集中挑选将要过期的数据淘汰 |
volatile-random | 从expire的数据集中任意选择数据淘汰 |
allkeys-lru | 从所有key挑选最近最少使用淘汰 |
allkeys-random | 从所有key任意选择数据淘汰 |
no-enviction | 不淘汰数据 |
7.常见术语
术语 | 现象解释 | 解决方案 |
---|---|---|
缓存穿透 | 缓存不命中, 请求越过缓存访问数据库,导致数据库崩掉 |
缓存不存在时,数据库返回null值也存入缓存, 之后直接通过缓存返回null的处理办法 |
缓存雪崩 | 大量缓存在同一时间失效, 请求都打到数据库,导致数据库崩掉 |
加锁或队列(并发控制),缓存失效,对某个key只允许一条线程访问,其它等待 失效时间设置不同,可以在一个时间范围乘个随机数,尽量分布均匀 加二级缓存,二级缓存失效时间大于一级缓存,一级缓存失效,二级可以起到作用 手动reload如果能预计到某个时间点会有大量并发操作,可以设计手动reload缓存 |
缓存预热 | 系统启动时对热点数据进行缓存主动加载 |