前言
你可曾面临这种问题,高并发条件下数据必须99%cache命中才能满足性能需求?
你可曾面对这种场景,对cache集群不断扩容是否让你感到厌烦?
那么是否有一种办法在提高缓存命中率的同时,又能提高缓存集群键个数,甚至于提高整个集群的吞吐?
本文将从实践出发,对编码方式及压缩算法进行介绍,并分享了在真实项目中使用缓存压缩对性能的影响。
(想自学习编程的小伙伴请搜索圈T社区,更多行业相关资讯更有行业相关免费视频教程。完全免费哦!)
探索篇
提高缓存命中率有很多种方法:选择好的缓存淘汰算法。固然有一些本地缓存支持LFU或者更新的Tiny LFU算法。不过对于分布式缓存而言,memcached和redis底层都使用了LRU算法,并不支持淘汰算法的替换。
由此,我们想到第二个思路:提升集群item数量。
在不扩容、不拆分item的前提下,便理所应当的想到了对item进行压缩存储。
那么接下来需要确定的就是具体的压缩方案:即对何种数据进行压缩才是最有效的?采用何种压缩算法才是最适合我们的系统的?
编码方式
不同的压缩算法之间区别最大的即在于编码方式。所谓编码其本质即把信息进行某种方式的转换,以便让信息能够装载进目标载体。从信息论的角度来说,编码的本意并非改变信息的熵密度,而只是改变信息的表现形式。
游程编码:最易理解的编码方式
该算法的实现是用当前数据元素以及该元素连续出现的次数来取代字符串中连续出现的数据部分。
aaaaaaaaaabbbaxxxxyyyzyx
字符串长度为24,使用游程算法,我们用较短的字符串后加一个计数值来替换游程对象。
a10b3a1x4y3z1y1x1
通过游程编码编码后的字符串长度为17,只有原先的71%,但仍有优化的余地,比如对于只出现一次的字符,不在后面追加1.
a10b3ax4y3zyx
这样编码得来的字符串只有13,只有原先的51%
熵编码
熵编码被人所熟知的一种即是Huffman编码,它的原理是根据字符在原始串中出现的概率。通过构造一颗二叉树来为每个字符产生对应的码字,又称最佳编码。
算术编码
算术编码同样是一种熵编码,它同样是基于字符在原始
如果觉得《一花一世界 一树一菩提:编码压缩探索与实践》对你有帮助,请点赞、收藏,并留下你的观点哦!