介绍
总结 Redis 的规范用法
初始化配置
- Redis 单机部署情况下,有 16 个「命名空间」,不同命名空间之间数据不共享,建议业务不相关的项目使用不同命名空间,集群部署忽略此条建议。
- key、value 序列化方式
RedisTemplate 包含 9 种序列化方式,默认使用 JdkSerializationRedisSerializer 序列化键值对,有时键值对会出现乱码。
建议 StringRedisSerializer,注意存入的 key、value 必须为 String 类型,否则会抛出类型转换异常。
使用规范
必须
由小写字母、数字、英文点号、英文半角冒号组成,必须英文字母开头
格式:业务名、表名做前缀,冒号分隔,比如 mobileserver:userfreepasswordinfo:freepasswordtype
控制 key 长度,不该使用过长或含义不清的名称,上面可使用 mobileserver:userfreewd:freewdtype
不包含特殊字符:空格、换行、单双引号、下划线以及其他转义字符
设置过期时间
设置最大内存及最大内存淘汰策略(maxmemory-policy)参数。
客户端使用连接池
禁止
禁止命令:keys、flushall、flushdb、CONFIG
禁止 Big Key。如果 1MB 的 key 每秒重复写入 10 次,就会导致写入网络 IO 达 10MB。非字符串的 bigkey,不要使用 del 删除,使用 hscan、sscan、zscan 方式渐进式删除,同时要注意防止 bigkey 过期时间自动删除问题(例如一个 200 万的 zset 设置1小时过期,会触发 del 操作,造成阻塞)。
建议
所有 key 命名在同一个实体类中定义,方便管理,比如:RedisConstant.java
hash、list、set、zset 元素个数不要超过 5000
使用合适的数据类型。常见的如:String 可以用作普通的 K-V、计数类;Hash 可以用作对象如商品、经纪人等,包含较多属性的信息;List 可以用作消息队列、粉丝/关注列表等;Set 可以用于推荐;SortedSet 可以用于排行榜等。
冷热数据分离,使用不频繁的用 MySQL 代替
必须要存储的大文本数据应该压缩后存储
高并发下建议客户端添加熔断功能(例如 netflix、hystrix)
不建议过多使用 Redis 事务功能,它不支持回滚
知识点
Redis 键过期策略
volatile-lru:默认策略,即超过最大内存后,在过期键中使用 LRU 算法进行key 的剔除,保证不过期数据不被删除,但是可能会出现 OOM 问题。
allkeys-lru:根据 LRU 算法删除键,不管数据有没有设置超时属性,直到腾出足够空间为止。
allkeys-random:随机删除所有键,直到腾出足够空间为止。
volatile-random:随机删除过期键,直到腾出足够空间为止。
volatile-ttl:根据键值对象的ttl属性,删除最近将要过期数据。如果没有,回退到noeviction策略。
noeviction:不会剔除任何数据,拒绝所有写入操作并返回客户端错误信息”(error) OOM command not allowed when used memory”,此时Redis只响应读操作。
参考
模板方法(TODO)
1 |