基础篇
数据类型
String:原子操作加减Hash:存储商品的各属性ZSet:延时队列Set:可以存储用户点赞收藏的帖子List:有序集合,底层实现为双向链表Bitmap:布隆过滤器Hyperloglog:统计页面访问量
使用场景
- 缓存、限流
- 接口幂等(setnx)
- 分布式锁(setnx+expire)
缓存一致性
延时双删:
public void update(Data data) {
redis.del(data.id); // 1. 先删缓存
mysql.update(data); // 2. 更新数据库
Thread.sleep(500); // 3. 可采用mq
redis.del(data.id); // 4. 再删一次缓存
}
持久化策略
Redis 提供了三种持久化机制:RDB 、 AOF、以及两者混合持久化机制,这三者都是开启子线程进行持久化不会影响主线程操作
RDB:在指定的时间间隔内将内存中的数据写入dump.rdb文件中AOF:将写操作命令写入appendonly.aof文件中,重启redis时会执行aof文件中的命令来恢复数据,aof是先执行命令,后写日志,只记录执行成功的命令,避免出现记录错误命令的情况
数据淘汰策略
- 惰性删除:每次访问键时,判断是否已过期,如果已过期则将其删除
- 主动删除:当内存使用达到设置的最大限制时,会促发内存回收机制,删除策略包括:删除最近最少使用的(
LRU)、存活时间最少的键(TTL)
架构篇
主从复制
1主 + N 从,只有主节点写入,有故障要手动切换
哨兵模式
在主从复制的基础上加了“监控员”,主节点有故障会手动切换,仍然只有主节点写入
集群模式
- 多主多从,主节点有故障会自动从 从节点选出新的主节点
-
每个实例存储部分数据,每个实例之间数据是不重复的,整个reids集群把键空间分成16384个槽slot位,每个redis实例负责一定范围的哈希槽,数据的key 经过哈希函数计算后 对16384取余即可得到槽位号 进而定位到对应的redis节点
-
redis集群中每个节点之间都会保存完整的拓扑信息,包括每个节点的id、ip地址、端口、负责的哈希槽范围