性能优化小细节 Redis对象共享池

假设你细心钻研过 Redis 中各种成功细节,你会发现为了性能,Redis 真的是不遗余力。

作为一种高性能的键值存储系统,Redis 宽泛用于缓存、会话治理、信息队列等多种场景。

为了提高 Redis 在处置少量数据时的性能和效率,Redis 设计并成功了对象共享池(Shared Object Pool)这一外部机制。

那么接上去松哥就和大家具体说一说 Redis 中的对象共享池。

一 设计目标

Redis 的对象共享池关键用于复用一些罕用的数据对象,以缩小内存的开支。

在 Redis 中,一些罕用的数据对象,关键是小整数(如 0 到 9999)等,是不会被扭转的,因此可以安保地共享经常使用而无需重复创立。

例如你设置 set k1 99 和 set k2 99,这时 k1 和 k2 其实指向的是同一个对象。

经过共享这些对象,Redis 能够清楚降落内存的经常使用量,并缩小对象的创立和销毁期间,从而优化全体性能。

二 上班原理

在 Redis 主机启动时,会预先创立并存储一些罕用的对象到一个全局的哈希表中,这个哈希表就是对象共享池。

当 Redis 须要处置一个键值对时,会首先审核这个键值对中的值能否曾经在对象共享池中。假设已存在,Redis 将间接援用该对象,而不是创立一个新的对象。

三 允许的对象类型

目前关键是允许小整型,也就是 0~9999 之间的整数,浮点型数据不允许。

四 运行场景

对象共享池在多种场景下都能清楚优化 Redis 的性能和效率,特意是在处置少量反双数据时。例如,在 Web 运行中,许多缓存的键值对或许蕴含相反的值,经过对象共享池,这些值可以被多个键值对共享,从而节俭少量内存。

留意事项

五 实践案例

为了经过实践案例证实 Redis 中对象共享池的存在,咱们可以联合 Redis 的外部机制和一些实践操作来启动剖析。只管 Redis 的官网文档没有间接提及“对象共享池”这一术语,但咱们可以从 Redis 如何处置整数对象的共享中看到其面前的共享机制。

假定咱们有一个 Redis 主机,它用于存储和访问少量的键值对。在这些键值对中,有一局部键对应的值是经常出现的小整数。

咱们来口头以下命令:

 k1 OBJECT REFCOUNT k1 k2 OBJECT REFCOUNT k1

这里我要跟大家解释下。

OBJECT REFCOUNT 命令通常上可以检查某一个 key 对应的 value 被援用的次数。

所以咱们希冀第一次性口头 OBJECT REFCOUNT k1 的时刻前往 1,第二次口头 OBJECT REFCOUNT k1 的时刻前往 2,但是实践上却并非如此,每次都是前往 2^31-1。

只管这里并没有前往咱们想要的值,但是大家可以看到,OBJECT REFCOUNT k1 前往的值确实和 value 为字符串的 key 的前往值是不同的。

松哥来解释下要素。

经过剖析 Redis 源码,松哥发现新版本的 redis 中 OBJ_SHARED_INTEGERS 变量定义了共享整数 10000,并且定义不被销毁的全局对象的援用数量 OBJ_SHARED_REFCOUNT 为 INT_MAX,INT_MAX = 2^31 - 1 =2147483647。

源码位置在:。

并且从源码中可以看到当把一个对象设置为共享时刻就会把 refcount 设置为 INT_MAX。

源码位置在:。

从这里就能看出,假设某个对象的援用次数是 2^31-1,那么就说明这个对象是一个援用对象。

Redis 实战

Redis 博大精湛,但是很多时刻咱们说到 Redis,却只知道缓存或许散布式锁,面试的时刻也只能从这两个角度去预备。

但是在实践面试中,Redis 这块能够施展的中央可太多了:

还有很多,我就不逐一罗列了。

您可能还会对下面的文章感兴趣: