redis(REmote DIctionary Server)是一个基于内存的,key/value数据库,常用来做缓存。
介绍
Redis 的优点
- 性能极高:Redis 能支持超过 100K+ 每秒的读写频率。
- 丰富的数据类型
- 原子:Redis 的所有操作都是原子性的,同时 Redis 还支持对几个操作全并后的原子性执行。
- 丰富的特性:Redis 还支持 publish/subscribe、通知、key 过期等等特性。
- 支持分布式部署
- 支持 rdp、aof 持久化存储
- 多数据库支持,默认支持 16 个 DB,在
redis.conf中可以配置databases 16指定数据库的个数
Redis 数据类型
常用数据类型如下:
stringslists([]interface{})sets(集合,元素不重复)sorted setshashes(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
- 缓存和数据库一致性
- 写库和写 redis 先后导致
client
- ui
- RedisInsight 是一个功能强大的桌面用户界面,可帮助您为 Redis 和 Redis Stack 可视化和优化数据。
- redisdesktop
- another-redis-desktop-manager
sudo snap install another-redis-desktop-manager示例
访问链接
redis://[:password]@localhost:6379/1go
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>aof 文件损坏问题
redis-check-aof ./appendonly.aof
redis-check-aof --fix ./appendonly.aof替代品
- microsoft/garnet 是微软研究院推出的远程缓存存储,具有强大的性能(吞吐量和延迟)、可扩展性、存储、恢复、集群分片、密钥迁移和复制功能
- 兼容 redis 协议和库
参考
- https://redis.readthedocs.io
- reids 配置方法:
- k8s 部署 redis 集群:
- redis 面试题
最近更新
最新评论