Redis
2023-12-04 17:47:53 0 举报
AI智能生成
java
作者其他创作
大纲/内容
过期策略
定时删除
定期删除
redis 默认是每隔 100ms 就随机抽取一些设置了过期时间的 key,检查其是否过期,如果过期就删除。
惰性删除
获取 key 的时候,如果此时 key 已经过期,就删除,不会返回任何东西
内存淘汰机制
allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key
allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 key
volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key
volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key
volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除。
线程模型
Redis 在单线程下还可以支持高并发的一个重要原因就是 Redis 的线程模型:基于非阻塞的IO多路复用机制。(epoll/select/poll)
文件事件处理器
多个 socket
IO 多路复用程序
select/poll
采用轮询方式扫描文件描述符(select数组,poll链表),13;文件描述符越多,性能越差
需要复制大量的句柄数据结构,产生巨大的开销
需要遍历整个数组/链表,才能找到发生事件的句柄
水平触发,报告了发生事件的句柄若未被处理,下次还将上报
epoll
EPOLLLT和EPOLLET两种触发模式
没有最大并发连接的限制,能打开的FD的上限远大于1024
效率提升,不是轮询的方式,不会随着FD数目的增加效率下降。只有活跃可用的FD才会调用callback函数
文件事件分派器
事件处理器
连接应答处理器
命令请求处理器
命令回复处理器
基础概念
Redis本质上是一个 Key-Value 类型的内存数据库,支持String、List、Set、Sorted Set、hashes。
Redis 的通信协议是 Redis 序列化协议,简称 RESP。它具有如下特征:1.在 TCP 层;2.二进制安全;3.基于请求 - 响应模式。
Redis 会将事务中的多个命令一次性、按顺序一次执行,在执行期间可以保证不会中断事务去执行其他命令。Redis 的事务满足一致性和隔离性,但不支持原子性和持久性,事务不会回滚。
数据类型
String
SDS动态字符串,二进制安全,最大512M
1.开发者不用担心字符串变更造成的内存溢出问题。
2.常数时间复杂度获取字符串长度len字段。
3.空间预分配free字段,会默认留够一定的空间防止多次重分配内存。
List
双向链表上扩展了头、尾节点、元素数等属性
1.可以直接获得头、尾节点。
2.常数时间复杂度得到链表长度。
3.双向链表
hash
在数组+链表的基础上,进行了一些rehash优化等
1.Redis的Hash采用链地址法来处理冲突
2.哈希表节点采用单链表结构。
3.rehash优化,渐进式rehash
set
通过 hashtable 实现
无序的自动去重
zset
内部使用 HashMap 和跳跃表(skipList)
HashMap 里放的是成员到 Score 的映射。而跳跃表里存放的是所有的成员
高并发/可用
持久化
优点:1.相比于 RDB,AOF 更加安全,默认同步策略为每秒同步一次,最差就失去一秒的数据。13;2.根据关注点不同,AOF 提供了不同的同步策略。13;3.AOF 文件是以 append-only 方式写入,相比如RDB 全量写入的方式,它没有任何磁盘寻址的开销,写入性能非常高。
RDB,即 Redis DataBase:13;把 Redis 服务器中内存的数13;据保存到一个 dump 文件中,13;数据的集合。
优点:1.由于 RDB 文件是一个非常紧凑的二进制文件,所以加载的速度回快于 AOF 方式;2.fork 子进程(bgsave)方式,不会阻塞13;RDB 文件代表着 Redis 服务器的某一个时刻的全量数据,所以它非常适合做冷备份和全量复制的场景
缺点:没办法做到实时持久化,会存在丢数据的风险。定时执行持久化过程,如果在这个过程中服务器崩溃了,则会导致这段时间的数据全部丢失。
缺点
耗时耗性能,O(n)耗时,fork()消耗内存,磁盘I/O
无法实时持久化,会存在丢数据的风险
触发方式
save(同步)
bgsave(异步)
自动
在seconds时间内 发生 changes 次改变则触发生成RDB。无法控制生成频率。
触发机制
全量复制
debug reload
进行一个debug级别的重启 不需要清空内存 并且在该过程仍会触发RDB文件的生成
shutdown
进行关闭的时候会进行 RDB文件的生成
AOF,即 Append-only file:13;把所有对 Redis 服务器进行修改13;的命令保存到 aof 文件中,命令13;的集合。(命令写入/文件同步13;/文件重写)
缺点:1.由于 AOF 日志文件是命令级别的,所以相比于 RDB 紧致的二进制文件而言它的加载速度会慢些。13;2.AOF 开启后,支持的写 QPS 会比 RDB 支持的写 QPS 低。
三种策略
always
每条命令都执行 fsync 学到硬盘中 防止内容丢失
everysec
每秒刷新到硬盘中 可能会丢失一秒的数据
no
由操作系统来决定
重写
过期、重复、没有用或可优化的命令 进行化简 从而减少AOF文件
多机实现
主从复制(保障高并发)
默认情况下,Redis所有节点都是13;主节点,节点之间互不干涉,而主13;从复制的节点则是划分了主节点13;(master)和从节点(slave)
1.主节点下有一个或者多个从节点13;2.每一个从节点只能有一个主节点13;3.数据的复制是单向的,只能由主节点13;复制到从节点,所以我们不能在从节点13;上面执行写的操作
哨兵(Sentinel)
1.哨兵集群至少要 3 个节点,来确保自己的健壮性。13;2.redis主从 + sentinel的架构,是不会保证数据的零丢失的,它是为了保证redis集群的高可用。
功能
1.集群监控,即时刻监控着redis的master和slave进程是否是在正常工作。
2.消息通知,就是说当它发现有redis实例有故障的话,就会发送消息给管理员。
3.故障自动转移
1.多个sentinel发现master有问题
2.选举一个sentinel作为领导
3.选举一个slave作为master
4.通知其它slave作为新的master的slave
5.通知客户端主从变化
6.等待老的master复活成为新的master的slave
4.充当配置中心,如果发生了故障转移,它会通知将master的新地址写在配置中心告诉客户端。
集群
当数据量过大一个主机放不下的时候,就需要对数据进行分区,将key按照一定的规则进行计算,并将key对应的value分配到指定的Redis实例上,这样的模式简称Redis集群。
主从节点的分布式器群,具有复制分片和高可用特性
针对海量数据+高并发+高可用的场景
数据分布算法
hash算法(大量缓存重建)
一致性hash算法(自动缓存迁移)+虚拟节点(自动负载均衡)
redis cluster的hash slot算法
步骤
将各个独立的节点连接起来,构成一个包含多个节点的集群。
集群的整个数据库被分为16384个槽(slot),将槽分配给不同节点。
接收命令的节点会计算出命令要处理的数据库键属于哪个槽,并检查这个槽是否指派给了自己。若为否返回MOVED错误,指引客户端转向(redirect)至正确的节点。
常见问题
缓存雪崩
缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。(Redis崩溃导致的缓存失效也包括在内)
解决方法
事前
1.缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
2.如果缓存数据库是分布式部署,将热点数据均匀分布在不同Redis库中。
3.设置热点数据永远不过期。
4.redis高可用,主从+哨兵,redis cluster,避免全盘崩溃
事中
本地ehcache缓存 + hystrix限流&降级,避免MySQL被打死
事后
redis持久化,快速恢复缓存数据
缓存击穿
缓存击穿是指缓存中没有但数据库中有的数据(热点key),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。
解决方法:1.设置热点数据永远不过期。2.加互斥锁。
缓存穿透
缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求 。
解决方法
1.接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
2.空值设置缓存,key-null;
3.布隆过滤器。
0 条评论
下一页