redis的基础知识

Redis 是一个开源的内存数据结构存储系统,支持多种数据类型和原子操作,广泛应用于缓存、消息队列、分布式锁等场景。以下是其核心知识点:


​一、核心特性​

  1. ​内存存储​

    数据完全存储在内存中,读写速度极快(单节点可达数十万至百万 ops/s)。

  2. ​丰富的数据类型​

    支持 String、Hash、List、Set、Sorted Set 等基础类型,以及 Bitmap、HyperLogLog、Geo 等扩展类型。

  3. ​原子性与事务​

    单个命令原子执行;通过 MULTI/EXEC实现事务(不支持回滚);Lua 脚本可保证多命令原子性。

  4. ​持久化机制​

    • ​RDB​​:定时生成内存快照,恢复速度快但可能丢失数据。

    • ​AOF​​:记录写命令日志,数据更完整但文件较大。

    • 混合持久化:结合 RDB 和 AOF,平衡性能与数据安全。


​二、核心数据结构与使用场景​

数据类型 特点与用途 典型命令
​String​ 最基础类型,存储字符串或二进制数据(如图片),支持计数器、缓存等场景 SET, GET, INCR
​Hash​ 键值对集合,适合存储对象(如用户信息),节省内存 HSET, HGET, HGETALL
​List​ 双向链表,支持消息队列、任务调度,可阻塞操作(如 BLPOP LPUSH, RPOP, LRANGE
​Set​ 无序集合,支持去重、交集/并集/差集操作,适合标签系统、共同关注等场景 SADD, SMEMBERS, SINTER
​Sorted Set​ 带分数的有序集合,用于排行榜、延迟队列(按分数排序) ZADD, ZRANGE, ZREVRANK
​Bitmap​ 位图操作,高效统计二值状态(如签到、用户活跃) SETBIT, GETBIT
​HyperLogLog​ 基数估算,内存极小,用于 UV 统计(误差约 0.81%) PFADD, PFCOUNT
​Stream​ 日志流结构,支持消息队列(ACK、消费组),适合可靠消息传递 XADD, XREADGROUP

​三、高可用与扩展​

  1. ​主从复制​

    异步复制数据到从节点,支持读扩展和备份,但存在数据延迟风险。

  2. ​哨兵模式(Sentinel)​

    自动监控主节点状态,触发故障转移(选举新主节点)。

  3. ​集群模式(Cluster)​

    数据分片存储(16384 个哈希槽),支持水平扩展,需注意跨槽操作限制。


​四、内存管理与性能优化​

  1. ​内存淘汰策略​

    设置 maxmemory限制,配置策略如 volatile-lru(淘汰最近最少使用的带过期时间的键)。

  2. ​持久化与恢复​

    • RDB 优先用于快速恢复,AOF 用于数据完整性。

    • 混合持久化(AOF + RDB)平衡性能与数据安全。

  3. ​性能优化技巧​

    • 使用管道(Pipelining)减少 RTT。

    • 避免 KEYS *SMEMBERS等 O(N) 命令,改用 SCAN分页。

    • 热点数据分散存储,避免单点瓶颈。


​五、常见问题与解决方案​

  1. ​缓存穿透​

    • 问题:查询不存在的数据导致数据库压力大。

    • 方案:缓存空值或使用布隆过滤器。

  2. ​缓存击穿​

    • 问题:热点数据过期后大量请求涌入数据库。

    • 方案:互斥锁(Redisson)或逻辑过期(异步重建)。

  3. ​缓存雪崩​

    • 问题:大量 Key 同时失效。

    • 方案:为 TTL 添加随机值,分散失效时间。


​六、典型应用场景​

  • ​缓存​​:减轻数据库压力,提升响应速度。

  • ​分布式锁​ ​:通过 SETNX或 RedLock 实现资源互斥访问。

  • ​消息队列​​:基于 List 或 Stream 实现异步通信。

  • ​排行榜​​:利用 Sorted Set 按分数排序。


​七、常用命令示例​

复制代码
# 字符串操作
SET key value       # 设置键值
GET key             # 获取键值

# 哈希操作
HSET user name "Alice"  # 存储对象字段
HGETALL user          # 获取所有字段及值

# 列表操作
LPUSH task "task1"    # 左端插入元素
RPOP task             # 右端弹出元素

# 事务操作
MULTI               # 开启事务
EXEC                # 提交事务

通过合理选择数据结构和配置持久化策略,Redis 能在高性能场景下稳定运行。建议结合具体业务需求,参考官方网页及最佳实践。

相关推荐
CoderYanger19 小时前
动态规划算法-子序列问题(数组中不连续的一段):30.最长数对链
java·算法·leetcode·动态规划·1024程序员节
CoderYanger20 小时前
C.滑动窗口——2762. 不间断子数组
java·开发语言·数据结构·算法·leetcode·1024程序员节
智者知已应修善业1 天前
【输入两个数字,判断两数相乘是否等于各自逆序数相乘】2023-10-24
c语言·c++·经验分享·笔记·算法·1024程序员节
CoderYanger2 天前
动态规划算法-子数组、子串系列(数组中连续的一段):21.乘积最大子数组
开发语言·算法·leetcode·职场和发展·动态规划·1024程序员节
CoderYanger2 天前
A.每日一题——3432. 统计元素和差值为偶数的分区方案
java·数据结构·算法·leetcode·1024程序员节
CoderYanger2 天前
动态规划算法-子数组、子串系列(数组中连续的一段):26.环绕字符串中唯一的子字符串
java·算法·leetcode·动态规划·1024程序员节
韩家阿杰3 天前
RabbitMQ技术的使用
1024程序员节
CoderYanger3 天前
动态规划算法-简单多状态dp问题:15.买卖股票的最佳时机含冷冻期
开发语言·算法·leetcode·动态规划·1024程序员节
CoderYanger4 天前
递归、搜索与回溯-FloodFill:33.太平洋大西洋水流问题
java·算法·leetcode·1024程序员节
CoderYanger4 天前
动态规划算法-斐波那契数列模型:2.三步问题
开发语言·算法·leetcode·面试·职场和发展·动态规划·1024程序员节