Redis Overview
基础数据结构
String
- 当做KV存储使用,Key和Value都可以是字符串或者序列化后的字符串
- key和value的长度呢?
- value可以容纳的数据长度是
512MB
- 底层实现呢?
- 应用场景
- 缓存对象
- 常规计数,用incr自增KV
- 实现分布式锁,
setnx key value ex 123
语句可以被用于设置带expire time的KV - 共享session信息
List
- 底层实现是双向链表或压缩列表,在Redis3.2之后,底层实现为quicklist
- 所以删除是pop,增加是append
- 使用场景:消息队列
Hash
- 常见hash map
- 注意hash冲突处理?
- 注意性能?
Set
- 可以用于过滤电话号码?
ZSet
- 有序的set,可以用来做排序
- 应用场景:实时排行榜
高级数据结构
BitMap
bitmap本质上本质上是bit数组,可以用于统计大量二值状态的数据(二值状态指集合元素的取值只有0或1),可以有效节省内存空间。
- 使用string类型实现,而string本身就是byte数组,等同于bit数组
即使一天生成1亿(10^8
)的数据,bitmap的内存占用也就10^8/8 ~= 12.5*10^6 bytes ~= 12MB
,一周就是84MB,没有问题。
应用场景: 每天打卡的用户数
HyperLogLog
- 是Redis 2.8.9之后新增的数据结构,用于统计集合中基数(不重复的元素个数)。统计规则是基于概率实现的,误算率为0.81%。
- HyperLogLog提供不精确的去重计数。
- pros:只需要
12KB
内存就可以统计接近2^64
个不同元素的基数,很省空间。- 如果使用long类型,也就是8 bytes,
2^64
个不同元素需要2^64*8 ~= 2^67MB ~= 2^37GB
内存空间
- 如果使用long类型,也就是8 bytes,
为什么Redis快?
- 纯内存操作
- 单线程模型
- 实现简单
- 无锁
- 可虚拟化,单机多实例部署
- 新版redis在网络io操作上使用多线程,但操作数据结构的仍旧是单线程
- 使用epoll(网络I/O多路复用)
备份
- AOF(Append Only File)
- 每执行一次命令添加一行log,可以压缩
- pros:更新频率高;时效性强
- cons:文件大;恢复速度慢
- RDS(Redis Database)
- 二进制文件,即某个时刻Redis的内存拷贝。定期备份
- pros:更新频率低;时效性差
- cons:文件小;恢复速度快
分布式(主从备份)
主节点(Master):
-
负责处理写请求和读请求。
-
将自身的数据异步复制给从节点。
从节点(Slave):
-
只读(默认),也可以配置为可读。
-
从主节点复制数据,可以用来分担读请求或作为备份。
NoSQL是否可以称作KV storage
一部分是(如 Redis、DynamoDB);
但也包含文档(MongoDB)、列式(Cassandra)等模型。
LUA事务
Lua 脚本可以用来实现 Redis 不支持的复杂逻辑,比如:
-
计数器(带过期时间)
-
队列限流
-
带时间窗口的防刷(如滑动窗口限流)
-
多 key 事务控制
-
自定义排行榜逻辑