Redis面试题收集
redis描述
redis是一个高性能key-value内存数据库,支持数据持久化,数据库主从和集群部署,支持多种数据类型
string ,hash,list,set ,sortset,hyperLoglog,BloomFilter
redis速度为何如此之快
- redis是基于内存的数据库,整体数据结构类似一个大的hashmap
- redis是单线程的不需要来回切换线程执行
- redis使用io多路复用技术 可以并发连接, 底层使用epoll非阻塞api
缓存雪崩和缓存击穿
大量key同事失效 造成redis阻塞
查询不存在的key 后端请求全部查询数据库
redis基本数据类型 优缺点
String 结构 动态字符串 类型转换 数字转换,embstr(减少一次内存分配释放) redisObject对象分离 raw格式.通过提前分配冗余内存的方式减少内存频繁分配,可以动态扩容
Hash :hashmap的结构 存储对象使用内存较少 使用场景不多
list : 双向链表 结构
set: hashmap
sortset : 跳跃表
hyperloglog: 去重统计 通过存储数据基数减少 数据存储空间占用
blomfilter: 使用hash值 三次hash 相同可能存在 不存在 就是真的不存在
redis分布式锁
set key value ex time nx
// 锁的超时续期, 重试, 和 释放 锁使用lua脚本 比较然后释放
redlock设计
redis key 过期策略
定期清除
惰性清除
redisObject
保存的信息 : 对象类型 格式 引用计数 引用计数为0的对象将会被清除
Redis 提供 6 种数据淘汰策略:
volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据
redis 数据持久化方式
rdb快照 和aof命令存储
rdb同步块 ,存在数据丢失
aof 同步慢 数据不丢失
高版本采用aof+rdb的方式持久化
redis主从同步
主节点做一次bgsave 先同步快照,然后同步aof命令
redis key查询 命令 keys * 容易发生redis阻塞 使用scan 0 match newes* count 10 命令
scan命令查询出的数据会有重复 需要客户端去重处理
redis集群数据同步
使用hash槽数据分片, 先查询key所在节点信息 使用客户端重定向到正确的节点
数据rehash的过程也是需要迁移对应的hash槽即可