Redis 使用规范总结

介绍

总结 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)

RedisUtils.java

1
2