性能优化小细节 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 这块能够施展的中央可太多了:
还有很多,我就不逐一罗列了。