前言
最近在学习Redis相关知识,看了阿里的redis开发规范,以及Redis开发与运维这本书。分使用规范、有坑的命令、项目实战操作、运维配置四个方向。整理了使用Redis的21个注意点,希望对大家有帮助,一起学习哈
本文来源:公众号——捡田螺的小男孩
1、Redis的使用规范
1.1、 key的规范要点
我们设计Redis的key的时候,要注意以下这几个点:
以业务名为key前缀,用冒号隔开,以防止key冲突覆盖。如,live:rank:1 确保key的语义清晰的情况下,key的长度尽量小于30个字符。 key禁止包含特殊字符,如空格、换行、单双引号以及其他转义字符。 Redis的key尽量设置ttl,以保证不使用的Key能被及时清理或淘汰。
1.2、value的规范要点
Redis的value值不可以随意设置的哦。
第一点,如果大量存储bigKey是会有问题的,会导致慢查询,内存增长过快等等。
如果是String类型,单个value大小控制10k以内。 如果是hash、list、set、zset类型,元素个数一般不超过5000。
第二点,要选择适合的数据类型。不少小伙伴只用Redis的String类型,上来就是set和get。实际上,Redis 提供了丰富的数据结构类型,有些业务场景,更适合hash、zset等其他数据结果。
反例:
set user:666:name jay
set user:666:age 18
复制代码
正例
hmset user:666 name jay age 18
复制代码
1.3. 给Key设置过期时间,同时注意不同业务的key,尽量过期时间分散一点
- 因为Redis的数据是存在内存中的,而内存资源是很宝贵的。
- 我们一般是把Redis当做缓存来用,而不是数据库,所以key的生命周期就不宜太长久啦。
- 因此,你的key,一般建议用expire设置过期时间。
如果大量的key在某个时间点集中过期,到过期的那个时间点,Redis可能会存在卡顿,甚至出现缓存雪崩现象,因此一般不同业务的key,过期时间应该分散一些。有时候,同业务的,也可以在时间上加一个随机值,让过期时间分散一些。
1.4.建议使用批量操作提高效率
我们日常写SQL的时候,都知道,批量操作效率会更高,一次更新50条,比循环50次,每次更新一条效率更高。其实Redis操作命令也是这个道理。
Redis客户端执行一次命令可分为4个过程:1.发送命令-> 2.命令排队-> 3.命令执行-> 4. 返回结果。1和4 称为RRT(命令执行往返时间)。 Redis提供了批量操作命令,如mget、mset等,可有效节约RRT。但是呢,大部分的命令,是不支持批量操作的,比如hgetall,并没有mhgetall存在。Pipeline 则可以解决这个问题。
Pipeline是什么呢?它能将一组Redis命令进行组装,通过一次RTT传输给Redis,再将这组Redis命令的执行结果按顺序返回给客户端.
我们先来看下没有使用Pipeline执行了n条命令的模型:
使用Pipeline执行了n次命令,整个过程需要1次RTT,模型如下:
2、Redis 有坑的那些命令
2.1. 慎用O(n)复杂度命令,如hgetall、smember,lrange等
因为Redis是单线程执行命令的。hgetall、smember等命令时间复杂度为O(n),当n持续增加时,会导致 Redis CPU 持续飙高,阻塞其他命令的执行。
hgetall、smember,lrange等这些命令不是一定不能使用,需要综合评估数据量,明确n的值,再去决定。 比如hgetall,如果哈希元素n比较多的话,可以优先考虑使用hscan。