Redis知识点完整补充文档
再学习该文档的时候先学习Redis内容https://blog.csdn.net/MC_sir/article/details/159394860?spm1001.2014.3001.5502https://blog.csdn.net/MC_sir/article/details/159394860?spm1001.2014.3001.5502一、基础定义与存储结构补充1. 五大数据结构底层编码面试高频Redis为了节省内存、提升性能针对不同数据量和数据类型采用了不同的底层编码同一种数据结构会有多种编码实现Redis会自动切换String字符串int整型、embstr短字符串优化版、raw长字符串int编码占用内存最小embstr适合长度≤44字节的字符串超过则转为raw编码。List列表ziplist压缩列表、quicklist快速列表Redis3.2后替代ziplistlinkedlist兼顾内存占用和读写效率。Hash哈希ziplist压缩列表字段少、值小、hashtable哈希表字段多、值大。Set集合intset整数集合存纯整数、hashtable哈希表存非整数或元素量大。Zset有序集合ziplist压缩列表元素少、skiplist跳表哈希表元素多保证排序和查询效率。2. 常用批量与进阶命令开发实战Stringmset批量设值、mget批量取值、incr/incrby原子自增计数器专用、decr/decrby原子自减Hashhmset/hmget批量存取字段、hkeys获取所有字段、hvals获取所有值、hlen获取字段个数Listlrange范围查询、lpop/rpop出队、brpop/blpop阻塞式出队避免空轮询做消息队列必备Setsinter交集、sunion并集、sdiff差集、scard统计元素个数Zsetzrangebyscore按分数范围查询、zrank获取排名、zincrby分数自增二、Redis快的原因补充1. 单线程的正确理解纠正误区Redis的单线程仅指网络IO处理和命令执行阶段是单线程并非整个Redis实例只有一个线程。在Redis3.0及以后持久化、异步删除、主从复制数据同步等操作会单独开启后台子线程执行不会阻塞主线程既保证了命令执行无锁竞争又兼顾了后台任务效率。2. IO多路复用底层实现Redis会根据操作系统自动适配最优的IO多路复用模型Linux系统下用epollMac/BSD系统用kqueue普通系统用select/poll通过单线程监听多个套接字的读写事件避免了多线程的上下文切换开销这是Redis高并发低延迟的关键。3. Redis6.0多线程IO进阶Redis6.0引入了多线程处理网络IO读写命令执行依旧保留单线程既解决了高并发下网络IO的性能瓶颈又避免了多线程带来的锁竞争问题大幅提升了高并发写入性能开启需配置io-threads参数。三、缓存三大问题补充实战方案1. 缓存雪崩原有方案基础上补充缓存预热项目启动上线时提前把热点数据加载到Redis中避免冷启动阶段大量请求直接打到数据库同时搭配随机过期时间杜绝大批量key同时过期。2. 缓存穿透原有方案基础上补充接口层参数校验前置拦截非法请求比如id≤0、无效格式的参数从源头杜绝无效查询穿透缓存针对恶意攻击还可搭配接口限流、IP黑名单防护。3. 缓存击穿原有方案基础上补充热点数据永不过期提前预热组合方案针对超高并发的热点key不设置过期时间定时异步更新数据加锁时采用细粒度锁避免大范围阻塞请求影响接口性能。四、持久化机制补充细节生产选型1. RDB持久化补充触发方式分为手动触发和自动触发手动触发用save阻塞主线程生产禁用、bgsave后台fork子进程不阻塞主线程生产推荐自动触发通过配置文件save规则、主从复制、正常关机shutdown触发。2. AOF持久化补充AOF三种刷盘策略兼顾可靠性和性能always每次写入都刷盘数据最安全性能最差everysec每秒刷盘兼顾性能和可靠性生产默认推荐no由操作系统控制刷盘性能最高数据安全性最低AOF重写当AOF文件过大时通过bgrewriteaof命令后台重写压缩冗余命令避免文件无限膨胀不阻塞主线程。3. 混合持久化Redis4.0生产首选结合RDB和AOF的优点重写AOF时先写入RDB全量数据再追加增量AOF命令恢复数据时先加载RDB快速恢复再执行AOF补全数据兼顾恢复速度和数据可靠性。五、过期淘汰策略补充生产选型1. 淘汰策略生产选型allkeys-lru缓存通用场景首选淘汰最少使用的key内存利用率最高volatile-lru只淘汰设置过期时间的key适合需要保留永久数据的场景allkeys-random随机淘汰不推荐使用volatile-ttl淘汰即将过期的keynoeviction不淘汰数据内存满后拒绝写入生产慎用2. 内存配置避坑maxmemory不要设置为物理内存的100%建议设置为50%-70%预留内存给子进程、后台线程和内存碎片防止出现OOM导致服务崩溃。六、高可用/集群方案补充实战细节1. 主从复制补充复制积压缓冲区主节点内存中的固定缓冲区用于保存增量写命令解决网络抖动后的增量复制避免全量重同步支持级联复制从节点可以作为其他从节点的主节点减轻主节点同步压力。2. 哨兵模式补充哨兵采用Raft算法实现选举保证高可用部署数量建议为3、5等奇数quorum配置为半数以上防止脑裂问题哨兵负责监控主从节点、故障自动切换、通知客户端新主节点无需人工干预。3. Cluster集群补充生产最小架构为3主3从共6个节点实现分片存储和故障转移16384个哈希槽均匀分配给主节点支持在线槽迁移、扩容缩容开启slave-read-only可实现集群读写分离分担主节点读压力搭配hash tag可让关联数据落到同一个节点避免跨槽查询。七、分布式锁补充实战坑点1. Redisson常用锁类型开发必备可重入锁RLock支持重复加锁避免死锁公平锁RFairLock保证请求顺序加锁避免线程饥饿读写锁RReadWriteLock读共享、写互斥提升读多写少场景效率红锁RedLock适用于多节点集群保证锁可靠性2. 核心避坑锁续期看门狗机制Redisson自带看门狗默认锁过期时间30s每10s自动续期避免业务执行时间过长导致锁提前释放无需手动设置超长过期时间兼顾安全和效率。3. RedLock争议说明Redlock在极端网络延迟、分区场景下存在锁可靠性问题普通业务场景单机或主从架构搭配Redisson锁足够使用超大规模高可靠分布式场景再考虑RedLock。八、应用场景补充实战场景接口限流基于Redis的zset实现滑动窗口限流、基于incr实现固定窗口限流数据去重利用Set集合sadd命令快速判断数据是否重复延时队列基于Zset的分数排序实现延时任务、订单超时关闭分布式SessionSpring Session整合Redis实现多服务Session共享秒杀扣减利用Redis原子命令实现超高并发下的库存扣减防止超卖九、内存优化补充生产避坑1. 大key处理大key指单个key占用内存过大、包含元素过多比如hash存10w字段、string存几MB数据会导致主线程阻塞、主从同步延迟、内存碎片飙升禁止使用大key拆分大key为多个小key采用unlink异步删除Redis4.0避免del命令阻塞主线程。2. 内存碎片处理内存碎片过高会占用多余内存Redis4.0支持memory defrag命令自动在线整理内存碎片无需重启服务。十、Redis事务补充坑点Redis事务不支持回滚命令入队阶段报错事务不执行执行阶段报错其余命令继续执行官方设计初衷是简化内核、提升性能这类报错多为代码逻辑问题需提前规避。WATCH监控监控指定key若事务执行前key被修改事务放弃执行保证原子性。生产不建议用原生事务复杂业务场景推荐用Lua脚本保证原子性灵活性更高。十一、新增生产实战必备专题贴合博客提升价值1. Redis生产配置优化后台运行daemonize yes关闭危险命令rename-command CONFIG 、rename-command FLUSHDB 内核参数vm.overcommit_memory1防止fork子进程失败开启密码认证禁止外网直接访问2. 监控与问题排查慢查询slowlog get n排查执行过慢的命令大key排查redis-cli --bigkeys热key排查redis-cli --hotkeys常用监控info memory、info clients、info replication3. SpringBoot整合Redis序列化优化禁用JDK默认序列化改用Jackson2JsonRedisSerializer避免乱码、节省内存方便数据查看整合Redisson实现分布式锁、分布式限流。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2460963.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!