Redis 专题

发布时间: 更新时间: 总字数:1609 阅读时间:4m 作者: IP上海 分享 网址

redis(REmote DIctionary Server)是一个基于内存的,key/value数据库,常用来做缓存。

介绍

Redis 的优点

  • 性能极高:Redis 能支持超过 100K+ 每秒的读写频率。
  • 丰富的数据类型
  • 原子:Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
  • 丰富的特性:Redis还支持 publish/subscribe、通知、key 过期等等特性。
  • 支持分布式部署
  • 支持 rdp、aof 持久化存储

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 文件
RDBAOF
保存内容二级制数据文件Redis命令
数据恢复速度快照恢复速度快命令过多速度慢
数据恢复完整性可能丢失数据比RDB高

Redis 协议

  • 参考
  • Redis ServerClient 使用 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
    • 使用场景:部分节点宕机或损坏时,可以方式数据丢失、读写分离、增强可用性和扩展性
    • 相关命令:syncbgsave RDB
    • 增量复制
  • 云托管模式设置 Replicated mode

缓存的挑战

  • 缓存穿透 缓存和数据库中都没有的数据时,大量请求直接去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/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>

替代品

  • microsoft/garnet 是微软研究院推出的远程缓存存储,具有强大的性能(吞吐量和延迟)、可扩展性、存储、恢复、集群分片、密钥迁移和复制功能
    • 兼容 redis 协议和库

参考

参考

  1. https://github.com/redis/redis
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数