redis日常使用规范

104 阅读27分钟

概述

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介绍

  1. Redis简介

Redis是一个开源的数据结构内存存储,常被用作缓存和消息代理中间件。Redis提供的数据结构包括:字符串、哈希值、列表、集合、排序集合、位图、地理空间索引等。

  1. 适用 场景

Redis作为一种内存型的高性能key-value NoSQL存储,其技术设计基于如下出发点:

  • 读写请求响应速度高于传统关系型数据库
  • 适合高并发场景
  • 对服务可用性的保障>对数据完整性的保障
  • 无数据一致性校验

因此,Redis在百胜业务模式中的一些常见适用场景如下:

a. 高并发场景下 热点数据缓存

高并发场景下,合理的使用缓存不仅能够提升网站访问速度,还能降低后端数据库的压力。请参考“四、 使用规范- 4.缓存模式最佳实践”一节了解最佳实践。

b. 限时业务的运用

Redis中的每个key都可以设置过期时间,这一特性可运用在限时优惠信息、订单库存过期、手机验证码等高并发量、且对数据一致性基本无要求的业务场景。

c. 缓存会话session信息

使用Redis的key过期功能,还可以方便地实现用户会话session的缓存和过期管理。

d. 计数器

Redis天然支持计数功能,在高并发下计数器性能优于传统的关系型数据库。常用于商品的浏览数、视频的播放数、限制调用等。




二、 技术规范

  1. 版本规范

目前百胜运维团队支持对如下Redis版本的交付与维护工作:

  • Redis 5.0.9+
  • Redis 6.0.10+
  • 暂时不支持6.2及以上的版本
  1. 百胜云Redis功能

截止2021年11月,在已调研的两家公有云Redis服务中,均支持所有常见的redis命令。与官方开源版本相比,兼容性达到99%以上。百胜自建redis基于官方开源版本,与公有云redis的命令覆盖率相同。

完整的参数和命令支持清单请见文档附录

百胜云redis不论基于公有云还是自建区,都能提供一致的服务体验。

  1. 架构规范

百胜Redis服务现阶段采用公有云-自建混合部署架构。提供基于多副本的高可用容灾功能,当主节点发生故障时,可实现故障的快速恢复。百胜运维团队支持交付的架构有分片集群、主从高可用2种。另外,运维团队对存量的哨兵集群提供基础维护,但不再交付新的哨兵集群。几种架构的对比如下:

高可用模式客户端 连接 入口Redis命令支持情况 扩容 故障恢复功能
分片集群连接所有节点不支持部分跨分片扫描命令通过增加分片可横向扩容至256GB自动故障转移
主从高可用连接高可用地址支持所有命令最大可扩展至16GB自动故障转移
哨兵集群连接哨兵节点,通过哨兵节点发现Redis支持所有命令最大可扩展至16GB客户端实现故障探测和连接切换

a. 分片集群

Redis原生的集群架构,可实现数据的横向分片与主从高可用功能。提供所有分片节点地址信息,每个节点都和其他所有节点连接,客户端需要配置所有节点地址信息来实现Redis高可用和故障自动切换。

【注意】 :该模式不支持部分跨分片扫描命令。完整的命令支持清单请见本文档结尾的附录。

b. 主从高可用

为保障Redis主从架构的高可用性,提供一个高可用入口,此高可用入口可支持Redis实例所有命令功能,客户端配置此高可用入口地址即可使用Redis服务。当Redis发生故障时,客户端无需更改连接配置地址。

c. 哨兵集群

由于公有云不对外提供其哨兵节点,因此目前 新交付的实例已 不支持此种高可用模式 Redis,只针对已经存在的老集群做向前兼容。

  1. 混合云 主备 站部署

对于跨站访问同一套Redis的应用,推荐采用公有云-自建混合部署的模式。

这一模式下,以公有云为主站,云上采用主从同步保障服务可用性。同时在百胜自建机房部署一套备用Redis集群。当云上服务发生大面积故障时,应用切换至自建备用Redis继续使用。

注意 】运维团队不提供如下服务

  • Redis的跨集群数据迁移/同步操作
  • 跨站点的Redis主从同步
  1. 自建-公有云参数规范

以下表格列出了Redis核心参数的用途和规范值。除了部分与资源分配相关的参数外,其余参数满足自建和云上一致,以保证各环境各单元的一致性。完整的参数清单请见本文档的附录。

参数规范值参数说明
maxmemory自建:OS总内存的50%云上:实例分片内存Redis实例中用于存储数据的最大内存大小
maxmemory-policyvolatile-lru当已用内存达到maxmemory时的Key淘汰策略
maxclients20000每个Redis实例允许的最大客户端连接数,2025.6.26由10000修改为20000
appendonlyno百胜云Redis不开启此参数
saveno百胜云Redis不开启此参数
slowlog-log-slower-than10000慢查语句的记录阈值,规范值为10毫秒(10000微秒),即执行时间超过10毫秒的操作会被记录
lua-time-limit5000Lua脚本最大执行时间,规范值为5000毫秒(5秒)



三、资源规格

Redis资源配置以套餐的形式提供。可用套餐如下:

Redis套餐集群模式Redis可用容量QPS基线网络吞吐量(每分片)备注自建区VM资源
redis.ha.v1.4g主从高可用4 GB80,00024MB/s主从高可用集群最大可纵向扩展至32GB4c/8g/50G ×3
redis.ha.v1.8g主从高可用8 GB80,00032MB/s如预估未来业务会增长至16GB以上,建议项目最初选型即考虑分片集群4c/16g/50G ×24c/8g/50G ×1
redis.ha.v1.16g主从高可用16 GB80,00032MB/s自建区3台主机资源中,1台4c/8g/50G主机为共享哨兵资源8c/32g/50G ×24c/8g/50G ×1
redis.cluster.v1.24g分片集群24 GB240,00096MB/s4c/16g/50G ×6
redis.cluster.v1.32g分片集群32 GB320,00096MB/s4c/16g/50G ×8
redis.cluster.v1.40g分片集群40 GB400,00096MB/s分片集群可通过增加节点进行横向扩展……
redis.cluster.v1.48g分片集群48 GB480,00096MB/s6主6从4c/16g/50G ×12
redis.cluster.v1.64g分片集群64 GB640,00096MB/s8主8从4c/16g/50G ×16
redis.cluster.v1.96g分片集群96 GB960,00096MB/s12主12从4c/16g/50G ×24
redis.cluster.v1.128g分片集群128 GB1280,000128MB/s
redis.cluster.v1.192g分片集群192 GB1920,000192MB/s
redis.cluster.v1.256g分片集群256 GB2560,000192MB/s集群容量最大可扩展至256GB4c/16g/50G ×64

基于以上配置,交付的Redis性能基线参考值如下:

  1. QPS参考基线

a. 主从高可用QPS约8万

b. 分片集群QPS约8万/分片

  1. 网络吞吐量限制

a. 主从高可用网络吞吐量≤32MB/S

b. 分片集群网络吞吐量≤256MB/S

具体资源规格请根据实际业务情况进行合理选择,避免造成资源浪费。

【注意】 :自建Redis在创建和分配主机时,需进行反亲和处理。即同一集群同一角色的主机,需要分布在不同的物理机上,以确保物理机故障时主备策略能够生效,集群整体仍能对外提供服务。

四、使用规范

本节主要介绍实践中的缓存模式最佳实践,并从键值设计、Redis命令使用和应用规约等方面,描述百胜Redis运维和使用规范。

  1. 键值原则

  • 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: 50
  • minIdle: 5
  • maxIdle: 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集中过期导致性能波动

  1. 命令使用

  • To do

a.【强制】 时间复杂度为O(n)命令应关注n的数量

Redis是单线程执行命令。HGETALL、LRANGE、SMEMBERS、ZRANGE、SINTER这些命令都是做全集操作,若元素很多,效果类似KEYS命令。可使用HSCANSSCANZSCAN这些分批扫描的命令代替。

b. 【推荐】 应使用批命令提高效率

如果有批量操作,可使用MSET/MGET/HMSET/HMGET等,取代多次单键操作,可有效减少维护网络连接和传输数据所消耗的资源和时间。

  • Not to do

a.【强制】 生产环境禁止使用KEYS命令

Redis 是单线程处理,在线上key数量较多时,一旦执行该命令会严重阻塞线上其它命令的正常请求,而且在高 QPS 情况下会直接造成 Redis 服务崩溃。

如果需要对所有key进行遍历,应使用SCAN命令分批处理,每批限制不超过100个key。

b.【强制】 禁止使用FLUSHALLFLUSHDB命令

生产环境禁止使用 FLUSHALLFLUSHDB命令。FLUSHALLFLUSHDB 会清空 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,可能会出现在主备节点上执行结果不一致,从而导致主备节点数据不一致。

  1. 应用规约

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为单线程处理,独立储存会减少不同业务互相操作的影响,提高请求响应速度;同时也避免单个实例内存数据量膨胀过大,在出现异常情况时,可更快恢复服务,公共数据做服务化。

  1. 缓存模式最佳实践

DBA团队建议在程序设计时,对于缓存数据来源于后端数据库的业务,采用Cache-Aside Pattern来设计缓存的存取逻辑。该模式可以最大限度地保证DB和缓存的数据一致性,并提升缓存性能。

Cache-Aside Pattern的详细介绍请见文档结尾的附录。




五、监控告警

  1. 监控维度

IT运维团队会基于以下KPI对Redis进行监控和告警:

  • 主机资源监控(限自建Redis):CPU、内存、磁盘、网络
  • Redis服务指标:节点存活情况、节点数、主从复制情况
  • Redis性能指标:每秒操作数OPS、命令响应时间、慢查数量、命令CPU开销、网络开销
  • Redis容量指标:key数量(总数、有无过期时间、淘汰数)、最大内存、已用内存
  1. 监控告警架构

a. 公有云

公有云Redis服务采用Prometheus + 原生Redis Exporter(github.com/oliver006/r… + Grafana方式进行监控,并对核心指标提供监控大屏及告警。

b. 自建

自建Redis由百胜Redis DMP平台管理,平台提供内置的监控告警功能,并提供监控大屏。

  1. 服务等级

IT运维团队对Redis的服务支持由DBA团队提供,服务等级定义同线上业务应用分级。

原则上Redis的服务等级等于或低于所属应用的分级。




六、生命周期管理

  1. IAC申请

  1. 扩缩容

DBA手动操作

  1. 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
L3L2升级问题处理、规范制定、跨团队沟通事宜等



八、异常处理SOP

  1. 全局唯一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-egc5个环境执行切换按钮 (当前使用的是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全局唯一任佳华,杨杰

详情参见:营销中间件切换预案

  1. 内存使用率超过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的数据,以防止数据丢失

  1. CPU使用率超过80%

  • 提供client IP连接数给开发
  1. 连接数超过75%

  • 清空对应单元的业务流量
  • 如无法切站,临时调整最大连接至25000
CONFIG SET maxclients 25000



附录

  1. Redis命令清单

以下清单列出了原生Redis中包含的所有命令。百胜云Redis支持的命令以''标出;其余命令由于下列原因不受百胜云Redis支持,用'x'标识:

a.会对Redis性能造成较大影响

b.会对Redis服务的稳定性造成影响

c.技术限制不支持此类命令

类别命令百胜云Redis
keysDEL
DUMP
EXISTS
EXPIRE
EXPIREAT
KEYS
MOVE
PERSIST
PTTL
RANDOMKEY
RENAME
RENAMENX
RESTORE
SORT
TTL
TYPE
SCAN
OBJECT
PEXPIREAT
PEXPIRE
MIGRATE×
WAIT×
stringAPPEND
BITCOUNT
BITOP
BITPOS
DECR
DECRBY
GET
GETSET
GETBIT
GETRANGE
INCR
INCRBY
INCRBYFLOAT
MGET
MSET
MSETNX
PSETEX
SET
SETBIT
SETEX
SETNX
SETRANGE
STRLEN
BITFIELD
HashHDEL
HEXISTS
HGET
HGETALL
HINCRBY
HINCRBYFLOAT
HKEYS
HMGET
HMSET
HSET
HSETNX
HVALS
HSCAN
HSTRLEN
HLEN
ListBLPOP
BRPOP
BRPOPLRUSH
LINDEX
LINSERT
LLEN
LPOP
LPUSHX
LRANGE
LREM
LSET
LTRIM
RPOP
RPOPLPU
RPOPLPUSH
RPUSH
RPUSHX
LPUSH
SetSADD
SCARD
SDIFF
SDIFFSTORE
SINTER
SINTERSTORE
SISMEMBER
SMEMBERS
SMOVE
SPOP
SRANDMEMBER
SREM
SUNION
SUNIONSTORE
SSCAN
Sorted SetZADD
ZCARD
ZCOUNT
ZINCRBY
ZRANGE
ZRANGEBYSCORE
ZRANK
ZREMRANGEBYRANK
ZREMRANGEBYCORE
ZREVRANGE
ZREVRANGEBYSCORE
ZREVRANK
ZSCORE
ZUNIONSTORE
ZINTERSTORE
ZSCAN
ZRANGEBYLEX
ZLEXCOUNT
ZPOPMIN
ZPOPMAX
ZREMRANGEBYSCORE
ZREM
HyperLoglogPFADD
PFCOUNT
PFMERGE
Pub/SubPSUBSCRIBE
PUBLISH
PUBSUB
PUNSUBSCRIBE
SUBSCRIBE
UNSUBSCRIBE
TransactionsDISCARD
EXEC
MULTI
UNWATCH
WATCH
ConnectionAUTH
ECHO
PING
QUIT
SWAPDB×
SELECT
ScriptingEVAL
EVALSHA
SCRIPT EXISTS
SCRIPT FLUSH
SCRIPT KILL
script debug×
SCRIPT LOAD
GeoGEOADD
GEOHASH
GEOPOS
GEODIST
GEORADIUS
GEORADIUSBYMEMBER
StreamXACK
XADD
XCLAIM
XDEL
XGROUP
XINFO
XLEN
XPENDING
XRANGE
XREAD
XREADGROUP
XREVRANGE
XTRIM
ServerFLUSHALL×
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×
  1. Redis参数清单

Redis的参数清单请见下表:

分类参数名含义默认值
基础配置参数daemonize是否是守护进程yes
port端口号整数
loglevel日志级别notice
logfile日志文件名/data/redis/redis/log/6379/redis.log
pidfileRedis运行的进程Pid文件/data/redis/redis/data/6379/redis.pid
tcp-backlogtcp-backlog2048
dir工作目录(aof、rdb、日志文件都存放在此目录)/data/redis/redis/data/6379
内存相关参数maxmemory最大可用内存(单位字节)总内存的50%
maxmemory-policy淘汰策略volatile-lru
AOF相关配置参数appendonly是否开启AOF持久化模式no
appendfsyncAOF同步磁盘频率everysec
appendfilenameAOF文件名appendonly.aof
aof-load-truncated加载AOF文件时,是否忽略AOF文件不完整的情况,让Redis正常启动yes
auto-aof-rewrite-min-size触发rewrite的AOF文件最小阀值,单位MB2gb
auto-aof-rewrite-percentage触发rewrite的AOF文件的增长比例条件100
RDB相关配置参数saveRDB触发条件" "
dbfilenameRDB文件名dump.rdb
rdbcompressionRDB文件是否压缩yes
rdbchecksumRDB文件是否使用校验和yes
stop-writes-on-bgsave-errorbgsave执行错误,是否停止Redis接受写请求no
慢查询相关配置参数slowlog-log-slower-than慢查询被记录的阀值,单位微秒10000
slowlog-max-len最多记录慢查询的条数1000
复制相关配置slaveof指定当前从节点复制哪个主节点,参数:主节点ip和portip 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操作,一般用于同时加入多个节点时,保证多个从节点共享RDB5
客户端相关配置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 ~* +@all6.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是否开启集群模式yesno
cluster-config-file集群配置文件名称nodes.conf
数据结构优化配置hash-max-ziplist-entrieshash数据结构优化参数512
hash-max-ziplist-valuehash数据结构优化参数64
list-max-ziplist-entrieslist数据结构优化参数整数
list-max-ziplist-valuelist数据结构优化参数整数
set-max-insert-entriesset数据结构优化参数整数
zset-max-ziplist-entrieszset数据结构优化参数128
zset-max-ziplist-valuezset数据结构优化参数64
hll-sparse-max-bytesHyperLogLog数据结构优化参数3000
  1. Cache-Aside Pattern

具体规则如下:

  • 读场景

a.应用尝试从Redis读取缓存数据

b.如miss,应用从数据库中读取数据,并执行步骤3;如hit,则应用直接进行后续业务处理

c.应用将数据写入缓存

  • 写场景

a.应用删除缓存

b.应用将数据写入数据库