当前位置:首页 > 问答 > 正文

红色字体标记的Redis重点内容,零散但实用的知识点大集合

核心数据结构与使用场景 这是所有Redis教程都会用红字强调的起点,Redis不是简单的key-value存储,它的价值在于丰富的数据结构,字符串(String)最简单,常用来做缓存、计数器;哈希(Hash)适合存储对象,比如用户信息,可以单独修改某个字段而不用序列化整个对象;列表(List)实现消息队列(LPUSH/RPOP)或最新消息排行;集合(Set)用于去重,比如共同好友;有序集合(Sorted Set)是带分数的Set,能做排行榜、延时队列,选择合适的数据结构是高效使用Redis的关键。

持久化机制:RDB与AOF 数据安全是命门,所以持久化必须用红字标出,RDB是快照,在指定时间间隔生成数据集的二进制备份,文件紧凑,恢复快,但可能丢失最后一次快照后的数据,AOF是日志,记录每个写操作,数据更安全,支持每秒同步、每操作同步或无同步,但文件会越来越大,需要重写机制来压缩,生产环境常常两者结合使用,用AOF保证数据不丢失,用RDB做冷备或快速恢复。

过期键的删除策略 内存是宝贵的,给键设置TTL(生存时间)是常规操作,但Redis如何删除过期键?这里有个红字知识点:惰性删除 + 定期删除,惰性删除是当客户端访问一个键时,检查它是否过期,过期就删除,这节省CPU但可能导致内存浪费(过期键没人访问就一直留着),定期删除是Redis定期随机测试一些设置了过期时间的键,删除其中已过期的,这是一种折中方案,通过调整频率来平衡CPU和内存。

缓存穿透、击穿、雪崩 这三个概念是面试高频红点,也是线上事故高发区,缓存穿透是查询一个根本不存在的数据,缓存和数据库都没有,导致每次请求都打到数据库,像穿透了一样,解决方案常用布隆过滤器(Bloom Filter)或缓存空对象,缓存击穿是指一个热点key突然过期,此时大量请求瞬间穿透到数据库,造成压力,解决方案是设置热点数据永不过期,或用互斥锁(如Redis的SETNX)只让一个请求去查数据库重建缓存,缓存雪崩是指大量key在同一时间过期,或Redis集群宕机,导致所有请求涌向数据库,解决方案是给过期时间加随机值,避免同时失效,并保证Redis服务的高可用性。

红色字体标记的Redis重点内容,零散但实用的知识点大集合

管道(Pipeline)与事务 为了提升性能,红字会提醒你使用管道,Redis是请求-响应模式,如果逐个执行命令,网络往返时间(RTT)是瓶颈,管道能将多个命令打包一次性发送,极大减少RTT,提升吞吐量,但管道不保证原子性,事务(MULTI/EXEC)能保证原子性,即队列中的命令按顺序一次性执行,不会被其他命令打断,但它不是回滚的,某个命令出错不会影响后续命令执行,WATCH命令可以与事务结合实现乐观锁,在EXEC前监视一个或多个键,如果被其他客户端修改,则事务执行失败。

内存优化技巧 小数据结构的编码优化是进阶红字知识,Redis会根据数据大小和数量,为散列、列表、集合、有序集合选择不同的底层编码(如ziplist、intset等)来节省内存,了解这些编码的转换阈值(在配置文件中可调整)对优化大量小对象存储很有帮助,当散列的元素数量和每个元素的大小低于阈值时,会使用内存效率更高的ziplist而不是hashtable。

红色字体标记的Redis重点内容,零散但实用的知识点大集合

主从复制与哨兵(Sentinel) 高可用基础,主从复制:一个主节点(Master)负责写,多个从节点(Slave)负责读和备份,数据异步复制,从节点会拉取主节点的RDB文件或AOF日志来同步,这是读写分离和灾难恢复的基础,哨兵模式:在主从基础上,增加哨兵进程来监控主节点是否存活,如果主节点宕机,哨兵会自动从从节点中选举出新主节点,并通知客户端,实现自动故障转移,这是实现高可用的常见方案。

集群(Cluster)模式 当数据量巨大或并发极高时,单机或主从模式不够,需要用红字标出的集群模式,Redis集群采用无中心结构,数据被分片到16384个槽(slot)上,每个节点负责一部分槽,客户端可以直接连接到任意节点,如果数据不在该节点,节点会返回重定向指令让客户端跳转到正确节点,集群通过Gossip协议进行节点间通信,自动进行故障发现和主从切换,实现了高可用和水平扩展。

一些零散但实用的命令和技巧

  • KEYS pattern 命令在生产环境慎用,因为它会阻塞Redis,扫描所有键,替代方案是使用 SCAN 命令,它是非阻塞的迭代器。
  • INFO 命令是查看Redis运行状态的瑞士军刀,可以查看内存、客户端、持久化、复制等大量信息。
  • 使用 SLOWLOG 命令来查找和优化执行缓慢的命令。
  • 大Key(如包含数百万元素的Hash)会引发操作延迟、网络阻塞等问题,需要监控和拆分。
  • 避免在Lua脚本中执行耗时操作,因为Lua脚本在执行期间会阻塞整个Redis服务器。
  • 连接池是客户端必备,能避免频繁建立和断开连接的开销。
  • 即使是集群模式,Lua脚本中操作的key也必须位于同一个节点上,即保证所有key的hash tag(用{}括起来的部分)相同,否则会报错。