一、 键值设计
-
key 名称设计
(1) 可读性和可管理性
便于查看,统计,排错
(2)简洁性,控制key长度
在保证语义的前提下,尽量控制key的长度
(3)不要包含特殊字符
禁止包含特殊字符如空格,换行,单双引号,其他转义字符
-
value 设计
(1)不宜过大,越小越好
string类型控制在1KB以内,hash/list/set/zset等包含元素个数控制在1000以内
credis页面,群集所有者可以通过unlink异步清理或小批量迭代清理
(2)一定要设置过期时间,当实例写满,根据volatile-lru淘汰老的数据
不设置过期时间,redis实例大小会一直无限增长,会出现机器内存耗尽、故障恢复耗时特别长等问题
3.实例Key个数限制
由于Redis Rehash机制,实例Key数量达到一定值rehash操作时,需要有一定量空闲内存资源,如key达到134217728,rehash需要有2gb空闲内存资源,达到268435456时,rehash需要有4gb空闲内存资源。如果没有组够的内存资源rehash时会发生Key剔除(数据丢失/程序超时/甚至引起切换)。
单实例key个数达到134217728已经很大了,实例元素过大对于后续分析rdb遍历大key时会非常耗时。
4.设置合理的过期时间。
Redis只是缓存,不能当成数据库来用。所有key应该根据业务场景,设置合理过期时间,也可以提升资源利用率。
二、 命令使用
-
禁用KEYS 正则匹配,可用SCAN代替
容易阻塞正常读写请求,甚至主从切换
-
O(N)命令关注N,控制集合元素尽可能小
hgetall/lrange/smembers/zrange等在集合包含元素个数较少的情况下使用,
若规模较大,有遍历需求,可用HSCAN/SSCAN/ZSCAN渐进式遍历
-
禁用KEYS/FLUSHDB/FLUSHALL等命令
防止误操作,造成生产事故
-
Redis事务支持较弱,不建议过多使用
不支持回滚
三、 参数配置
- 服务端配置
(1)同一个分片的主从节点,部署在不同机柜的不同宿主机,最大程度保障实例故障时数据不丢失。
(2)单个实例不宜过大,一般在控制8GB以内,生产环境单个实例大小禁止超过30GB。15GB+不自动扩容。TROCKS由于底层存储使用ROCKSDB,以及为了节省成本,实例可以更大一些,根据当时申请规格来。
(3)影响下单主流程的核心Redis要有DR(Disaster Recovery https://redis.com/redis-enterprise/technology/backup-disaster-recovery/)
(4)Redis 服务器参数配置
echo 2048 > /proc/sys/net/core/somaxconn
echo never > /sys/kernel/mm/transparent_hugepage/enabled
sysctl vm.overcommit_memory=1
echo 0 > /proc/sys/vm/swappiness