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