redis很多人都用错了

2022-09-04 08:46:39 浏览数 (1)

一.规范命名:

1.1通过合理的命名

不同的业务使用不同的前缀(防止key冲突),用冒号隔开,比如业务名:表名:id

代码语言:javascript复制
 uv:page:1024 

1.2 控制key的长度

key 本身是字符串,底层的数据结构是 SDS。SDS 结构中 会包含字符串长度、分配空间大小等元数据信息 , 当 key 字符串 的长度增加时,SDS 中的元数据也会占用更多内存空间 。

尽量使用单词首字符或者缩写代替

1.3 不要包含特殊字符

比如:空格,换行,单双引号以及其他转义字符

二. value规范设计

2.1避免使用bigkey

有两种情况:

  • 值为string,例如value为10M的string,只能在业务层,控制string类型的value大小在10K以下,还可以对vale进行压缩减少大小。
  • 值为集合类型,尽量把集合元素个数控制在1w个以下,如果超过需要把大集合拆分成多个小集合;

List,Hash,Set,Sort Set 集合元素小于一定阀值,会才用压缩数据结构,达到节省内存效果,比如hash元素小于1000,就会使用zipList来保存,需要注意的时,使用压缩数据结构虽然节省了内存,但是会降低读写访问速度,所以不属于bigkey的前提下,如果业务更需要高性能,那就不用刻意去控制集合元素个数

2.2 使用高效序列化方式和压缩方法

  • 使用protobuf,kryo序列化可以节省内存空间
  • 使用xml和json序列化数据虽然可读性好,但是占用内存,可以使用gzip压缩数据达到节省内存目的

2.3 使用整数对象共享池

Redis 内部维护了 0 到 9999 这 1 万个整数对象,并把这些整数 作为一个共享池使用

两种情况不能使用:

  • 如果 Redis 中设置了 maxmemory,而且启用了 LRU 策略(allkeys-lru 或 volatile-lru 策略),
  • 如果集合类型数据采用 ziplist 编码,而集合元素是整数,这个时候,也不 能使用共享池。因为 ziplist 使用了紧凑型内存结构,判断整数对象的共享情况效率低。

三。数据保存规范

  • redis更多的保存热数据
  • redis保存的数据需要设置过期时间
  • 不同的业务使用不同实例的redis,避免不同的业务相互影响
  • 控制redis单个实例内存大小(2G-6G),避免生成RDB,主从复制阻塞主线程,影响正常请求处理

四。命令使用规范

  • 使用重命令方式禁用命令:keys,flushall,flushdb;keys可以使用scan代理,flushall,flushdb加上async代替
  • 慎用monitor命令
  • 慎用全量操作命令, (例如 Hash 类型的 HGETALL、Set 类型的 SMEMBERS) ,大集合会阻塞主线程,影响正常请求。可以使用sscan,hscan分配返回集合;把大集合拆分成按( 时间、地域、用户 ID 等属性)小集合,每次访问只会访问到小集合
  • 使用批量操作:mget,mset,pipeline (非原子操作)

0 人点赞