Redis 01
今天是2025/03/30 20:57 day 15
总路线请移步主页Java大纲相关文章
今天进行Redis 1,2 个模块的归纳
首先是Redis的相关内容概括的思维导图
1. 核心特性(深度解析)
1.1 内存存储
-
原理: 所有数据存储在内存中,通过异步持久化(RDB/AOF)将数据写入磁盘。
-
优势:
-
读写性能极高(10万+ QPS)。
-
支持复杂数据结构直接操作,无需序列化。
-
-
挑战:
-
内存成本高,需合理设置淘汰策略(如
maxmemory-policy volatile-lru
)。 -
持久化时可能引发性能波动(如
BGSAVE
生成快照时的内存拷贝)。
-
1.2 单线程模型
-
工作机制: 基于事件驱动的Reactor模式,单线程处理所有网络I/O和命令执行。
-
高性能原因:
-
无锁设计:避免线程切换和竞态条件。
-
I/O多路复用:通过
epoll
/kqueue
高效管理连接。
-
-
局限性:
-
长耗时命令(如
KEYS *
)会阻塞其他请求。 -
多核CPU利用率不足(需通过分片或集群解决)。
-
1.3 数据结构丰富性
-
设计哲学: 每种数据结构针对特定场景优化,例如:
-
String
:简单KV,支持二进制安全。 -
ZSet
:跳表 + 哈希表,实现O(logN)范围查询。
-
-
内存优化:
-
ziplist
压缩列表:小数据时Hash/List/ZSet的底层实现。 -
intset
整数集合:Set元素全为整数时的紧凑存储。
-
1.4 高扩展性
-
主从复制:
-
同步流程:
-
Slave发送
SYNC
命令。 -
Master生成RDB快照并发送给Slave。
-
Slave加载RDB后,Master推送增量命令。
-
-
读写分离:Slave处理读请求,Master专注写操作。
-
-
Cluster集群:
-
数据分片:16384个槽(Slot),通过CRC16(key) % 16384计算归属。
-
节点通信:Gossip协议交换节点状态,维护最终一致性。
-
2. 数据结构与使用场景(深度解析)
2.1 String
-
底层实现:
-
动态字符串(SDS),预分配冗余空间减少内存重分配。
-
数值类型存储为整数,非数值存储为二进制安全字节数组。
-
-
高级用法:
-
分布式锁:
SET lock_key unique_value NX EX 30 # 原子性加锁 DEL lock_key # 需结合Lua脚本保证原子性释放
-
限流器:
# 每秒允许10次操作 CL.THROTTLE user_api 10 10 60 1 # 使用Redis-Cell模块
-
2.2 List
-
底层实现:
-
快速链表(QuickList):多个ziplist通过双向指针连接。
-
-
典型场景:
-
消息队列:
LPUSH task_queue "task1" # 生产者推送任务 BRPOP task_queue 30 # 消费者阻塞获取(避免轮询)
-
最新消息列表:
LPUSH news "latest_news" # 插入新消息 LTRIM news 0 9 # 仅保留最新10条
-
2.3 Hash
-
底层实现:
-
ziplist(字段少时) + 哈希表(字段多时)。
-
-
最佳实践:
-
存储用户信息:
HSET user:1001 name "Alice" age 28 # 更新字段 HINCRBY user:1001 score 10 # 原子递增
-
避免大Key:
-
拆分策略:
user:1001:base
(基础信息) +user:1001:ext
(扩展信息)。
-
-
2.4 Set
-
底层实现:
-
intset(整数集合)或哈希表。
-
-
高级应用:
-
共同好友:
SINTER user:1001:friends user:1002:friends # 交集
-
随机抽奖:
SADD lottery "user1" "user2" "user3" # 添加参与者 SPOP lottery 1 # 随机抽取1名
-
2.5 ZSet(Sorted Set)
-
底层实现:
-
跳表(SkipList) + 哈希表,支持O(1)单查和O(logN)范围查询。
-
-
典型场景:
-
排行榜:
ZADD leaderboard 100 "Alice" 90 "Bob" # 插入分数 ZREVRANGE leaderboard 0 9 WITHSCORES # 获取TOP10
-
延迟队列:
ZADD delay_queue <timestamp> "task_data" # 按执行时间排序 ZRANGEBYSCORE delay_queue 0 <now> # 获取到期任务
-
2.6 其他数据结构
-
Bitmaps:
-
日活统计:
SETBIT active:20231001 1001 1 # 用户1001在2023-10-01活跃 BITCOUNT active:20231001 # 统计当日活跃用户数
-
-
HyperLogLog:
-
误差率:0.81%,适合海量数据UV统计。
PFADD page:uv "user1" "user2" # 添加访问用户 PFCOUNT page:uv # 估算UV
-
-
Stream:
-
消费者组:
XGROUP CREATE orders mygroup $ # 创建消费者组 XREADGROUP GROUP mygroup consumer1 COUNT 1 STREAMS orders > # 消费消息
-