redis(REmote DIctionary Server)
是一个基于内存的,key/value
数据库,常用来做缓存。
介绍
Redis 的优点
- 性能极高:Redis 能支持超过 100K+ 每秒的读写频率。
- 丰富的数据类型
- 原子:Redis 的所有操作都是原子性的,同时 Redis 还支持对几个操作全并后的原子性执行。
- 丰富的特性:Redis 还支持 publish/subscribe、通知、key 过期等等特性。
- 支持分布式部署
- 支持 rdp、aof 持久化存储
- 多数据库支持,默认支持 16 个 DB,在
redis.conf
中可以配置 databases 16
指定数据库的个数
Redis 数据类型
常用数据类型如下:
strings
lists
([]interface{})
sets
(集合,元素不重复)
sorted sets
hashes(hash map)
bitmap
- …
key 命名规则:
- 命名规则:
[a-zA-Z][a-zA-Z0-9_]*
- 层级:使用
:
分隔,如 “app:version”
Redis 持久化方式
有三种持久化方式
RDB(Redis DataBase)
持久化内存数据到磁盘
AOF(Append Only File)
持久化修改数据的命令到 appendonly.aof
- 混合持久化
- 目的:最大化保证恢复数据的速度和数据的完整性
- 实现(Redis 4.0 以后):
- 以 RDB 的方式全量持久化内存数据,保证数据恢复的速度
- 以增量的方式持久化修改命令,保证数据的完整性
- 最终以 RDB 和 AOF 共存的方式写入 AOF 文件
|
RDB |
AOF |
保存内容 |
二级制数据文件 |
Redis 命令 |
数据恢复速度 |
快照恢复速度快 |
命令过多速度慢 |
数据恢复完整性 |
可能丢失数据 |
比 RDB 高 |
Redis 协议
- 参考
- Redis
Server
和 Client
使用 TCP 协议通信
- 服务端默认监听在 6379 端口
- Redis 协议在 1.2 时提出,2.0 时成为通信标准
- 服务端和客户端通信时,一律采用
\r\n(CRLF)
结尾
- Redis 协议请求格式
*<参数数量>\r\n
$<参数 1 的字节数量>\r\n
<参数 1 的数据>\r\n
...
$<参数 N 的字节数量>\r\n
<参数 N 的数据>\r\n
请求发送的数据示例:set key1 value1
,原始数据格式:
*3\r\n$3\r\nSET\r\n$4\r\nkey1\r\n$6\r\nvalue1\r\n
换行生效的格式:
*3
$3
SET
$4
key1
$6
value1
- Redis 协议响应格式
- 第一个字节确定回复类型
+
状态回复(status reply)
-
错误回复(error reply)
:
整数回复(integer reply)
$
批量回复(bulk reply)
*
多条批量回复(multi bulk reply)
- 以
\r\n(CRLF)
结尾
上述示例的回复:
+OK\r\n
常见部署模式
- 单机
- 单 Redis 节点模式 Single instance mode
- 哨兵模式 Sentinel mode
- 集群模式 Cluster mode
- 通过 hash 方式分片写数据到不同的 redis 实例
hash_solt = crc16(key) mod 16384
- 主从模式 Master slave mode
- 使用场景:部分节点宕机或损坏时,可以方式数据丢失、读写分离、增强可用性和扩展性
- 相关命令:
sync
、bgsave RDB
- 增量复制
- 云托管模式设置 Replicated mode
- 扩展
- redis-shake Redis 数据处理和迁移工具,支持在两个 redis 之间同步数据的工具,满足用户非常灵活的同步、迁移需求
- X-Pipe 是由携程框架部门研发的 Redis 多数据中心复制管理系统。基于 Redis 的 Master-Slave 复制协议,实现低延时、高可用的 Redis 多数据中心、跨公网数据复制,并且提供一键机房切换,复制监控、异常报警等功能。
缓存的挑战
缓存穿透
缓存和数据库中都没有的数据时,大量请求直接去 DB 查询数据,导致 DB 压力增大
- 缓存取不到的数据(本身就不存在的缓存)
- 使用
布隆过滤器
判断缓存是否存在
- 为请求设置一个值为 null 的缓存,设置较短的过期时间
缓存击穿
缓存中没有但数据库中有的数据
- 设置热点数据永远不过期
- 过期时间均匀分布
- 接口限流与熔断,降级
- 加互斥锁:采用分布式锁,缓存失效后只有一个线程更新写入
缓存雪崩
数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至挂掉
- 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生
- 如果缓存数据库是分布式部署,将热点数据均匀分布在不同的缓存数据中
- 使用 Redis 哨兵或集群等架构,提高可用性
- 缓存污染(或者磁盘满)
- 配置淘汰策略:noeviction、volatile-random、volatile-ttl、volatile-lru、volatile-lfu、allkeys-lru、allkeys-random 和 allkeys-lfu 策略
- 建议把缓存容量设置为总数据量的 15% 到 30%,兼顾访问性能和内存空间开销
CONFIG SET maxmemory 16gb
- 缓存和数据库一致性
client
sudo snap install another-redis-desktop-manager
示例
访问链接
redis://[:password]@localhost:6379/1
go
ceilometer 实践
127.0.0.1:6379> SMEMBERS _tooz_groups
1) "central-111"
2) "ceilometer.notification"
3) "alarm_evaluator"
4) "central-global"
127.0.0.1:6379> type _tooz_group:central-111
hash
127.0.0.1:6379> type _tooz_group:ceilometer.notification
hash
127.0.0.1:6379> type _tooz_group:central-global
hash
127.0.0.1:6379> type _tooz_group:alarm_evaluator
hash
127.0.0.1:6379> HGETALL _tooz_group:central-111
1) "__created__"
2) "1"
127.0.0.1:6379> HGETALL _tooz_group:ceilometer.notification
1) "__created__"
2) "1"
3) "32cd6ee7-ab1b-4004-bbf6-224ac93bb2f2"
4) "\xc4\x00"
...
127.0.0.1:6379> HGETALL _tooz_group:central-global
1) "__created__"
2) "1"
127.0.0.1:6379> HGETALL _tooz_group:alarm_evaluator
1) "__created__"
2) "1"
3) "382a6e79-1841-466d-8001-49d603267f07"
4) "\xc4\x00"
...
127.0.0.1:6379>
替代品
参考