Reids
2022-03-15 11:17:02 0 举报
AI智能生成
Redis完整解析
作者其他创作
大纲/内容
记录每次执行的命令
同步写回
Always
(推荐)每秒写回
Everysec
操作系统控制写回
No
写回策略
文件太大,数据恢复慢
AOF
全量快照
在主线程中执行,会导致阻塞;
save
创建一个子进程,专门用于写入 RDB 文件,避免了主线程的阻塞,这也是 Redis RDB 文件生成的默认配置。
bgsave
备份方式
RDB
内存快照以一定的频率执行,在两次快照之间,使用 AOF 日志记录这期间的所有命令操作
AOF+RDB混合
数据持久化方式
主库宕机需要手动切换
主从模式
监听、选主、通知
通过pub/sub机制相互发现
关键事件
半数以上投票通过
哨兵选主
半数以上“主观下线”
主从切换
哨兵集群
造成原因
通过合理地配置参数 min-slaves-to-write 和 min-slaves-max-lag,来预防脑裂的发生。
避免方式
脑裂问题
哨兵模式
首先根据键值对的 key,按照CRC16 算法计算一个 16 bit 的值;然后,再用这个 16bit 值对 16384 取模,得到 0~16383 范围内的模数,每个模数代表一个相应编号的哈希槽。
分片方式
创建分片集群
GET hello:key(error) MOVED 13320 172.16.19.5:6379
重定向机制
GET hello:key(error) ASK 13320 172.16.19.5:6379
ASK重定向
扩容/缩容
数据中有 bigkey,导致某个实例的数据量增加;
Slot 手工分配不均,导致某个或某些实例上有大量数据;
使用了 Hash Tag,导致数据集中到某些实例上。
存在热点数据
业务层避免创建bigkey
把集合类型的bigkey拆分成多个小集合,分散保存
指定运维规则,避免把过多Slot分配到一个实例上
如果Hash Tag会造成数据倾斜,优先避免数据倾斜,不适用Hash Tag
采用带有不同key前缀的多副本方法
应对方法
数据倾斜
分片集群模式
高可用
分布式锁
volatile-lru: 从已设置过期的数据中中随机挑选最近最少使用的多个key进行数据淘汰。
volatile-ttl: 从已设置过期的数据中挑选即将要过期的数据进行淘汰。
volatile-random:从已设置过期的数据中任意淘汰数据。
volatile-lfu:从已设置过期时间的数据集挑选使用频率最低的数据淘汰。
allkeys-lru: 从数据集中挑选最近最少使用的数据淘汰。
allkeys-lfu:从数据集中挑选使用频率最低的数据淘汰。
allkeys-random:从数据集中任意选择数据淘汰。
noeviction: 不进行删除,达到最大内存时,直接返回错误信息。
数据淘汰策略
get key
set key value [expiration EX seconds|PX milliseconds] [NX|XX]
mget key [key ...]
mset key value [key value ...]
incr key
incrby key increment
exists key [key ...]
del key [key ...]
type key
expire key seconds
查看key还有多久过期
ttl key
等价于 set+expire
setex key seconds value
如果key不存在就执行set创建(if not exists)
setnx key value
命令
String(字符串)
rpush key value [value ...]
lpush key value [value ...]
lrange key start stop
rpop key
lpop key
lindex key index
ltrim books 1 0 (这其实是清空了整个列表,因为区间范围长度为负)
保留区别的值
ltrim key start stop
排行榜
消息队列
使用场景
List(列表)
hset key field value
hget key field
hmset key field value [field value ...]
hmget key field [field ...]
hgetall key
hincrby key field increment
存储、读取、修改用户属性
Hash(哈希)
sadd key member [member ...]
smembers key
sismember key member
scard key
spop key
两个set的交集
sinter key [key ...]
sunion key [key ...]
sunionstore destination key [key ...]
共同好友
利用唯一性,统计访问网站的独立IP
好友推荐是,根据tag求交集,大于某个阈值可以推荐
Set(集合)
zadd key [NX|XX] [CH] [INCR] score member [score member ...]
zrange key start stop [WITHSCORES]
zrevrange key start stop [WITHSCORES]
zrank key member
zrem key member [member ...]
zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
zremrangebyscore key min max
带权重的消息队列
Sorted Set(有序集合)
bf.add
bf.exists
bf.madd
bf.mexists
可以用于检索一个元素是否在一个集合中
描述
爬虫过滤已抓到的url就不再抓
邮件系统的垃圾邮件过滤功能
新闻客户端推荐系统去重
应用场景
有一定的误差
当布隆过滤器说某个值存在时,这个值可能不存在;当它说某个值不存在时,那就肯定不存在
特性
布隆过滤器(Bloom Filter)
pfadd key element [element ...]
pfcount key [key ...]
pfmerge destkey sourcekey [sourcekey ...]
命令(pf为创建该数据结构的人的名字缩写)
用于统计一个集合中不重复的元素个数(基数计数),可以解决很多精确度要求不高的统计问题
统计页面的UV
统计在线用户数
统计注册IP数
标准误差为0.81%
有误差
有局限性,就是只能统计基数数量,而没办法去知道具体的内容是什么
HyperLogLog
时间复杂度
数据结构
纯内存操作
高效的数据结构
单线程,避免了不必要的上下文切换和竞争条件
单线程的Redis为什么快
基于轮训机制,默认最大支持1024个fd文件描述符
select
基于轮训机制,没有最大文件描述符数量限制
poll
基于事件回调机制,没有最大连接限制
epoll
IO多路复用
过期时间添加短时间范围的随机数
服务熔断
服务限流
服务降级
主从集群
缓存中有大量数据同时过期,导致大量请求无法得到处理。
缓存雪崩
频繁访问的热点数据不设置过期时间
访问频繁的热点数据不在缓存中,直接请求到数据库
缓存击穿
不存在也缓存一个null在Redis
存在漏判
全部为1才有可能存在,一个为0一定不存在
使用布隆过滤器快速判断数据是否存在
前端入口对请求参数进行合法请求检查
要访问的数据即不在Redis缓存中,也不在数据库中
缓存穿透
常见问题
Reids
0 条评论
回复 删除
下一页