redis 常见数据结构
- String 2.Hash 3.List 4.Set 5.Sorted Set
删除策略(针对过期数据,并且占用内存的)?
定时删除,创建一个定时器,当key设置有过期时间,且过期时间到达时,由定时器任务立即执行对键的删除操作
惰性删除,数据到达过期时间,不做处理。等下次访问该数据时,如果未过期,返回数据,发现已过期,删除,返回不存在
定期删除,redis默认是每隔 100ms 就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。
redis 持久化机制?
两种方式,第一种RDB,存储备份的是redis在某个时间点的数据快照,RDB是一个紧凑压缩的二进制文件,存储效率较高。第二种AOF, 以日志的方式记录每次写命令,重启时再重新执行AOF文件中命令 达到恢复数据的目的。
RDB三种启动方式
save
bgsave
save second changes(second:监控时间范围 changes:监控key的变化量) 满足限定时间范围内key的变化数量达到指定数量即进行持久化
优点
RDB是一个紧凑压缩的二进制文件,存储效率较高
RDB内部存储的是redis在某个时间点的数据快照,非常适合用于数据备份,全量复制等场景
RDB恢复数据的速度要比AOF快很多
应用:服务器中每X小时执行bgsave备份,并将RDB文件拷贝到远程机器中,用于灾难恢复。
缺点
RDB方式无论是执行指令还是利用配置,无法做到实时持久化,具有较大的可能性丢失数据
bgsave指令每次运行要执行fork操作创建子进程,要牺牲掉一些性能
Redis的众多版本中未进行RDB文件格式的版本统一,有可能出现各版本服务之间数据格式无法兼容现象
AOF写数据三种策略(appendfsync)
always(每次) 每次写入操作均同步到AOF文件中,数据零误差,性能较低,不建议使用。 everysec(每秒) 每秒将缓冲区中的指令同步到AOF文件中,数据准确性较高,性能较高,建议使用,也是默认配置 在系统突然宕机的情况下丢失1秒内的数据
no(系统控制) 由操作系统控制每次同步到AOF文件的周期,整体过程不可控
AOF重写
随着命令不断写入AOF,文件会越来越大,为了解决这个问题,Redis引入了AOF重写机制压缩文件体积。简单说就是将对同一个数据的若干个条命令执行结 果转化成最终结果数据对应的指令进行记录。 aof重写缓存区
事务
开启事务 multi 执行事务exec 取消事务 discard
锁
对 key 添加监视锁,在执行exec前如果key发生了变化,终止事务执行
watch key1 [key2……]
取消对所有 key 的监视
Unwatch
分布式锁
使用 setnx 设置一个公共锁
setnx lock-key value
(死锁解决)使用 expire 为锁key添加时间限定,到时不释放,放弃锁
expire lock-key second
pexpire lock-key milliseconds
逐出算法
检测易失数据(可能会过期的数据集server.db[i].expires )
① volatile-lru:挑选最近最少使用的数据淘汰
② volatile-lfu:挑选最近使用次数最少的数据淘汰
③ volatile-ttl:挑选将要过期的数据淘汰
④ volatile-random:任意选择数据淘汰
检测全库数据(所有数据集server.db[i].dict )
⑤ allkeys-lru:挑选最近最少使用的数据淘汰
⑥ allkeys-lfu:挑选最近使用次数最少的数据淘汰
⑦ allkeys-random:任意选择数据淘汰
主从复制
为了避免单点Redis服务器故障,准备多台服务器,互相连通。将数据复制多个副本保存在不同的服 务器上,连接在一起,并保证数据是同步的。即使有其中一台服务器宕机,其他服务器依然可以继续 提供服务,实现Redis的高可用,同时实现数据冗余备份。
主从复制即将master中的数据即时、有效的复制到slave中
主从复制工作流程
主从复制过程大体可以分为3个阶段 ,建立连接阶段(即准备阶段),数据同步阶段,命令传播阶段。
建立连接阶段
建立slave到master的连接,使master能够识别slave,并保存slave端口号
数据同步阶段
在slave初次连接master后,复制master中的所有数据到slave,将slave的数据库状态更新成master当前的数据库状态
命令传播阶段
当master数据库状态被修改后,导致主从服务器数据库状态不一致,此时需要让主从数据同步到一致的 状态,同步的动作称为命令传播 master将接收到的数据变更命令发送给slave,slave接收命令后执行命令
复制缓冲区
概念:复制缓冲区,又名复制积压缓冲区,是一个先进先出(FIFO)的队列,用于存储服务器执行过的命 令,每次传播命令,master都会将传播的命令记录下来,并存储在复制缓冲区
由来:每台服务器启动时,如果开启有AOF或被连接成为master节点,即创建复制缓冲区
作用:用于保存master收到的所有指令(仅影响数据变更的指令,例如set,select)
数据来源:当master接收到主客户端的指令时,除了将指令执行,会将该指令存储到缓冲区中
心跳机制
进入命令传播阶段候,master与slave间需要进行信息交换,使用心跳机制进行维护,实现双方连接保持在线
slave数量少于2个,或者所有slave的延迟都大于等于10秒时,强制关闭master写功能,停止数据同步
哨兵
哨兵(sentinel) 是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的 master并将所有slave连接到新的master。
哨兵也是一台redis服务器,只是不提供数据服务 通常哨兵配置数量为单数
主从切换
监控 同步信息
通知 保持联通
故障转移 发现问题 竞选负责人 选新master 新master上任,其他slave切换master,原master作为slave故障回复后连接剔除条件
Redis集群结构设计
通过算法设计,计算出key应该保存的位置 将所有的存储空间计划切割成16384份,每台主机保存一部分 每份代表的是一个存储空间,不是一个key的保存空间 将key按照计算出的结果放到对应的存储空间
增强可扩展性,16384槽。各个数据库相互通信,保存各个库中槽的编号数据 一次命中,直接返回 一次未命中,告知具体位置 。
缓存雪崩? 缓存击穿? 缓存穿透?
1.在一个较短的时间内,缓存中较多的key集中过期 2. 此周期内请求访问过期的数据,redis未命中,redis向数据库获取数据 3. 数据库同时接收到大量的请求无法及时处理 4. Redis大量请求被积压,开始出现超时现象 5. 数据库流量激增,数据库崩溃
- LRU与LFU切换 2. 数据有效期策略调整 根据业务数据有效期进行分类错峰,A类90分钟,B类80分钟,C类70分钟 过期时间使用固定时间+随机值的形式,稀释集中到期的key的数量 3. 超热数据使用永久key 4. 构建多级缓存架构 Nginx缓存+redis缓存+ehcache缓存
- Redis中某个key过期,该key访问量巨大 2. 多个数据请求从服务器直接压到Redis后,均未命中 3. Redis在短时间内发起了大量对数据库中同一数据的访问
- 预先设定 加大此类信息key的过期时长 2. 现场调整增的数据延长过期时间或设置为永久性key 3. 后台刷新数据 启动定时任务,高峰期来临之前,刷新数据有效期,确保不丢失
- Redis中大面积出现未命中 2. 出现非正常URL访问 获取的数据在数据库中也不存在,数据库查询未得到对应数据 Redis获取到null数据未进行持久化,直接返回
- 缓存null 对查询结果为null的数据进行缓存(长期使用,定期清理),设定短时限,例如30-60秒,最高5分钟2. 白名单策略, 使用布隆过滤器