当前位置:主页 > 查看内容

Redis使用规范_分布式缓存服务 DCS_最佳实践

发布时间:2021-10-16 00:00| 位朋友查看

简介:本节主要介绍Redis常见使用规范,主要从Key名称、Value值、Redis命令以及其他方面描述。 Key名称 Key名称的使用规范如下: 使用统一的命名规范。 一般使用业务名(或数据库名)为前缀,用冒号分隔,例如,业务名:表名:id。 控制key名称的长度。 在保证语义清晰……

本节主要介绍Redis常见使用规范,主要从Key名称、Value值、Redis命令以及其他方面描述。

Key名称

Key名称的使用规范如下:

  1. 使用统一的命名规范。

    一般使用业务名(或数据库名)为前缀,用冒号分隔,例如,业务名:表名:id。

  2. 控制key名称的长度。

    在保证语义清晰的情况下,尽量减少Key的长度。有些常用单词可使用缩写,例如,user缩写为u,messages缩写为msg。

  3. 名称中不要包含特殊字符。

Value值

Value值的使用规范如下:

  1. 要避免大Key。

    大Key会带来网卡流量风暴和慢查询,一般string类型控制在10KB以内,hash、list、set、zset元素个数不要超过5000。

  2. 选择合适的数据类型。

    比如存储用户的信息,可用使用多个key,使用set u:1:name "X"、set u:1:age 20这样存储,也可以使用hash数据结构,存储成1个key,设置用户属性时使用hmset一次设置多个,同时这样存储也能节省内存。

  3. 设置合理的过期时间。

    最好是过期时间打散,不要集中在某个时间点过期。

Redis命令

Redis命令的常用规范如下:

  1. 时间复杂度为O(N)的命令,需要特别注意N的值。

    例如:hgetall、lrange、smembers、zrange、sinter这些命令都是做全集操作,如果元素很多,是很耗性能的。可使用hscan、sscan、zscan这些分批扫描的命令替代。

  2. 命令禁用,使用前,请参考Redis命令兼容性WebCli命令兼容性
  3. 慎重使用select。

    Redis多数据库支持较弱,多业务用多数据库实际还是单线程处理,会有干扰。最好是拆分使用多个Redis。华为云集群实例不支持多DB。

  4. 如果有批量操作,可使用mget、mset或pipeline,提高效率,但要注意控制一次批量操作的元素个数。

    mget、mset和pipeline的区别如下:

    a. mget和mset是原子操作,pipeline是非原子操作。

    b. pipeline可以打包不同的命令,mget和mset做不到。

    c. 使用pipeline,需要客户端和服务端同时支持。

  5. lua脚本的执行超时时间为5秒钟,建议不要在lua脚本中使用比较耗时的代码,比如长时间的sleep、大的循环等语句。
  6. 调用lua脚本时,建议不要使用随机函数去指定key,否则在主备节点上执行结果不一致,从而导致主备节点数据不一致。
  7. 集群实例使用lua有如下限制:

    a.使用EVAL和EVALSHA命令时,命令参数中必须带有至少1个key,否则客户端会提示“ERR eval/evalsha numkeys must be bigger than zero in redis cluster mode”的错误。

    b.使用EVAL和EVALSHA命令时,DCS Redis集群实例使用第一个key来计算slot,用户代码需要保证操作的key是在同一个slot。

其他

  1. 建议使用连接池+长连接,可以有效控制连接,同时提高效率。
  2. 合理设置maxmemory-policy(最大内存淘汰策略)。
    • noeviction:为默认策略,表示不会剔除任何数据,拒绝所有写入操作并返回客户端错误信息"(error) OOM command not allowed when used memory",此时Redis只响应读操作。
    • volatile-lru:即超过最大内存后,在过期键中使用lru算法进行key的剔除,保证不过期数据不被删除,但是可能会出现OOM问题。
    • allkeys-lru:根据LRU算法删除键,不管数据有没有设置超时属性,直到腾出足够空间为止。
    • allkeys-random:随机删除所有键,直到腾出足够空间为止。
    • volatile-random:随机删除过期键,直到腾出足够空间为止。
    • volatile-ttl:根据键值对象的ttl属性,删除最近将要过期数据。如果没有,回退到noeviction策略。
  3. 删除大Key时,不要直接使用del命令。
    • 如果是Hash类型的大Key,推荐使用hscan + hdel
    • 如果是List类型的大Key,推荐使用ltrim
    • 如果是Set类型的大Key,推荐使用sscan + srem
    • 如果是SortedSet类型的大Key,推荐使用zscan + zrem
  4. 使用Pipeline时,建议不要一次太多命令,集群最大1024。

本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!
上一篇:加工原理 - 日志服务 下一篇:没有了

推荐图文

  • 周排行
  • 月排行
  • 总排行

随机推荐