八股文_常规_redis

162 阅读2分钟

基础篇

数据类型

  • 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 从,只有主节点写入,有故障要手动切换

哨兵模式

在主从复制的基础上加了“监控员”,主节点有故障会手动切换,仍然只有主节点写入

1.png

集群模式

  • 多主多从,主节点有故障会自动从 从节点选出新的主节点
  • 每个实例存储部分数据,每个实例之间数据是不重复的,整个reids集群把键空间分成16384个槽slot位,每个redis实例负责一定范围的哈希槽,数据的key 经过哈希函数计算后 对16384取余即可得到槽位号 进而定位到对应的redis节点

  • redis集群中每个节点之间都会保存完整的拓扑信息,包括每个节点的id、ip地址、端口、负责的哈希槽范围