Redis
数据结构
string
-
二进制安全,可以存储任何数据
- Sesion
- 访问次数-incr
- 长期存在,修改并不频繁
- 限制IP次数
hash
-
适合对象存储
- 购物车,id field,value
list
-
链表数据结构
- lrange可以进行分页
- 消息队列的简单应用
set
-
hastTab的一种实现,无序不重复
- 唯一性统计,例如共同好友等
zset
-
set增加一个权重,有序不重复
- 排行榜
持久化
RBD
-
生成快照的方式进行存储
-
优点
- 文件紧凑,方便存储
- 性能优,在保存文件时fork子进程进行处理
-
缺点
- 对数据完整度较高不适用
- 在数据集非常庞大时,fork可能会比较耗时
-
AOF
-
记录每次写指令
-
优点
- fsync策略可以自己设置,数据完整度保存较好
- 对AOF文件写入不需要seek,同时只要aof文件存在,重写都可以还原。
- AOF文件过大,可以自动在后台对aof文件重写
-
缺点
- AOF文件通常大于Rdb
- 性能相对较差
- 恢复速度相对较慢
-
增量和全量
- sync/psync
集群
主从
-
优点
- 避免Redis单点故障
- 构建读写分离架构,满足读多写少的应用场景
-
缺点
- 数据一致性,复制数据的效率
- 容错/恢复,维护过程需要人为
- master 单点性能瓶颈
哨兵
-
优点
- 主从的升级版,提供了可用性和性能,能自动进行故障恢复
- 哨兵的存在可以及时发现系统问题
-
缺点
- 增加了系统复杂度,需要同时维护哨兵
- master节点故障的恢复时间长
- master单节点写瓶颈
cluster
-
优点
- 无中心,数据分片
- 动态扩展能力
-
缺点
- 数据一致性
- slave的使用,没有释放master的读压力
缓存问题
缓存穿透
-
用户的请求的数据没命中缓存同时DB也不存在,每次返回nil
- 设置AUTH拦截
- 设置Jey-nil每次返回空拦截
- 布隆过滤器
缓存击穿
-
用户请求的数据没有命中缓存,每次在DB中查询
- 热点数据的过期时间管理
- 设置锁机制,第一次读取DB后,存储在缓存。其他人等待读取缓存
缓存雪崩
-
同一时期,大批数据到过期时间,查询数据巨大,从而导致DB压力过大甚至宕机
- 数据设置随机过期时间
- 将热点数据分布在不同物理机
- 互斥锁,类似穿透
- 双层缓存机制
缓存预热
- 系统上线后,将相关的缓存数据直接加载到缓存系统,这样就可以避免在用户请求的时候
内存淘汰机制
noeviction
- 默认机制,写操作直接报错,不进行淘汰
allkeys-lru
-
最近最少使用,从所有的KEY中进行LRU算法淘汰
-
Redis中LRU类似随机,应随便选取5个KEY,从里面淘汰掉最近最少使用的key
- 可以通过设置maxmemory-samples调整取样数量
- Redis实现LRU设置了一个24bit的字段来存储最后一次访问KEY的时间
- Redis3.0进行优化,池中的数据根据访问时间进行排序,第一次随机选取的key都会放入池中,随后每次随机选取的key只有在访问时间小于池中最小的时间才会放入池中,直到候选池被放满。当放满后,如果有新的key需要放入,则将池中最后访问时间最大(最近被访问)的移除
-
volatile-lru
- 从设置了过期时间的EKY进行LRU算法淘汰
allkeys-random
- 随机淘汰,从所有KEY随机淘汰
volatile-random
- 随机淘汰,从设置了过期时间的KEY随机淘汰
volatile-ttl
- 生存周期,根据过期时间淘汰,越早过期的越早淘汰。
allkeys-lfu
-
最少使用频率,从所有KEY中进行LFU算法淘汰
- Redis4.0新加的一种淘汰机制。
volatile-lfu
- 最少使用频率,从设置了过期时间的KEY中进行LFU算法淘汰
事务
redis支持事务
- multi
- 开启一个事务,每条指令都有server缓冲,保持原子性,谁出错谁负责原理。不支持回滚
- pipeline
- 开启一个通道,利用client缓冲,没有原子性