概述
Redis作为业界广泛采用的中间件,在百胜中国的消费者IT应用系统中被作为高速缓存的标准组件,得到了大量使用。截止本文V1.0版本成文时(2021.11.22),百胜S级业务系统使用的Redis实例已经超过了1000个。
为了规范Redis的部署和运维工作、指导开发人员正确地使用Redis,IT运维团队结合Redis的技术特点以及公司实际现状,制定了本规范。
目前百胜Redis正在逐渐向公有-自建混合云部署模式过渡,本文档中的技术标准基于百胜自建Redis规范、华为云Redis服务(产品名称:分布式缓存服务DCS)和腾讯云Redis服务(产品名称:云数据库Redis)。本文档应随百胜的Redis管理策略不断进化,扩展和更新内容。
本文档的面向对象为:公司所有与Redis相关的IT架构设计、开发、运维和DBA人员。
一、 Redis介绍
-
Redis简介
Redis是一个开源的数据结构内存存储,常被用作缓存和消息代理中间件。Redis提供的数据结构包括:字符串、哈希值、列表、集合、排序集合、位图、地理空间索引等。
-
适用 场景
Redis作为一种内存型的高性能key-value NoSQL存储,其技术设计基于如下出发点:
- 读写请求响应速度高于传统关系型数据库
- 适合高并发场景
- 对服务可用性的保障>对数据完整性的保障
- 无数据一致性校验
因此,Redis在百胜业务模式中的一些常见适用场景如下:
a. 高并发场景下 的 热点数据缓存
高并发场景下,合理的使用缓存不仅能够提升网站访问速度,还能降低后端数据库的压力。请参考“四、 使用规范- 4.缓存模式最佳实践”一节了解最佳实践。
b. 限时业务的运用
Redis中的每个key都可以设置过期时间,这一特性可运用在限时优惠信息、订单库存过期、手机验证码等高并发量、且对数据一致性基本无要求的业务场景。
c. 缓存会话session信息
使用Redis的key过期功能,还可以方便地实现用户会话session的缓存和过期管理。
d. 计数器
Redis天然支持计数功能,在高并发下计数器性能优于传统的关系型数据库。常用于商品的浏览数、视频的播放数、限制调用等。
二、 技术规范
-
版本规范
目前百胜运维团队支持对如下Redis版本的交付与维护工作:
- Redis 5.0.9+
- Redis 6.0.10+
- 暂时不支持6.2及以上的版本
-
百胜云Redis功能
截止2021年11月,在已调研的两家公有云Redis服务中,均支持所有常见的redis命令。与官方开源版本相比,兼容性达到99%以上。百胜自建redis基于官方开源版本,与公有云redis的命令覆盖率相同。
完整的参数和命令支持清单请见文档附录。
百胜云redis不论基于公有云还是自建区,都能提供一致的服务体验。
-
架构规范
百胜Redis服务现阶段采用公有云-自建混合部署架构。提供基于多副本的高可用容灾功能,当主节点发生故障时,可实现故障的快速恢复。百胜运维团队支持交付的架构有分片集群、主从高可用2种。另外,运维团队对存量的哨兵集群提供基础维护,但不再交付新的哨兵集群。几种架构的对比如下:
| 高可用模式 | 客户端 连接 入口 | Redis命令支持情况 | 可 扩容 性 | 故障恢复功能 |
|---|---|---|---|---|
| 分片集群 | 连接所有节点 | 不支持部分跨分片扫描命令 | 通过增加分片可横向扩容至256GB | 自动故障转移 |
| 主从高可用 | 连接高可用地址 | 支持所有命令 | 最大可扩展至16GB | 自动故障转移 |
| 哨兵集群 | 连接哨兵节点,通过哨兵节点发现Redis | 支持所有命令 | 最大可扩展至16GB | 客户端实现故障探测和连接切换 |
a. 分片集群
Redis原生的集群架构,可实现数据的横向分片与主从高可用功能。提供所有分片节点地址信息,每个节点都和其他所有节点连接,客户端需要配置所有节点地址信息来实现Redis高可用和故障自动切换。
【注意】 :该模式不支持部分跨分片扫描命令。完整的命令支持清单请见本文档结尾的附录。
b. 主从高可用
为保障Redis主从架构的高可用性,提供一个高可用入口,此高可用入口可支持Redis实例所有命令功能,客户端配置此高可用入口地址即可使用Redis服务。当Redis发生故障时,客户端无需更改连接配置地址。
c. 哨兵集群
由于公有云不对外提供其哨兵节点,因此目前 新交付的实例已 不支持此种高可用模式 Redis,只针对已经存在的老集群做向前兼容。
-
混合云 主备 站部署
对于跨站访问同一套Redis的应用,推荐采用公有云-自建混合部署的模式。
这一模式下,以公有云为主站,云上采用主从同步保障服务可用性。同时在百胜自建机房部署一套备用Redis集群。当云上服务发生大面积故障时,应用切换至自建备用Redis继续使用。
【 注意 】运维团队不提供如下服务:
- Redis的跨集群数据迁移/同步操作
- 跨站点的Redis主从同步
-
自建-公有云参数规范
以下表格列出了Redis核心参数的用途和规范值。除了部分与资源分配相关的参数外,其余参数满足自建和云上一致,以保证各环境各单元的一致性。完整的参数清单请见本文档的附录。
| 参数 | 规范值 | 参数说明 |
|---|---|---|
maxmemory | 自建:OS总内存的50%云上:实例分片内存 | Redis实例中用于存储数据的最大内存大小 |
maxmemory-policy | volatile-lru | 当已用内存达到maxmemory时的Key淘汰策略 |
maxclients | 20000 | 每个Redis实例允许的最大客户端连接数,2025.6.26由10000修改为20000 |
appendonly | no | 百胜云Redis不开启此参数 |
save | no | 百胜云Redis不开启此参数 |
slowlog-log-slower-than | 10000 | 慢查语句的记录阈值,规范值为10毫秒(10000微秒),即执行时间超过10毫秒的操作会被记录 |
lua-time-limit | 5000 | Lua脚本最大执行时间,规范值为5000毫秒(5秒) |
三、资源规格
Redis资源配置以套餐的形式提供。可用套餐如下:
| Redis套餐 | 集群模式 | Redis可用容量 | QPS基线 | 网络吞吐量(每分片) | 备注 | 自建区VM资源 |
|---|---|---|---|---|---|---|
| redis.ha.v1.4g | 主从高可用 | 4 GB | 80,000 | 24MB/s | 主从高可用集群最大可纵向扩展至32GB | 4c/8g/50G ×3 |
| redis.ha.v1.8g | 主从高可用 | 8 GB | 80,000 | 32MB/s | 如预估未来业务会增长至16GB以上,建议项目最初选型即考虑分片集群 | 4c/16g/50G ×24c/8g/50G ×1 |
| redis.ha.v1.16g | 主从高可用 | 16 GB | 80,000 | 32MB/s | 自建区3台主机资源中,1台4c/8g/50G主机为共享哨兵资源 | 8c/32g/50G ×24c/8g/50G ×1 |
| redis.cluster.v1.24g | 分片集群 | 24 GB | 240,000 | 96MB/s | 4c/16g/50G ×6 | |
| redis.cluster.v1.32g | 分片集群 | 32 GB | 320,000 | 96MB/s | 4c/16g/50G ×8 | |
| redis.cluster.v1.40g | 分片集群 | 40 GB | 400,000 | 96MB/s | 分片集群可通过增加节点进行横向扩展 | …… |
| redis.cluster.v1.48g | 分片集群 | 48 GB | 480,000 | 96MB/s | 6主6从 | 4c/16g/50G ×12 |
| redis.cluster.v1.64g | 分片集群 | 64 GB | 640,000 | 96MB/s | 8主8从 | 4c/16g/50G ×16 |
| redis.cluster.v1.96g | 分片集群 | 96 GB | 960,000 | 96MB/s | 12主12从 | 4c/16g/50G ×24 |
| redis.cluster.v1.128g | 分片集群 | 128 GB | 1280,000 | 128MB/s | ||
| redis.cluster.v1.192g | 分片集群 | 192 GB | 1920,000 | 192MB/s | ||
| redis.cluster.v1.256g | 分片集群 | 256 GB | 2560,000 | 192MB/s | 集群容量最大可扩展至256GB | 4c/16g/50G ×64 |
基于以上配置,交付的Redis性能基线参考值如下:
- QPS参考基线
a. 主从高可用QPS约8万
b. 分片集群QPS约8万/分片
- 网络吞吐量限制
a. 主从高可用网络吞吐量≤32MB/S
b. 分片集群网络吞吐量≤256MB/S
具体资源规格请根据实际业务情况进行合理选择,避免造成资源浪费。
【注意】 :自建Redis在创建和分配主机时,需进行反亲和处理。即同一集群同一角色的主机,需要分布在不同的物理机上,以确保物理机故障时主备策略能够生效,集群整体仍能对外提供服务。
四、使用规范
本节主要介绍实践中的缓存模式最佳实践,并从键值设计、Redis命令使用和应用规约等方面,描述百胜Redis运维和使用规范。
-
键值原则
-
To do
a.【推荐】 Key名称必须为可使用特定字符
同一业务系统使用统一的key命名规范。
redis中key的命名,建议用
:分隔不同的层次|命名空间,如:user:id12345:contact;
如果某个对象有字段的字段,可用
.连接接作为属性字段。如user:id12345:contact.mail
b.【强制】 必须控制key的总数量
Redis实例包含的键个数应控制在10,000,000(1千万)以内。单实例的键个数过大,可能导致过期键的回收不及时,从而导致内存不足
c.【推荐】 应控制key名称的长度
在保证语义清晰的情况下,应尽可能减少key的长度。有些常用单词可使用缩写,例如,user缩写为u,messages缩写为msg等
d.【推荐】 应选择合适的数据类型
目前Redis支持的数据库结构类型较多,需要根据业务场景选择合适的数据类型。常用数据类型和适用场景如下
| 数据类型 | 适用场景 |
|---|---|
| string | 适合存储数量级较小(<100),且变换频繁的数据,如计数器、状态器应用 |
| hash | 适合存储表级数据,如存储某张用户表的所有数据 |
| list | 适合做为栈、队列使用,如存储评论、消息队列等 |
| set | 适合存储不可重复类、及需要进行集合间进行交、差、并操作的数据 |
| sorted set | 适合存储需要进行排序的数据(由于在List中也隐藏了基于时间的排序功能,尽量在SortedSet中不要存储按时间排序的数据) |
以存储用户信息为例,根据业务形态不同,推荐如下两种方式之一:
-
使用多个key来分别存储一个用户的不同属性字段,如
set u:1:name "X"、set u:1:age 20 -
将每个用户存储成1个hash类型的key;设置用户属性时使用
hmset一次设置多个元素
不推荐的方式:
-
将用户信息编码为json后,保存在单个string类型的key中
e.【推荐】Redis最大连接数应小于20000
Redis服务器是单线程运行,如果创建太多的Redis客户端连接,可能会导致性能下降,因此需要对最大连接数进行限制。根据Redis最佳实践,我们将每个Redis服务器的最大连接数限制在了20000。这一限制在自建、火山云和容器环境中均有紧急临时扩容的能力。
对于应用端,我们建议每Java实例的Redis连接数参考CPU核数的两倍。在一般的读写场景下,我们建议应用采用以下初始配置,并根据压测的情况逐步调整至最优值:
maxTotal: 50minIdle: 5maxIdle: 20
-
Not to do
a.【强制】 Key名称不得包含特殊字符
如:下划线、空格、换行、单双引号、非ASCII字符以及其他转义字符
b.【强制】 禁止出现超大key
Redis的单线程设计使得大key非常容易成为阻塞瓶颈。单个string类型的key,value应控制在10KB以内;hash、list、set、zset类型的key,value元素个数不应超过5000
c.【强制】 禁止出现不设置过期时间的key
所有的key都必须设置过期时间,并通过在过期时间上随机加减偏移量的方式,将过期时间打散,避免key集中过期导致性能波动
-
命令使用
-
To do
a.【强制】 时间复杂度为O(n)命令应关注n的数量
Redis是单线程执行命令。HGETALL、LRANGE、SMEMBERS、ZRANGE、SINTER这些命令都是做全集操作,若元素很多,效果类似
KEYS命令。可使用HSCAN、SSCAN、ZSCAN这些分批扫描的命令代替。
b. 【推荐】 应使用批命令提高效率
如果有批量操作,可使用
MSET/MGET/HMSET/HMGET等,取代多次单键操作,可有效减少维护网络连接和传输数据所消耗的资源和时间。
-
Not to do
a.【强制】 生产环境禁止使用KEYS命令
Redis 是单线程处理,在线上key数量较多时,一旦执行该命令会严重阻塞线上其它命令的正常请求,而且在高 QPS 情况下会直接造成 Redis 服务崩溃。
如果需要对所有key进行遍历,应使用
SCAN命令分批处理,每批限制不超过100个key。
b.【强制】 禁止使用FLUSHALL、FLUSHDB命令
生产环境禁止使用
FLUSHALL、FLUSHDB命令。FLUSHALL、FLUSHDB会清空 Redis 数据。如需紧急清空某个环境的Redis,应先将业务切站后,再联系运维团队处理。
c. 【强制】 禁止SELECT命令(多DB功能),仅使用db0
Redis集群架构不支持多DB功能;主从模式下,对不同DB的操作仍然是单线程处理的,会增加运维复杂度。因此该命令不开放。
d.【强制】 慎用MONITOR命令
Redis的
MONITOR命令用于实时打印出Redis服务器接收到的命令,此命令会造成Redis的压力增大,因此仅限DBA排障使用。
e.【强制】 注意使用DEL命令
删除一个key,需先考虑时间复杂度。若删除一个string类型的key,时间复杂度为O(1),可直接删除;若删除一个list/hash/set/zset类型是,复杂度为O(n),元素越多,就越慢。当n很大时,要尤其注意,会阻塞主线程。
-
hash类型的大key,建议使用
HSCAN+HDEL -
list类型的大key,建议使用
ITRIM -
set类型的大key,建议使用
SSCAN+SREM -
sorted set类型的大key,建议使用
ZSCAN+ZREM
f.【推荐】 建议不在Lua脚本中使用耗时的代码
Lua脚本执行时会阻塞Redis主线程。建议不要在lua脚本中使用比较耗时的代码,如长时间的
sleep、大循环等语句。
g.【推荐】 调用Lua脚本时,建议不要使用随机函数执行key。
若在Lua脚本中使用随机函数执行key,可能会出现在主备节点上执行结果不一致,从而导致主备节点数据不一致。
-
应用规约
To do
a.【强制】 应设置用户登录密码
为保障业务安全,新交付的Redis实例强制要求密码验证(Redis 5.0)或用户名+密码验证(Redis 6.0+)。
b.【强制】 程序逻辑设计时应考虑缓存丢失和击穿
百胜IT应用架构体系中,Redis的定位为缓存中间件。使用Redis时,应充分考虑Redis原生架构无法保证数据的可靠性和一致性。因此,在程序设计时,应考虑和实现键值随时失效时的数据更新方法。对有如下场景需求的应用,应在关系型数据库进行数据持久化,并实现Cache-Aside Pattern:
-
数据一致性、完整性要求高的
-
程序需要跨站
c.【强制】 上线前应预估Redis数据容量
申请生产环境Redis前,业务方应提前在测试环境中,通过模拟数据进行线上数据容量的预估。并在申请资源时基于业务增长趋势预留合理的内存空间,避免出现频繁扩容的情况。
d.【强制】 程序应配置拓扑刷新功能自动识别Redis节点变更信息
为防止Redis主从角色发生变化或扩容缩容产生的增减节点变更,程序无法获取的情况,应用程序需配置拓扑刷新功能,自动识别节点变更信息及状态。
对于使用Lettuce客户端的应用,可以借鉴此文档的推荐方案一开启自适应刷新。
e.【建议】 建议使用连接池和长连接。
通过连接池和长连接,可有效保证Redis缓存的请求速度,避免频繁连接带来的性能损耗。
f.【建议】 建议做淘汰策略选择。
百胜Redis的key淘汰策略默认为
volatile-lru,即超过最大内存后,在过期键中使用LRU算法进行key的排除,以尽可能腾出足够空间,保证Redis服务的可用性。
【注意】 当Redis中存在大量未设置过期时间的key,导致默认策略也无法清理时,DBA会将淘汰策略升级为
allkeys-lru,即不管key有没有设置超时属性,都会根据LRU算法被删除,直到腾出足够空间为止。
Not to do
a.【强制】 使用pipeline时,一次命令总数量不得超过1024。
b.【推荐】 建议多个应用不使用同一个实例
避免多个应用使用一个Redis实例。不要将不相同的业务数据都放在一个实例中,建议新业务申请新的单独实例。因为Redis为单线程处理,独立储存会减少不同业务互相操作的影响,提高请求响应速度;同时也避免单个实例内存数据量膨胀过大,在出现异常情况时,可更快恢复服务,公共数据做服务化。
-
缓存模式最佳实践
DBA团队建议在程序设计时,对于缓存数据来源于后端数据库的业务,采用Cache-Aside Pattern来设计缓存的存取逻辑。该模式可以最大限度地保证DB和缓存的数据一致性,并提升缓存性能。
Cache-Aside Pattern的详细介绍请见文档结尾的附录。
五、监控告警
-
监控维度
IT运维团队会基于以下KPI对Redis进行监控和告警:
- 主机资源监控(限自建Redis):CPU、内存、磁盘、网络
- Redis服务指标:节点存活情况、节点数、主从复制情况
- Redis性能指标:每秒操作数OPS、命令响应时间、慢查数量、命令CPU开销、网络开销
- Redis容量指标:key数量(总数、有无过期时间、淘汰数)、最大内存、已用内存
-
监控告警架构
a. 公有云
公有云Redis服务采用Prometheus + 原生Redis Exporter(github.com/oliver006/r… + Grafana方式进行监控,并对核心指标提供监控大屏及告警。
b. 自建
自建Redis由百胜Redis DMP平台管理,平台提供内置的监控告警功能,并提供监控大屏。
-
服务等级
IT运维团队对Redis的服务支持由DBA团队提供,服务等级定义同线上业务应用分级。
原则上Redis的服务等级等于或低于所属应用的分级。
六、生命周期管理
-
IAC申请
-
扩缩容
DBA手动操作
-
IAC下线
参照:服务器下线操作规范(虚机下线部分)
七、L1~L3职责范围
| 级别 | 职责范围 | 相关文档/链接 |
|---|---|---|
| L1 | 日常巡检 | 云下: TechOps-Redis-On-Premises(DMP通用)云上: TechOPS-Redis-PaaSyumc0: TechOps-Redis-On-Premises-yumc0-paas |
| 监控查看 | ||
| 餐期值守 | TechOps-Redis值班监控 | |
| L2 | 安装部署 | 安装部署 |
| 扩缩容 | 扩缩容 | |
| 迁移 | 迁移 | |
| 下线 | 下线 | |
| 压测支持 | - | |
| 大key&热key分析优化 | - | |
| 压测数据清理 | - | |
| 监控配置&刷新 | 监控告警 | |
| L1升级问题处理 | 详见:八、异常处理SOP | |
| L3 | L2升级问题处理、规范制定、跨团队沟通事宜等 |
八、异常处理SOP
-
全局唯一Redis
| Redis | 故障切换预案 | 备注 | 操作人 |
|---|---|---|---|
| s1019-coupon-Redis-share-unit0 | 出现故障时,无需切换Redis, 清空对应站点流量即可 开发需改数据库,去掉问题站点的Redis IP | 本站调本站 | 孙伟 |
| s1019-coupon-Redis-share-unit1 | 出现故障时, 开发直接操作 1. 操作补偿工具:选择【redis1Cluster】,选择【KS】选项,点击“确认”按钮 2. 点击刷新,待1分钟后生效配置 工具地址: http://172.31.50.208/couponMgmt/index.jsp coupon redis unit 1 切换演练 | 全局唯一 | 孙伟 |
| s1019-coupon-Redis-share-unit3 | 出现故障时,开发直接操作,配置保存在DB 1. 火山云操作,停止DTS同步(hs->ks) 2. 开发通过工具,将Redis切换至KS 工具地址: http://172.31.50.208/couponMgmt/index.jsp | 全局唯一 | 孙伟,任佳华 |
| s1019-coupon-Redis-share-unit4 | 出现故障时,开发直接操作,配置保存在DB 1. 火山云操作,停止DTS同步(hs->ks) 2. 开发通过工具,将Redis切换至KS 工具地址: http://172.31.50.208/couponMgmt/index.jsp | 全局唯一 | 孙伟,任佳华 |
| s1039-gift-card-Redis-share-egc | 5个环境执行切换按钮 (当前使用的是KSA) jenkins-ops.hwwt2.com/job/applica… | 全局唯一 | 赵志峰 |
| s1022-vgold-Redis-share-unit1 | 出现故障时,需要去Apollo修改Redis连接配置,然后重启服务 vgold-service-member / vgold-service-member-listener vgold-platform / vgold-platform-listener vgold-point / vgold-point-listener vgold-tempaccount / vgold-tempaccount-listener | 全局唯一, 纯缓存 | 赵志峰 |
| s1023-vgold-Redis-kfc-vgoldtrade | 出现故障时,需要去Apollo修改Redis连接配置,然后重启服务 vgoldtrade-listener / vgoldtrade-web | 全局唯一, 纯缓存 | 赵志峰 |
| s1226-superapp-Redis-share-mkt | 出现故障时,需要停止HS同步, 再去Apollo修改Redis连接配置,然后重启服务 App MKT Redis故障切换预案wbs | 全局唯一 | 任佳华,杨杰 |
| s1226-superapp-Redis-share-flashmkt | 出现故障时,需要停止HS同步, 再去Apollo修改Redis连接配置,然后重启服务 App MKT Redis故障切换预案wbs | 全局唯一 | 任佳华,杨杰 |
| redis-dpc-redpac-ksa | 出现故障时,需要停止HS同步, 再去Apollo修改Redis连接配置,然后重启服务 App MKT Redis故障切换预案wbs | 全局唯一 | 任佳华,杨杰 |
详情参见:营销中间件切换预案
-
内存使用率超过80%
- 设置maxmemory:要设置Redis的最大内存使用量不超过主机内存的75%,假设主机内存为16GB,那么Redis的最大内存设置为12GB(12GB = 12 * 1024 * 1024 * 1024 bytes)
CONFIG SET maxmemory 12gb
- 通知应用运维
- 修改maxmemory-policy:如果扩容后问题仍未解决,需要将内存淘汰策略修改为
allkeys-lru
CONFIG SET maxmemory-policy allkeys-lru
请注意,确保在执行这些命令之前已经备份了Redis的数据,以防止数据丢失
-
CPU使用率超过80%
- 提供client IP连接数给开发
-
连接数超过75%
- 清空对应单元的业务流量
- 如无法切站,临时调整最大连接至25000
CONFIG SET maxclients 25000
附录
-
Redis命令清单
以下清单列出了原生Redis中包含的所有命令。百胜云Redis支持的命令以'√'标出;其余命令由于下列原因不受百胜云Redis支持,用'x'标识:
a.会对Redis性能造成较大影响
b.会对Redis服务的稳定性造成影响
c.技术限制不支持此类命令
| 类别 | 命令 | 百胜云Redis |
|---|---|---|
| keys | DEL | √ |
| DUMP | √ | |
| EXISTS | √ | |
| EXPIRE | √ | |
| EXPIREAT | √ | |
| KEYS | √ | |
| MOVE | √ | |
| PERSIST | √ | |
| PTTL | √ | |
| RANDOMKEY | √ | |
| RENAME | √ | |
| RENAMENX | √ | |
| RESTORE | √ | |
| SORT | √ | |
| TTL | √ | |
| TYPE | √ | |
| SCAN | √ | |
| OBJECT | √ | |
| PEXPIREAT | √ | |
| PEXPIRE | √ | |
| MIGRATE | × | |
| WAIT | × | |
| string | APPEND | √ |
| BITCOUNT | √ | |
| BITOP | √ | |
| BITPOS | √ | |
| DECR | √ | |
| DECRBY | √ | |
| GET | √ | |
| GETSET | √ | |
| GETBIT | √ | |
| GETRANGE | √ | |
| INCR | √ | |
| INCRBY | √ | |
| INCRBYFLOAT | √ | |
| MGET | √ | |
| MSET | √ | |
| MSETNX | √ | |
| PSETEX | √ | |
| SET | √ | |
| SETBIT | √ | |
| SETEX | √ | |
| SETNX | √ | |
| SETRANGE | √ | |
| STRLEN | √ | |
| BITFIELD | √ | |
| Hash | HDEL | √ |
| HEXISTS | √ | |
| HGET | √ | |
| HGETALL | √ | |
| HINCRBY | √ | |
| HINCRBYFLOAT | √ | |
| HKEYS | √ | |
| HMGET | √ | |
| HMSET | √ | |
| HSET | √ | |
| HSETNX | √ | |
| HVALS | √ | |
| HSCAN | √ | |
| HSTRLEN | √ | |
| HLEN | √ | |
| List | BLPOP | √ |
| BRPOP | √ | |
| BRPOPLRUSH | √ | |
| LINDEX | √ | |
| LINSERT | √ | |
| LLEN | √ | |
| LPOP | √ | |
| LPUSHX | √ | |
| LRANGE | √ | |
| LREM | √ | |
| LSET | √ | |
| LTRIM | √ | |
| RPOP | √ | |
| RPOPLPU | √ | |
| RPOPLPUSH | √ | |
| RPUSH | √ | |
| RPUSHX | √ | |
| LPUSH | √ | |
| Set | SADD | √ |
| SCARD | √ | |
| SDIFF | √ | |
| SDIFFSTORE | √ | |
| SINTER | √ | |
| SINTERSTORE | √ | |
| SISMEMBER | √ | |
| SMEMBERS | √ | |
| SMOVE | √ | |
| SPOP | √ | |
| SRANDMEMBER | √ | |
| SREM | √ | |
| SUNION | √ | |
| SUNIONSTORE | √ | |
| SSCAN | √ | |
| Sorted Set | ZADD | √ |
| ZCARD | √ | |
| ZCOUNT | √ | |
| ZINCRBY | √ | |
| ZRANGE | √ | |
| ZRANGEBYSCORE | √ | |
| ZRANK | √ | |
| ZREMRANGEBYRANK | √ | |
| ZREMRANGEBYCORE | √ | |
| ZREVRANGE | √ | |
| ZREVRANGEBYSCORE | √ | |
| ZREVRANK | √ | |
| ZSCORE | √ | |
| ZUNIONSTORE | √ | |
| ZINTERSTORE | √ | |
| ZSCAN | √ | |
| ZRANGEBYLEX | √ | |
| ZLEXCOUNT | √ | |
| ZPOPMIN | √ | |
| ZPOPMAX | √ | |
| ZREMRANGEBYSCORE | √ | |
| ZREM | √ | |
| HyperLoglog | PFADD | √ |
| PFCOUNT | √ | |
| PFMERGE | √ | |
| Pub/Sub | PSUBSCRIBE | √ |
| PUBLISH | √ | |
| PUBSUB | √ | |
| PUNSUBSCRIBE | √ | |
| SUBSCRIBE | √ | |
| UNSUBSCRIBE | √ | |
| Transactions | DISCARD | √ |
| EXEC | √ | |
| MULTI | √ | |
| UNWATCH | √ | |
| WATCH | √ | |
| Connection | AUTH | √ |
| ECHO | √ | |
| PING | √ | |
| QUIT | √ | |
| SWAPDB | × | |
| SELECT | √ | |
| Scripting | EVAL | √ |
| EVALSHA | √ | |
| SCRIPT EXISTS | √ | |
| SCRIPT FLUSH | √ | |
| SCRIPT KILL | √ | |
| script debug | × | |
| SCRIPT LOAD | √ | |
| Geo | GEOADD | √ |
| GEOHASH | √ | |
| GEOPOS | √ | |
| GEODIST | √ | |
| GEORADIUS | √ | |
| GEORADIUSBYMEMBER | √ | |
| Stream | XACK | √ |
| XADD | √ | |
| XCLAIM | √ | |
| XDEL | √ | |
| XGROUP | √ | |
| XINFO | √ | |
| XLEN | √ | |
| XPENDING | √ | |
| XRANGE | √ | |
| XREAD | √ | |
| XREADGROUP | √ | |
| XREVRANGE | √ | |
| XTRIM | √ | |
| Server | FLUSHALL | × |
| FLUSHDB | × | |
| DBSIZE | √ | |
| TIME | √ | |
| INFO | √ | |
| KEYS | √ | |
| CLIENT LIST | √ | |
| CLIENT KILL | √ | |
| CLIENT GETNAME | √ | |
| CLIENT ID | × | |
| CLIENT SETNAME | √ | |
| CLENT UNBLOCK | × | |
| CLIENT PUSH | × | |
| client pause | × | |
| CLIENT REPLY | × | |
| CONFIG GET | √ | |
| MONITOR | √ | |
| SLOWLOG | √ | |
| ROLE | √ | |
| SWAPDB | × | |
| MEMORY | √ | |
| SLAVEOF | × | |
| SHUTDOWN | × | |
| LASTSAVE | × | |
| COMMAND COUNT | × | |
| COMMAND GETKEYS | × | |
| COMMAND INFO | × | |
| COMMAND GET | × | |
| COMMAND | × | |
| CONFIG | × | |
| CONFIG SET | × | |
| CONFIG RESETSTAT | × | |
| CONFIG REWRITE | × | |
| SAVE | × | |
| BGSAVE | × | |
| BGREWRITEAOF | × | |
| SYNC | × | |
| PSYNC | × | |
| DEBUG OBJECT | × | |
| DEBUG SEGFAULT | × | |
| REPLICAOF | × |
-
Redis参数清单
Redis的参数清单请见下表:
| 分类 | 参数名 | 含义 | 默认值 | |
|---|---|---|---|---|
| 基础配置参数 | daemonize | 是否是守护进程 | yes | |
| port | 端口号 | 整数 | ||
| loglevel | 日志级别 | notice | ||
| logfile | 日志文件名 | /data/redis/redis/log/6379/redis.log | ||
| pidfile | Redis运行的进程Pid文件 | /data/redis/redis/data/6379/redis.pid | ||
| tcp-backlog | tcp-backlog | 2048 | ||
| dir | 工作目录(aof、rdb、日志文件都存放在此目录) | /data/redis/redis/data/6379 | ||
| 内存相关参数 | maxmemory | 最大可用内存(单位字节) | 总内存的50% | |
| maxmemory-policy | 淘汰策略 | volatile-lru | ||
| AOF相关配置参数 | appendonly | 是否开启AOF持久化模式 | no | |
| appendfsync | AOF同步磁盘频率 | everysec | ||
| appendfilename | AOF文件名 | appendonly.aof | ||
| aof-load-truncated | 加载AOF文件时,是否忽略AOF文件不完整的情况,让Redis正常启动 | yes | ||
| auto-aof-rewrite-min-size | 触发rewrite的AOF文件最小阀值,单位MB | 2gb | ||
| auto-aof-rewrite-percentage | 触发rewrite的AOF文件的增长比例条件 | 100 | ||
| RDB相关配置参数 | save | RDB触发条件 | " " | |
| dbfilename | RDB文件名 | dump.rdb | ||
| rdbcompression | RDB文件是否压缩 | yes | ||
| rdbchecksum | RDB文件是否使用校验和 | yes | ||
| stop-writes-on-bgsave-error | bgsave执行错误,是否停止Redis接受写请求 | no | ||
| 慢查询相关配置参数 | slowlog-log-slower-than | 慢查询被记录的阀值,单位微秒 | 10000 | |
| slowlog-max-len | 最多记录慢查询的条数 | 1000 | ||
| 复制相关配置 | slaveof | 指定当前从节点复制哪个主节点,参数:主节点ip和port | ip port | |
| repl-ping-slave-period | 主节点定期向从节点发送ping命令的周期,用于判定从节点是否存活。单位秒 | 10 | ||
| repl-backlog-size | 复制积压缓存区大小 | 1gb | ||
| repl-backlog-ttl | 主节点在没有从节点的情况下多长时间后释放复制积压缓存区空间,单位秒 | 3600 | ||
| slave-priority | 从节点的优先级 | 100 | ||
| slave-read-only | 从节点是否开启只读模式 | yes | ||
| repl-disable-tcp-nodelay | 是否开启主从复制socket的NO_DELAY选项 | no | ||
| repl-diskless-sync | 是否开启无盘复制 | no | ||
| repl-diskless-sync-delay | 开启无盘复制后,需要延迟多少秒后进行创建RDB操作,一般用于同时加入多个节点时,保证多个从节点共享RDB | 5 | ||
| 客户端相关配置 | maxclients | 最大客户端连接数 | 20000 | |
| client-output-buffer-limit | 客户端输出缓冲区限制 | normal 0 0 0 slave 268435456 67108864 60 pubsub 33554432 8388608 60 | ||
| timeout | 客户端闲置多少秒后关闭连接,单位秒 | 3600 | ||
| tcp-keepalive | 检测TCP连接活性的周期,单位秒 | 60 | ||
| 安全相关配置参数 | requirepass | 密码 | 自定义 | |
| bind | 绑定IP | 自定义 | ||
| masterauth | 从节点需要配置的主节点密码 | 主节点密码 | ||
| user default off ~* +@all | 6.0+专有参数 | |||
| 哨兵相关配置参数 | sentinel monitor | 定义监控的主节点名、ip、port、主观下线票数 | 自定义masterName实际的ip port 票数 | |
| sentinel down-after-milliseconds | sentinel判定节点不可达的毫秒数 | 整数 | ||
| sentinel parallel-syncs | 在执行故障转移时,最多有多少个从服务器同时对新的主服务器进行同步 | 大于0,不超过从服务器个数 | ||
| sentinel failover-timeout | 故障迁移超时时间 | 整数 | ||
| sentinel auth-pass | 主节点密码 | 主节点密码 | ||
| sentinel notification-script | 故障转移期间脚本通知 | 脚本文件路径 | ||
| sentinel client-reconfig-script | 故障转移成功后脚本通知 | 脚本文件路径 | ||
| cluster相关配置参数 | cluster-node-time | 集群节点超时时间,单位毫秒 | 15000 | |
| cluster-migration-barrier | 主从节点切换需要的从节点数最小个数 | 1 | ||
| cluster-slave-validity-factor | 从节点有效性判断因子,当从节点与主节点最后通信时间超过(cluster-node-timeout*slave-validity-factor)+repl-ping-slave-period时,对应从节点不具备故障转移资格,防止断线时间过长的从节点进行故障转移,设置为0表示从节点永不过期 | 10 | ||
| cluster-require-full-coverage | 集群是否需要所有的slot都分配给在线节点,才能正常访问 | no | ||
| cluster enabled | 是否开启集群模式 | yes | no | |
| cluster-config-file | 集群配置文件名称 | nodes.conf | ||
| 数据结构优化配置 | hash-max-ziplist-entries | hash数据结构优化参数 | 512 | |
| hash-max-ziplist-value | hash数据结构优化参数 | 64 | ||
| list-max-ziplist-entries | list数据结构优化参数 | 整数 | ||
| list-max-ziplist-value | list数据结构优化参数 | 整数 | ||
| set-max-insert-entries | set数据结构优化参数 | 整数 | ||
| zset-max-ziplist-entries | zset数据结构优化参数 | 128 | ||
| zset-max-ziplist-value | zset数据结构优化参数 | 64 | ||
| hll-sparse-max-bytes | HyperLogLog数据结构优化参数 | 3000 |
-
Cache-Aside Pattern
具体规则如下:
-
读场景
a.应用尝试从Redis读取缓存数据
b.如miss,应用从数据库中读取数据,并执行步骤3;如hit,则应用直接进行后续业务处理
c.应用将数据写入缓存
-
写场景
a.应用删除缓存
b.应用将数据写入数据库