Redis

3/13/2022 server

# redis淘汰策略

查看答案
  • noeviction:Redis 默认淘汰策略,对于写请求不再提供服务,直接返回错误
  • allkeys-lru:从所有 key 中使用 LRU 算法进行淘汰
  • volatile-lru:从设置了过期时间的 key 中使用 LRU 算法进行淘汰
  • allkeys-random:从所有 key 中随机淘汰数据
  • volatile-random:从设置了过期时间的 key 中随机淘汰
  • volatile-ttl:从设置了过期时间的 key 中,根据 key 的过期时间进行淘汰,越早过期的越优先被淘汰

# redis基础类型

查看答案
  • string:缓存,计数器
  • hash:缓存
  • list:消息队列,分页
  • set:集合计算
  • sortset:有序数组,排序

# redis高级类型

查看答案
  • bitmap:辅助实现布隆过滤器
  • hyperloglog:计数器
  • geospatial:地理位置信息

# redis持久化

查看答案
  • aof追加持久化
  • rdb全量持久化
  • 工作中会两个都使用

# key失效机制

查看答案

定期主动删除,被动触发删除,淘汰机制

# 缓存穿透

查看答案
  1. 通过查询不合法的数据打入数据库
  2. 解决办法合法性校验
  3. 不合法数据也会被缓存

# 缓存击穿

查看答案
  1. key过期时请求打入数据库
  2. 多key存储
  3. 永不过期

# 缓存雪崩

查看答案
  1. 多数key都过期了打入数据库
  2. 多key存储
  3. 随机过期时间
  4. 永不过期

# 缓存预热

查看答案

上线前主动推送数据到缓存中

# redis使用单线程还是多线程?

查看答案
  • redis是单线程的
  • redis的瓶颈是网络带宽
  • redis不需要线程切换
  • redis不需要锁
  • redis会独立io线程处理连接

# redis有多少个库

查看答案

redis有16个库

# Redis怎么去重

查看答案
  • 基于set,本质是hash
  • 基于bit,本质是hash
  • 基于HyperLogLog,本质是3中hash和bitmap

# redis 字典底层

查看答案
  • redis的字典底层是典型的hashtable,冲突用链表记录
  • 当hashtable扩容是,系统会遵循访问哪个值迁移哪个值,缓慢迁移

# redis事务

查看答案

redis的事务本质是将redis命令放入队列,然后顺序执行队列,中途会被打断,但是已经执行的任务不会回滚
Watch可以监视key是否被修改,如果被修改事务会被打断

# redis集群方案

查看答案

# 主从模式

  • 主从存量+偏移量

# 哨兵模式

  • 集群监控 :负责监控master和slave进程是否正常工作
  • 消息通知 :发现故障会报告给管理员
  • 故障转义 :发现节点挂掉会自动转义到slave节点
  • 配置中心 :故障转移时会通知客户端更新master地址
  • 至少三个节点

# cluster模式

  • 通过使用CRC16算法计算出散列值,然后取对16384的余数即为这个键的槽位。
  • 3.0版本开始支持的
  • 每个节点互为主从
  • 先写主再写从
  • 扩容会把就节点数据转移到新节点
  • 6379端口对外提供服务
  • 16379时节点和节点之间同步数据
  • 不支持批量操作

# sharding

  • 客户端分配节点

# redis分布式锁

查看答案

# 保证操作原子性

  • setnx+setex 当key不存在就会设置成功
  • set(key,val,nx,px)高版本

# 操作时间比过期时间长

  • 使用看门狗自动续期

# 第一个操作把第二个锁删除

  • value做自己的标识,然后再删除锁,使用lua脚本实现

# 红锁

  • 向多个服务器申请锁
  • 在锁过期时间之前申请到多数锁
  • 确认锁

# redis实现消息队列的三种模式

查看答案
  • 基于list rpush Lpop
  • 发布订阅模型
  • Redis Stream

# 压缩列表?

查看答案
  1. 主节点
- zlbytes:记录整个压缩列表占用的内存字节数。
- zltail:记录压缩列表表尾节点距离压缩列表起始地址有多少字节。
- zllen:记录了压缩列表包含的节点数量。
- entryN:压缩列表的节点,节点长度由节点保存的内容决定。
- zlend:特殊值0xFF(十进制255),用于标记压缩列表的末端。
  1. 数据节点
- previous_entry_length:记录压缩列表中前一个节点的长度。previous_entry_length属性的长度可以是1字节或者5字节:如果前一节点的长度小于 254 字节,那么previous_entry_length属性的长度为1字节,前一节点的长度就保存在这一个字节里面。如果前一节点的长度大于等于254字节,那么previous_entry_length属性的长度为5字节,其中属性的第一字节会被设置为0xFE(十进制值 254),而之后的四个字节则用于保存前一节点的长度。因为节点的previous_entry_length属性记录了前一个节点的长度,所以程序可以通过指针运算,根据当前节点的起始地址来计算出前一个节点的起始地址,缩列表的从表尾向表头遍历操作就是使用这一原理实现的。
- encoding:记录节点的contents属性所保存数据的类型以及长度。分两种情况:(1)一字节、两字节或者五字节长,值的最高位为00 、01或者10的是字节数组编码,这种编码表示节点的content属性保存着字节数组,数组的长度由编码除去最高两位之后的其他位记录;(2)一字节长,值的最高位以11开头的是整数编码,这种编码表示节点的content属性保存着整数值,整数值的类型和长度由编码除去最高两位之后的其他位记录。
- contents:保存节点的值,可以是一个字节数组或整数,类型和长度由节点的'encoding'属性决定。

# set中随机取数字命令

查看答案

RANDOMKEY

更新时间: 2022-03-30 12:42