Redis复习
2021-04-05 23:38:35 0 举报
AI智能生成
参考数据: Redis深度历险核心原理与应用实践 Redis设计与实现
作者其他创作
大纲/内容
常用指令
expire
setex
setnx
exists
del
常见应用
分布式锁
set key true ex 5 nx
超时问题
RedisLockRegistry
双重加锁
获取不到锁就等待100毫秒继续重试
60s过期时间
Redlock
加锁时向过半的节点发送nx和ex的原子命令
删除时向所有节点发送del命令
队列
位图
hyperLogLog
pfadd
pfcount
布隆过滤器
限流
简单限流
漏斗限流
初始化参数
漏斗容量
漏嘴流水速率
剩余容量
上一次漏水时间
算法流程
1、根据当前时间和上一次漏水时间算出从上次漏水时间到现在漏斗空闲出多少空间
2、如果时间差间隔太短,生成一个单位的空间则跳到第4步,否则跳到第3步
3、更新剩余容量,不能大于漏斗容量
4、剩余容量>0,放行请求,剩余容量减1
令牌桶限流
初始化参数
令牌桶容量
令牌桶剩余容量
下一个令牌发放的时间next
发放令牌的间隔
算法流程
1、当前时间小于下一令牌发放的时间,说明有其他线程预定了未来一段时间的令牌,当前线程需要等到此时next时间点才能执行,并且需要更新next,在next基础上再加一个单位间隔表示下一个线程可以获取到令牌的时间点
2、当前时间大于下一令牌发放时间,说明有一段时间没有线程取令牌了,需要更新令牌剩余数,在原令牌剩余数基础上加上(时间间隔/发放间隔),再减去一枚令牌,并更新下一令牌发放时间为当前时间,如果减去一枚令牌后剩余数量为0,需再将下一令牌发送时间增加一个隔间单位
GeoHash
scan
keys的缺点
rediskey的存储结构
scan的特点
游标分步执行,不会阻塞线程
提供limit参数,控制每次返回结果的最大条数,实际情况可能多可能少,limit控制的是扫描hashmap中数组的槽位个数
返回结果可能有重复,需要客户端去重
遍历过程中有修改数据,改动后的数据不一定能找到
返回空不一定代表结束,要看返回的游标是否为0
高位进位加法
遍历其他基础数据结构
zscan
hscan
sscan
bigkeys
集群
CAP原理
C:一致性
A:可用性
P:分区容忍性
增量同步
快照同步
增加从节点
无盘复制
Sentinel哨兵
Sentinel以每1秒一次的频率向被监视的服务器发送PING消息确认服务是否存在
多个Sentinel之前的选举:raft协议
Sentinel无法保证消息不丢失,只能尽可能保证消息不丢失
设置正常同步的从节点个数
设置同步延迟,超过延迟就说明从节点不正常
Cluster
去中心化
16384个槽位,每个节点一份信息
槽定位
槽跳转
迁移
流程
1、获取源节点内容
2、存到目标节点
3、从源节点内容删除
迁移过程中的访问
1、访问的数据还在旧节点则直接访问
2、访问的数据不在旧节点,返回客户重定向指定
3、客户端收到重定向指令后先发送一个asking指定告诉新节点要强制访问,否则新节点会校验改数据不属于他的槽位
4、最终发送原指令的访问
容错
一个节点的失联判断需要通过大多数节点进行确认后才能确定是否失联
槽位迁移感知
moved指令
asking指令
子主题
常见问题
缓存穿透
查DB不存在缓存一个空值,不建议
BloomFilter 过滤器拦截不存在的请求
缓存击穿
访问DB时加锁
不设置过期时间
缓存雪崩
缓存是添加随机时间
不设置过期时间
常用场景
记录帖子点赞数,评论数,点击数
记录用户的帖子ID列表(排序)
记录帖子的相关文章ID
帖子ID自增
基础数据结构
String
存储结构
embstr格式
raw格式
扩容
操作指令
set key value
get key
mset
mget
incr
incrby
strlen
list
存储结构
操作指令
rpush
lpop
rpop
llen
慢操作
lindex
ltrim
lrange
优化点
快速列表
压缩列表
hash
存储结构
渐进式rehash
操作指令
hset
hget
hlen
hgetall
优化点
set
存储结构
操作指令
sadd
spop
smember
scard
优化点
zset
存储结构
hashmap
跳表
操作指令
zadd
zscore
zrange
zrevrange
zrangebyscore
zrem
优化点
原理篇
redis的线程IO模型:IO多路复用
select
poll
epoll/kqueue
通信协议:RESP序列化协议
单行字符以+开头
多行字符以$开头,后面跟字符串长度
整数以:开头,后面跟整数的字符串形式
错误消息以-开头
数组以*开头,后面跟数组长度
持久化
RDB快照:一次全量备份
fork子进程,共享代码段和数据段
Copy On Write
AOF日志:连续增量备份
先执行指令在存AOF日志
AOF瘦身
fsync
耗时操作
fork子进程遍历内存加重系统负载
fsync增加系统IO负担
混合持久化
管道
事务
watch
扩展篇
Info指令
info
info memory
info replication
info stats|grep ops
monitor
过期策略
带过期时间key的集合
每秒扫描10次过期集合
贪心策略
1、从字典中选出20个key
2、删除这20个key中已经过期的key
3、如果过期key的比例超过1/4则重复步骤1
惰性策略
淘汰策略
停止写请求
淘汰设置了过期时间,最少使用的key
淘汰设置了过期时间,剩余寿命小的key
淘汰设置了过期时间,随机选取的key
全部key使用LRU算法淘汰
全部key随机淘汰
淘汰算法
LRU算法
双向链表+hashmap
近似LRU算法
随机采样
从所有key中随机选择5个淘汰最旧的那个
从过期列表中随机选择5个淘汰最旧的那个
淘汰池
懒惰删除
跳表
最高64层,容纳2的64次方个元素
随机分层
遍历
更新
排序规则
如何保存排名
字典树(前缀树)
0 条评论
下一页
为你推荐
查看更多