redis的set集合的编码方式以及应用场景
与其是说set集合的编码方式,更通俗易懂的说法就是redis会根据set集合存的元素的类型和个数来决定set是以什么样子的形式存在,主要有两种:intset,hashtable;如果set存的都是整数,且个数少于redis的配置文件中配置的个数,那么set就会优化这些元素的存储方式,使他们占的内存更少,更节约内存;相反,如果个数大于配置的个数,或者是包含字符串,那么就会以hashtable的形式编码,能够更快的找到元素,实现更快的增删改查;具体我们可以来看几张图,
首先你可以在配置文件中看到个数配置的是512,我改成10,然后我们再来看看效果(修改配置一定要重启redis)
从上图可以看到,当key只有 1-9 9个数字的时候,编码类型还是intset,再插入一个10,还是intset,但是在插入11,个数大于配置的10个的时候,就变成了hashtable;从上面的现象也可以看出来,redis会根据配置的参数来调整set的编码方式;其实我不建议记这个数字没,因为从上面的操作就可以看出来,我们是可以改变这个参数的,我们只需要知道这个逻辑和原理就可以了;至于在实际的业务场景中,我们往往要考虑配置的数字能否提高我们的效率,简单来说要结合实际的业务来调整配置文件中的数字以达到最好的,最快的效果;
可以再来看一张图:
当集合中的元素都是整数,且个数少于配置的大小的话,就会以intset的编码方式,一但插入一个字符串,就会以hashtable的编码方式;
接下来介绍set的一些实际的应用场景:
1.用set来存储用户的“标签”
这个标签指的我们通过分析用户的一些常有的行为,给这个用户打上一些属性或者性格,比如性别,爱好,个性等等,通过分析的用户的行为,得出用户的画像,以及用户的特征,然后我们就可以投其所好的给他推荐一个产品,视频等等,这种事情有好处也有坏处,坏处就是窥探用户的隐私嘛,但是实际生活每一个公司都有在收集用户的一些行为,从而给用户推荐更好更合适他的产品等等,也算是有好处,就比如淘宝,你经常搜衣服,那么你的淘宝肯定展示更多的就是衣服,你经常搜吃的,那么展示的肯定就是吃的,还比如视频软件,如果你经常刷国际新闻,那肯定会更多的给你推荐国际新闻,如果你更新看正能量视频,肯定多多给你推正能量视频;也是一个好处,能让用户经常看到自己喜欢的,喜欢吃的,但是也有坏处:“信息茧房”,也就是往往你能看到的都是算法给你推荐的,算法想让你看的,有些消息你就看不到,刷不到;
通过给用户“标签”呢,别忘记了我们的set集合之间是可以做交并差集的,那么我们就可以拿不同的用户的标签来做对比,输出一样的,输出不一样的,如果是一样的,我们可以设法促进他们交流,比如都喜欢一个东西,那就可以促进消费嘛,这方面有益的是交友网站等等;
2、计算共同好友
3、统计UV
先解释两个概念,PV指的是page view,就是一个页面被访问的次数,一个用户可以访问很多次,有时候我们可能只需要访问量,但是有时候我们就需要统计有多少个用户访问了,这时候就可以使用UV了,UV指的是user view,就是有多少个不同的用户访问,利用的正好就是set的去重效果,如果当前第一次访问,UV存的数字就+1,PV+1,如果当前用户不是第一次访问,那就只是PV+1,这样就可以很好的统计访问量,还可以对各个时间段的访问量做统计分析结果