我在面试室里焦急的等待着,突然听到门外有脚步声,然后门被打开,一个衣着干净,面容英俊的青年走了进来,一股淡淡的男士香水味扑鼻而来在我的脸上。面试官:“你在工作中用过Redis吗?”我:“我经常用。”心里暗自高兴,熟悉Redis,五种数据类型和两种持久化方式来回都知道了。面试官:“你了解Redis的共享对象池吗?”面试官:“回去等消息。”这句话说的干干净净,然后就没有了。失败是成功之母,我没有气馁,决定马上弥补。在共享对象池中创建大量重复的整数类型,势必会消耗大量内存,因此Redis内部维护了一个从0到9999的整数对象池,这就是共享对象池。为了验证和理解,我们使用objectrefcount命令查看对象引用的个数,效果如下:127.0.0.1:6379>setone-more-num1404OK127.0.0.1:6379>objectrefcountone-more-num1(integer)217??2.24.130.22:6379>setone-more-num2404OK127.0.0.1:6379>objectrefcountone-more-num2(integer)3设置one-more-num1为404后,直接使用共享池中的整型对象,所以引用数为2(另一个引用在对象池上);设置one-more-num2为404后,引用数变为3。但是需要注意的是,当设置了最大内存值(maxmemory)和LRU相关的淘汰策略(如:volatile-lru,allkeys-lru)被启用,共享对象池将被禁止。为什么没有字符串对象池?共享对象池中的一个关键操作是判断对象是否相等。Redis中只有一个整数类型的对象池,因为整数比较算法的时间复杂度为O(1),只保留10000个整数,防止对象池过度浪费。相对来说,字符串比较算法的时间复杂度是O(n),尤其是比较长的字符串比较消耗性能。而且整数类型被复用的概率非常高,而字符串被复用的概率要小很多,所以Redis中只使用整数类型的对象共享池。等着瞧吧,面试官,今天你不理我,明天我就让你失望了,哈哈哈。..参考资料:《Redis设计与实现》《Redis开发与运维》《Redis 深度历险:核心原理与应用实践》已经看到了,你我一定是有缘人,留下你的点赞和关注,你日后必成大器。
