Redis
1.回顾Redis5种类型
2.基础命令
3.Redis持久化 为什么要持久化? 避免数据丢失 内存->关电脑->写入磁盘
持久化方式: RDB(默认):数据快照:二进制数据文件 文件小 恢复数据快
AOF(需要手动开启):只追加文件:追加指令文件,后续的增删改命令追加到这个文件,目的是数据备份 大(相同情况下)慢
命令: expire 设置过期时间(秒) ttl :查看过期时间 persist:移除过期时间
Redis删除机制:
惰性删除:拿时间换空间 数据到达了过期时间,不处理,等下次访问时1.如果未过期,返回数据.2.如果过期,删除,导入新数据
定期删除:默认为10,定时执行 250ms之内,10次,每执行一次任务扫描哈希类型的值,执行清除任务,
随机抽取固定的key,过期的删除,直到时间截止或者抽取的过期key占比小于25%.
两个结合使用(主动(定期)和被动(惰性))
淘汰策略:
最大可使用内存,一定要设置 maxmemory: Redis最大内存可使用内存,一般设置为服务器内存的50%-60%
主从架构: 主从复制,主负责写,从负责读,主将写入的数据同步到从,偏移量不一致,触发部分复制(偏移量在复制缓冲区之内)或全部复制(偏移量在复制缓冲区之外)
复制缓冲区:命令传播程序,每写一个程序(增删改),会将程序备份到复制缓冲区
主从+哨兵 实用架构(用的较多),java客户端连接哨兵(哨兵有主从位置)
哨兵机制: 监控并选择 通知 自故障转移
哨兵(Redis服务器,设置为单数,方便选举)
三个阶段:监控阶段(通过master(主)知道slave(从)信息和其它sentinel(哨兵)信息)->通知阶段(哨兵和哨兵之间相互通讯)->故障转移阶段(没ping通,给其它哨兵发,其它哨兵ping,超过半数认为挂了(sdown(主观(个人)下线)改为odown(客观(普遍)下线(触发故障转移)))
换master,选举,将响应慢的和不在线的踢掉,再根据优先级,offset(优中选优),票多的当master,其它的slave切换master,原master先当slave修复后后恢复为master)
集群架构:高性能,高并发,高可用都可以解决
集群内部存储:Clustertog方法通过算法算出key的存储空间
槽(16384个,编号0-16383)存储key的空间,
客户端访问一个节点:通过槽一次命中未命中(会告知数据在哪个槽)请求转发给其它节点两次命中.
扩容 添加后分槽 redis-cli命令中间","分隔
拿掉 redis-cli命令将槽分配到另一个master中,一般用于清空master
实际开发中遇到的问题:
1.缓存预热:一启动很快down机(原因:请求数量高,主从之间复制频繁),统计那些数据属于热点数据,Redis优先加载,用脚本加
2.缓存雪崩:数据库服务器崩了(较短时间内,大量key过期)错峰(设置Redis过期),尽量降低用户访问数据库,拿数据走静态页面,数据库优化,定期维护,加锁,慎用,构建多级缓存,页面静态化,实在不行降级,一部分人先用,业务数据有效期分类错峰
3.缓存击穿:数据库崩(某个key过期,这个key访问量巨大),加大这个key的过期时长,监控,发现流量激增的key直接延长时长,预防,监控,及时调整
4.缓存穿透:Redis中出现大面积出现未命中,大部分出现黑客攻击,缓存null,设置短时限,白名单,实时监控,key加密(影响性能),这种及时报警.