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失效机制
查看答案
定期主动删除,被动触发删除,淘汰机制
# 缓存穿透
查看答案
- 通过查询不合法的数据打入数据库
- 解决办法合法性校验
- 不合法数据也会被缓存
# 缓存击穿
查看答案
- key过期时请求打入数据库
- 多key存储
- 永不过期
# 缓存雪崩
查看答案
- 多数key都过期了打入数据库
- 多key存储
- 随机过期时间
- 永不过期
# 缓存预热
查看答案
上线前主动推送数据到缓存中
# 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
# 压缩列表?
查看答案
- 主节点
- zlbytes:记录整个压缩列表占用的内存字节数。
- zltail:记录压缩列表表尾节点距离压缩列表起始地址有多少字节。
- zllen:记录了压缩列表包含的节点数量。
- entryN:压缩列表的节点,节点长度由节点保存的内容决定。
- zlend:特殊值0xFF(十进制255),用于标记压缩列表的末端。
- 数据节点
- 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