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,没有问题。
TODO: 实例: 每天打卡的用户数
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多路复用)
日志备份方案?
RDB
- 二进制快照, 数据的直接dump,文件小
- 时效性差,定期全量备份
- BGSAVE命令,背景备份,非阻塞,fork一个子进程来复制dump王文建
- 支持冷备,自动同步到云存储
- 完整备份,所以恢复快,直接加载到内存
AOF
- append only file,文本文件,每个更新命令的执行都需要记录,文件大
- 可以rewrite压缩减少记录内容
- 时效性高,支持秒级的备份,更新很快,但对cpu和硬盘的压力大。
- 恢复时需要一条条重放,恢复速度慢