Redis的key和value实践总结

本文主要总结工作这些年来,一些使用 Redis 较好的实践经验,希望能给你一点点启发或者帮助。

一 key的使用规范

1.1 key 如何命名?

从简洁性、易阅读性角度考虑,如:服务名 + 业务模块 + 业务数据。

1.2 key 多长合适?

在完整描述业务的前提下,key 越短越好,为啥呢?key 长了不占内存么。

1.3 什么是热 key?

所谓的热 key 就是突然有大量请求去访问 redis 上的某个特定 key,这个特定的 key 就是热 key。还记得 XX明星结婚、XX明星离婚么。

1.4 热 key 有什么影响?

由于大量请求访问,很容易造成流量过于集中,达到物理网卡上限,从而导致这台 redis 的服务器宕机。由于没有了 redis 抗压,mysql 服务器会宕机。

1.5 如何避免热 key?

key 的命名规则尽量做到随机;增加对 key 的监控;增加二级缓存,所谓二级缓存就是 JVM 缓存。

二 value的使用规范

2.1 避免出现大 key

所谓的大 key,即 key 存储的 value 非常大。

为啥需要避免出现大 key 呢?

应用服务器从 Redis 取 value 的时候,如果这块是大 key,Redis 这块的网卡流量会很大,影响性能。

大 key 影响 Redis 性能?

Redis 的底层是单线程模型,假设没有大 key,每秒能处理10万个任务;有了大 key,有可能每秒处理1万任务,甚至更低,你说是不是影响性能。

更严重的可能会阻塞,这绝不是危言耸听。

大 key 多大算大呢?

具体多大算大,是从业务层面来定的,一般来说:

  • string 类型最大不超过512M,实际开发中大小不超过10k。
  • hash、list、set、zset 大小不超过不超过100k。

2.2 给value设置过期时间。

为啥需要给 value 设置过期时间?

要是不给 value 设置过期时间,value 将常驻内存。内存真不是大风刮来的。

那过期时间设置多长时间合适呢?

一般来说根据自己的业务来定,可以从 key 的命中率来设置。不同的 key 设置不同的过期时间。

为什么不同的 key 需要设置不同的过期时间

如果大量的 key 过期时间一样的话,会出现在某一个时间段大量的 key 过期的现象,很容易产生雪崩。

如何避免出现雪崩,导致 Redis 不可用的现象?

可以给不同的 key 设置不同的过期时间。同一个 key 也可以生成一个随机数作为过期时间。

2.3 value数据冷热分离

什么叫冷热分离?

所谓的冷热是从数据访问角度来说的,就是访问多的叫热数据,访问少的叫冷数据。

为啥需要冷热分离?

冷数据访问少,放在 Redis 里面占用内存,有点浪费,内存也确实不是大风刮来。

冷热分离如何实践?

这块涉及到:到底是缓存全部属性还是部分属性的问题。

假设我们从数据库取出来30个字段,其中业务比较常用的也就10个左右,剩下20个都是不常用,不知道什么时候会用上的字段。

如何在保证冷热数据分离的前提下,能灵活快速的支持业务的变化呢?

为了解决这个问题,实现冷热分离,我们提供两套接口:

一套接口缓存全量数据,就是为了避免业务上说需要添加这个字段、添加那个字段而各种开发的问题,具有一定的通用性和灵活性。

一套接口是缓存业务常用数据,既满足业务需求,又减少内存空间使用。

三 Redis数据隔离

什么叫数据环境隔离呢?

就是预发的 key、value 和线上的 key、value 各有一套,互不影响。

为啥需要数据环境隔离呢?

我就遇到过因为在预发的一个误操作的导致用户线上出现的问题的case。所以从用户体验、数据安全考虑,

进行预发和线上数据隔离是符合业务诉求的,即使说会有两份数据,但是我觉得是 ok 的。

四 Redis容量评估

如何申请 Redis 容量呢?

从当前业务角度,比如说一共有多少个活跃用户,平均每天有多少个活跃用户,每一个 key 和 value 占用多少内存。两者相乘大体就是需要申请的内存。

就这样申请内存,够么?

有可能不够,因为业务是在变化的,我们应当以一个发展眼光考虑问题,可以预留50%或者一倍的容量来支持快速发展的业务,这样就没必要经常扩容。

扩容的时候我们应该怎么做呢?

如果内存需要扩容,可以和 DBA 沟通业务场景,评估容量。共同推进扩容完美落地。DBA 人家是专业的,多听听人家的建议,总没坏处。

猜你喜欢

转载自blog.csdn.net/jack1liu/article/details/112388895