一、Redis 是什么开源的内存键值数据库数据存在内存中读写速度极快10万 QPS支持数据持久化可将内存数据保存到磁盘单线程模型6.0 后 I/O 多线程命令执行仍单线程避免了线程安全问题常用场景缓存、会话管理、排行榜、消息队列、分布式锁二、数据类型类型说明典型场景String最基本类型可存字符串/数字/二进制缓存、计数器、分布式锁Hash字段-值映射类似 HashMap存储对象用户信息List有序列表支持头尾操作消息队列、最新列表Set无序不重复集合标签、共同好友、去重Sorted Set (ZSet)有序集合每个元素带分数排行榜、延迟队列Bitmap位操作签到、在线状态HyperLogLog基数统计近似值UV 统计Stream消息流5.0消息队列三、常用命令StringSET key value# 设置值GET key# 获取值SET key value EX60# 设置值60秒过期SETNX key value# 不存在时才设置分布式锁基础INCR key# 值1原子操作DECR key# 值-1MSET k1 v1 k2 v2# 批量设置MGET k1 k2# 批量获取ListLPUSH list a b c# 从左侧插入RPUSH list x y z# 从右侧插入LPOP list# 从左侧弹出RPOP list# 从右侧弹出LRANGE list0-1# 获取所有元素LLEN list# 获取长度LREM list2a# 删除2个值为a的元素0全部正从左负从右LTRIM list02# 只保留索引0~2的元素其余删除SetSADDseta b c# 添加元素SMEMBERSset# 获取所有元素SISMEMBERseta# 判断元素是否存在SREMseta# 删除元素SINTER set1 set2# 交集SUNION set1 set2# 并集SDIFF set1 set2# 差集Sorted SetZADD rank100张三# 添加元素分数100ZRANGE rank0-1WITHSCORES# 按分数升序获取ZREVRANGE rank09# 按分数降序取前10排行榜ZSCORE rank张三# 获取分数ZRANK rank张三# 获取排名ZREM rank张三# 删除元素HashHSET user:1 name张三# 设置字段HGET user:1 name# 获取字段HMSET user:1 name张三age25# 批量设置字段HGETALL user:1# 获取所有字段和值HDEL user:1 age# 删除字段通用命令DEL key# 删除EXISTS key# 判断是否存在EXPIRE key60# 设置过期时间秒TTL key# 查看剩余过期时间TYPE key# 查看数据类型KEYS pattern# 查找key生产慎用会阻塞SCAN0MATCH user:* COUNT100# 渐进式遍历推荐替代KEYSFLUSHDB# 清空当前库四、发布订阅SUBSCRIBE channel1# 订阅频道会阻塞等待消息PUBLISH channel1hello# 向频道发送消息PSUBSCRIBE news.*# 模式订阅匹配 news.xxx 的所有频道UNSUBSCRIBE channel1# 取消订阅发布订阅不持久化消息发出后如果没有订阅者则丢失需要持久化消息队列建议使用Stream类型五、Stream消息队列XADD mystream * name张三age25# 添加消息*表示自动生成ID↑ ↑ ↑ ↑ ↑ 命令 Stream名 ID 字段名 字段值 XLEN mystream# 消息数量XRANGE mystream - # 获取所有消息XREAD COUNT2BLOCK0STREAMS mystream0# 阻塞读取消息XGROUP CREATE mystream mygroup0# 创建消费者组XREADGROUP GROUP mygroup consumer1 COUNT1STREAMS mystream# 消费者读取XACK mystream mygroup 消息ID# 确认消费六、Geospatial地理空间GEOADD city116.4039.90北京# 添加地理位置经度 纬度 名称GEOADD city121.4731.23上海GEOPOS city北京# 获取坐标GEODIST city北京上海km# 计算两地距离单位kmGEOSEARCH city FROMMEMBER北京BYRADIUS1500km# 搜索半径内的城市七、HyperLogLogPFADD uv:page1 user1 user2 user3# 添加元素PFCOUNT uv:page1# 统计基数近似UV数PFMERGE uv:total uv:page1 uv:page2# 合并多个HyperLogLog八、Bitmap位图SETBIT sign:user1:20260301# 第0天签到位偏移量GETBIT sign:user1:2026030# 查询第0天是否签到BITCOUNT sign:user1:202603# 统计当月签到天数九、Bitfield位域BITFIELD mykey SET u80200# 在偏移0处设置8位无符号整数值200BITFIELD mykey GET u80# 获取偏移0处的8位无符号整数BITFIELD mykey INCRBY u801# 自增1十、事务Redis 事务通过 MULTI/EXEC 实现将多条命令打包一次性执行MULTI# 开启事务SET k1 v1# 命令入队SET k2 v2# 命令入队EXEC# 执行所有入队命令# 或DISCARD# 放弃事务Redis 事务不支持回滚如果某条命令执行失败其他命令仍会执行WATCH实现乐观锁如果被监视的 key 在事务执行前被修改事务自动取消WATCH key# 监视keyMULTI SET key newvalue EXEC# 如果key被其他客户端修改EXEC返回nil十一、持久化RDB快照按时间间隔将内存数据快照写入磁盘dump.rdb优点文件紧凑恢复速度快缺点可能丢失最后一次快照后的数据# redis.conf 配置save9001# 900秒内至少1个key变化则触发save30010# 300秒内至少10个key变化则触发AOF追加日志记录每次写操作到日志文件appendonly.aof优点数据更安全最多丢1秒数据缺点文件比RDB大恢复较慢# redis.conf 配置appendonlyyesappendfsync everysec# 每秒同步一次推荐# appendfsync always # 每次写都同步最安全但最慢如何选择对数据安全要求高→ AOF或 RDB AOF 混合对性能要求高可容忍少量丢失→ RDB十二、缓存常见问题问题说明解决方案缓存穿透查询不存在的数据每次都打到数据库布隆过滤器缓存空值缓存击穿热点key过期瞬间大量请求打到数据库互斥锁热点key永不过期缓存雪崩大量key同时过期数据库压力骤增过期时间加随机值多级缓存十三、过期与淘汰策略过期删除策略惰性删除访问key时才检查是否过期定期删除每隔一段时间随机抽查一批key删除过期的内存淘汰策略内存满时策略说明noeviction不淘汰写入报错默认allkeys-lru所有key中淘汰最近最少使用的最常用volatile-lru有过期时间的key中淘汰LRUallkeys-random随机淘汰volatile-ttl淘汰即将过期的key十四、常用架构主从复制主节点写从节点读实现读写分离从节点异步复制主节点数据# 从节点配置replicaof 主节点IP6379哨兵模式Sentinel监控主从节点状态主节点宕机时自动故障转移选举新主节点集群模式Cluster数据分片存储在多个节点16384个槽位支持水平扩展突破单机内存限制十五、Spring Boot 集成 Redis// 依赖spring-boot-starter-data-redisAutowiredprivateStringRedisTemplateredisTemplate;// String 操作redisTemplate.opsForValue().set(key,value,60,TimeUnit.SECONDS);StringvalredisTemplate.opsForValue().get(key);// Hash 操作redisTemplate.opsForHash().put(user:1,name,张三);// 删除redisTemplate.delete(key);