1 概述
1.1 文档目的
《Redis技术规范》(以下简称技术规范)的目的是进一步规范缓存数据库Redis技术的应用要求,明确版本、配置和开发的规范,避免出现同一组件多种应用,组件管理混乱,以及发生生产问题不能准确定位和及时处理等问题,该规范可指导各项目组开展具体应用工作。
1.2 适用范围
本规范适用于所有项目团队的Redis的技术和应用活动,适用于所有架构设计人员、开发人员、运维人员。
1.3 术语和定义
1.3.1 主从模式
Redis的主从模式支持一主多从模式,主从模式使用异步复制原理,从节点异步从主节点复制数据,主节点提供读写服务,从节点只提供读服务。
1.3.2 哨兵模式
Redis 2.8中提供了哨兵模式来实现自动化的系统监控和故障恢复功能,哨兵的作用就是监控Redis系统的运行状况,为Redis提供监控、提醒、自动故障转移三个任务功能。
1.3.3 集群模式
Redis的哨兵模式已经可以实现高可用,读写分离 ,但是在这种模式下每台Redis服务器都存储相同的数据,很占用内存资源,所以Redis3.0增加了集群模式,实现的Redis的分布式存储,即每台Redis节点上存储不同的内容。
2 版本规范
Redis借鉴了Linux操作系统对于版本号的命名规则:版本号第二位如果是奇数,则为非稳定版本(例如2.7、2.9、3.1),如果是偶数,则为稳定版本(例如2.6、2.8、3.0、3.2),当前奇数版本就是下一个稳定版本的开发版本,例如2.9版本是3.0版本的开发版本,所以本技术规范要求在生产环境选取偶数版本的Redis。
可能出乎很多人的意料,Redis3.2之后的版本是4.0,而不是3.4、3.6、3.8,一般这种重大版本号的升级也意味着软件或者工具本身发生了重大改革,各个重大版本说明详见附录。
基于对行业和技术领域范围的应用广度、大多数项目组使用熟练程度、以及对未来腾讯云产品的支持等综合因素进行评估,本技术规范要求各个项目组统一使用Redis4.0.10版本。
3 配置规范
3.1 网络配置
1) bind
表示Redis 只接收来自于该 IP 地址的请求,如果不进行设置,那么将处理所有请求。需要修改为本机的IP地址。
3.2 通用配置
1) daemonize
该配置表示是否在后台执行,yes:后台运行;no:不是后台运行,老版本默认是no,请检查是否为yes,如果是no,需要修改为yes。
2) pidfile
该文件是Redis的进程文件,要求修改这个文件的路径,放在当前用户下的目录中。
Ø 绝对路径:/home/redis/redis-cluster/node-8101/redis-server-port.pid
Ø 相对路径:
redis-server-port.pid,和conf配置文件路径一致。推荐这种配置,便于管理。
3) logfile
设置log文件路径,需要使用绝对路径,保持与conf配置文件路径一致。
/home/redis/redis-cluster/node-8101/redis-8101.log
3.3 快照配置
1) save
该参数是指定多长时间内(秒),有多少次更新操作,就将数据同步到数据文件,可以多条件配合。
Ø 关闭RDB,设置为 save “”。不能不设置,否则还是会生成rdb文件;
Ø 打开RDB 参考设置如下:
save 900 1 # 900s内至少有1次更新操作则保存
save 300 10
save 60 10000
2) dbfilename
rdb文件名,修改文件命名,dump-端口号.rdb。
3) dir
指定输出路径,不要使用默认路径。
/home/redis/redis-cluster/data
3.4 复制配置
目前没有特殊要求,默认即可。
3.5 安全配置
1) requirepass
必须设置一个强密码
3.6 客户端配置
1) maxclients
默认最大连接数为10000个连接,如果有特殊需求,则可以调整此值。
3.7 内存管理配置
1) maxmemory
结合物理机内存的大小设置该值,必须设置,不然会无限消耗内存,不设置容易导致系统崩溃。
2)maxmemory-policy
如果redis配置了maxmemory和maxmemory-policy策略,则当redis内存数据达到maxmemory时,会根据maxmemory-policy配置来淘汰内存数据,以避免OOM。redis提供了以下6种淘汰策略:
Ø noeviction:不执行任何淘汰策略,当达到内存限制的时候客户端执行命令会报错。
Ø allkeys-lru:从所有数据范围内查找到最近最少使用的数据进行淘汰,直到有足够的内存来存放新数据。
Ø volatile-lru:从所有的最近最少访问数据范围内查找设置到过期时间的数据进行淘汰,如果查找不到数据,则回退到noeviction。
Ø allkeys-random:从所有数据范围内随机选择key进行删除。
Ø volatile-random:从设置了过期时间的数据范围内随机选择key进行删除。
Ø volatile-ttl:从设置了过期时间的数据范围内优先选择设置了TTL的key进行删除。
常用的主要是两种策略,volatile-lru 和volatile-ttl,前者主要针对持久化的数据配备的策略,而后者是针对设置超时时间的缓存数据配备的策略。
3.8 阻塞释放空间配置
目前没有特殊要求,默认即可。
3.9 数据文件记录模式配置
1) appendonly
默认是no,表示为关闭。
AOF 和RDB 配置需要保持一致,如果开启了RDB,则AOF也需要打开;如果RDB关闭,则AOF也需要关闭。
2) appendfilename
默认为"appendonly.aof",如果需要设置则修改文件名,增加端口号,"appendonly-8101.aof"。
3) appendfsync
Ø no表示等操作系统进行数据缓存同步到磁盘(快)
Ø always 表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
Ø everysec 每秒同步一次(默认值)
3.10 LUA脚本
目前没有特殊要求,默认即可。
3.11 集群配置
1) cluster-enabled
如果使用集群模式,设置为yes。
2) cluster-config-file
集群配置文件,请修改文件名,放在conf文件同目录下。如:/home/redis/redis-cluster/data/nodes-8101.conf
3.12 高级配置
1) hz
该参数设置redis任务执行频率,如清除过期键任务,范围1-500,值越大CPU消耗越大,建议不超过100。值太小会导致清除数据过慢,导致系统异常。
4 开发规范
4.1 键值设计
4.1.1 Key命名设计
可读、可管理
建议:定义唯一防止冲突,层级关系用“:”分割,例如:系统英文简称:功能模块英文简称:SessionID或业务唯一主键。
简洁
建议:保证语义的前提下,控制key的长度,当key较多时,内存占用就越高。
通用
强制:不允许出现特殊字符,包含空格、换行、单双引号以及其他转义字符。
4.1.2 Value存值设计
数据类型
建议:使用字符串类型,已经可以满足大多数项目组的需求,数据类型选择需要结合内存和性能之间的平衡
存储控制
强制:string类型控制在10KB以内,hash、list、set、zset元素个数不要超过5000。
生命周期
强制:过程型的缓存数据必须增加失效时间,即TTL;非过程型的数据可以不增加失效时间,但不宜过多。根据实际业务场景增加失效时间优先级高于不加失效时间。
4.2 操作命令
禁用命令
强制:禁止使用keys、flushall、flushdb等,可通过Redis的rename机制禁掉命令或者使用scan的方式渐进式处理。
批量操作
建议:原生命令使用mget、mset操作,非原生命令可以使用pipeline提高效率。需要控制一次批量操作的元素个数(建议不超过500)。
4.3 客户端使用
数据库拆分
建议:避免多个应用使用一个Redis实例避免多个应用之间相互影响。
数据库连接池
强制:连接Redis服务,强制使用带有连接池的客户端,这样可以有效控制连接数,同时提高效率。
安全性
强制:连接Redis服务,强制使用密码,并设置合理的密码。
客户端选择
建议:目前主流的客户端包括Jedis、Spring Data Redis(Lettuce)、Redisson,建议使用Lettuce,使用Spring框架用这个 ,这是官方推荐。如有特殊需求,如分布式锁、阻塞队列的时重点推荐Redisson。
5 其他
6 附录
Redis2.6
Redis2.6在2012年正式发布,经历了17个版本,到2.6.17版本,相对于Redis2.4,主要特性如下:
1) 服务端支持Lua脚本。
2) 去掉虚拟内存相关功能。
3) 放开对客户端连接数的硬编码限制。
4) 键的过期时间支持毫秒。
5) 从节点支持只读功能。
6) 两个新的位图命令:bitcount和bitop。
7) 增强了redis-benchmark的功能:支持定制化的压测,CSV输出等功能。
8) 基于浮点数自增命令:incrbyfloat和hincrbyfloat。
9) redis-cli可以使用--eval参数实现Lua脚本执行。
10) shutdown命令增强。
11) 重构了大量的核心代码,所有集群相关的代码都去掉了,cluster功能将会是3.0版本最大的亮点。
12) info可以按照section输出,并且添加了一些统计项
13) sort命令优化
Redis2.8
Redis2.8在2013年11月22日正式发布,经历了24个版本,到2.8.24版本,相比于Redis2.6,主要特性如下:
1) 添加部分主从复制的功能,在一定程度上降低了由于网络问题,造成频繁全量复制生成RDB对系统造成的压力。
2) 尝试性的支持IPv6.
3) 可以通过config set命令设置maxclients。
4) 可以用bind命令绑定多个IP地址。
5) Redis设置了明显的进程名,方便使用ps命令查看系统进程。
6) config rewrite命令可以将config set持久化到Redis配置文件中。
7) 发布订阅添加了pubsub。
8) Redis Sentinel第二版,相比于Redis2.6的Redis Sentinel,此版本已经变成生产可用。
Redis3.0(里程碑)
Redis3.0在2015年4月1日正式发布, Redis3.0最大的改动就是添加Redis的分布式实现Redis Cluster,相比于Redis2.8主要特性如下:
1) Redis Cluster:Redis的官方分布式实现。
2) 全新的embedded string对象编码结果,优化小对象内存访问,在特定的工作负载下载速度大幅提升。
3) lru算法大幅提升。
4) migrate连接缓存,大幅提升键迁移的速度。
5) migrate命令两个新的参数copy和replace。
6) 新的client pause命令,在指定时间内停止处理客户端请求。
7) bitcount命令性能提升。
8) cinfig set设置maxmemory时候可以设置不同的单位(之前只能是字节)。
9) Redis日志小做调整:日志中会反应当前实例的角色(master或者slave)。
10) incr命令性能提升。
Redis3.2
Redis3.2在2016年5月6日正式发布,相比于Redis3.0主要特征如下:
1) 添加GEO相关功能。
2) SDS在速度和节省空间上都做了优化。
3) 支持用upstart或者systemd管理Redis进程。
4) 新的List编码类型:quicklist。
5) 从节点读取过期数据保证一致性。
6) 添加了hstrlen命令。
7) 增强了debug命令,支持了更多的参数。
8) Lua脚本功能增强。
9) 添加了Lua Debugger。
10) config set 支持更多的配置参数。
11) 优化了Redis崩溃后的相关报告。
12) 新的RDB格式,但是仍然兼容旧的RDB。
13) 加速RDB的加载速度。
14) spop命令支持个数参数。
15) cluster nodes命令得到加速。
16) Jemalloc更新到4.0.3版本。
Redis4.0
Redis4.0的新特性:
1) 提供了模块系统,方便第三方开发者拓展Redis的功能。
2) PSYNC2.0:优化了之前版本中,主从节点切换必然引起全量复制的问题。
3) 提供了新的缓存剔除算法:LFU(Last Frequently Used),并对已有算法进行了优化。
4) 提供了非阻塞del和flushall/flushdb功能,有效解决删除了bigkey可能造成的Redis阻塞。
5) 提供了memory命令,实现对内存更为全面的监控统计。
6) 提供了交互数据库功能,实现Redis内部数据库的数据置换。
7) 提供了RDB-AOF混合持久化格式,充分利用了AOF和RDB各自优势。
8) Redis Cluster 兼容NAT和Docker。




