[Redis] Redis中的set和zset类型

news2024/9/19 2:06:26

🌸个人主页:https://blog.csdn.net/2301_80050796?spm=1000.2115.3001.5343
🏵️热门专栏:
🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm=1001.2014.3001.5482
🍕 Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm=1001.2014.3001.5482
🧀线程与网络(96平均质量分) https://blog.csdn.net/2301_80050796/category_12643370.html?spm=1001.2014.3001.5482
🍭MySql数据库(93平均质量分)https://blog.csdn.net/2301_80050796/category_12629890.html?spm=1001.2014.3001.5482
🍬算法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12676091.html?spm=1001.2014.3001.5482
🍃 Spring(97平均质量分)https://blog.csdn.net/2301_80050796/category_12724152.html?spm=1001.2014.3001.5482
🎃Redis(97平均质量分)https://blog.csdn.net/2301_80050796/category_12777129.html?spm=1001.2014.3001.5482
感谢点赞与关注~~~
在这里插入图片描述

目录

  • 1. Redis中关于set的操作
    • 1.1 概述
    • 1.2 常见操作
    • 1.3 集合间的操作
    • 1.4 指令小结
  • 2. set的内部编码方式
  • 3. Set的应用场景
  • 4. Redis中关于zset的操作
    • 4.1 概述
    • 4.2 常用指令
    • 4.3 集合间的操作
  • 5. zset内部编码方式
  • 6. zset的应用场景

1. Redis中关于set的操作

1.1 概述

我们在之前java的集合类中就曾经接触过set.在Java的集合框架中,set的实现方式可以是HashSet,也可以是TreeSet.
在Redis的集合中,就是把一些有关联的数据放在一起,其中保存的是多个字符串类型的元素.和Java中的set一样,set中的元素也是无序的,而且不允许重复.这里的限制条件完全和list相对,list中的元素可以重复,而且是有序的.Redis中的set还支持求交集,并集,差集.
在这里插入图片描述

1.2 常见操作

在set的相关操作指令中一般都包含s前缀.

  • sadd
    sadd key member [member...]
    在指定的key中插入一个或者多个元素.如果插入重复的元素,set会自动去重.一般我们把set中的元素叫做member.返回值表示这次成功添加了多少元素.
  • smembers
    smembers key
    查看指定key中的所有元素.
127.0.0.1:6379> sadd key 1 2 3 4 
(integer) 4
127.0.0.1:6379> SMEMBERS key
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> sadd key 2
(integer) 0
127.0.0.1:6379> SMEMBERS key
1) "1"
2) "2"
3) "3"
4) "4"
  • sismember
    sismember key member
    查看set中有没有该元素存在.返回1表示存在,返回0表示不存在.
127.0.0.1:6379> SMEMBERS key
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> SISMEMBER key 2
(integer) 1
127.0.0.1:6379> SISMEMBER key 5
(integer) 0
  • scard
    scard key
    查看指定的集合中有多少个元素.
127.0.0.1:6379> SCARD key
(integer) 4
  • spop
    spop key [count]
    从指定的key中删除元素,可以在count中指定删除的个数,如果不指定删除的个数,就是删除一个.在删除的时候,由于set中的元素是无序的,在删除的时候也是随机删除的.返回删除的元素.
127.0.0.1:6379> SPOP key 2
1) "1"
2) "2"
127.0.0.1:6379> spop key 
"4"
  • smove
    smove source destination member
    把源集合中指定的元素移动到指定的集合中.把member先从source中删除,再插入到destination中.返回的是移动成功的元素.
127.0.0.1:6379> SMEMBERS key
1) "3"
127.0.0.1:6379> SADD key 1 2 4
(integer) 3
127.0.0.1:6379> SADD key1 1
(integer) 1
127.0.0.1:6379> SMOVE key key1 2
(integer) 1
127.0.0.1:6379> SMEMBERS key1
1) "1"
2) "2"

如果移动给destination的元素和原来destination的元素是重复的,那么set也会自动去重.

127.0.0.1:6379> SADD key 2
(integer) 1
127.0.0.1:6379> SMEMBERS key
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> SMOVE key key1 2
(integer) 1
127.0.0.1:6379> SMEMBERS key1 
1) "1"
2) "2"

如果移动的元素在source中不存在,那么就返回的是0.

127.0.0.1:6379> SMEMBERS key
1) "1"
2) "3"
3) "4"
127.0.0.1:6379> SMOVE key key1 2
(integer) 0
  • srem
    srem key member [member...]
    删除指定key中的member.一次可以删除一个member,也可以删除多个member.返回删除成功的元素.
127.0.0.1:6379> SREM key 3 4
(integer) 2
127.0.0.1:6379> SMEMBERS key
1) "1"

1.3 集合间的操作

集合间的常见操作是求集合间的交集,并集和差集.
在这里插入图片描述

  • sinter
    sinter key [key...]
    求多个集合的交集.返回求交集之后的结果.如果集合只有一个.则返回该集合中的所有交集.
127.0.0.1:6379> SADD key 1 2 3 4
(integer) 4
127.0.0.1:6379> SADD key1 3 4 5 6
(integer) 4
127.0.0.1:6379> SINTER key
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> SINTER key key1
1) "3"
2) "4"
  • sinterstore
    sinterstore destination key [key...]
    求集合之间的交集,求交集之后把结果保存到指定的集合中.返回值是保存到destination中的元素个数.但是需要注意的是,在把交集的元素保存到destination之后,原来的destination的元素会被全部覆盖掉.
127.0.0.1:6379> sadd key2 1
(integer) 1
127.0.0.1:6379> SINTERSTORE key2 key1 key
(integer) 2
127.0.0.1:6379> SMEMBERS key2
1) "3"
2) "4"
  • sunion
    sunion key [key...]
    求出两个集合中的并集,返回求并集之后的结果.如果只有一个key.返回的就是该key中所有的元素.
127.0.0.1:6379> SUNION key key1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
127.0.0.1:6379> SUNION key
1) "1"
2) "2"
3) "3"
4) "4"
  • sunionstore
    sunionstore destination key [key...]
    把求并集的结果保存到指定的集合中.需要注意的是保存元素之后,destination中原有的元素会被全部覆盖.
127.0.0.1:6379> sadd key2 8
(integer) 1
127.0.0.1:6379> SUNIONSTORE key2 key1 key
(integer) 6
127.0.0.1:6379> SMEMBERS key2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
  • sdiff
    sdiff key [key...]
    求两个集合之间的差集,基准集合是写在前面的元素,也就是需要在基准集合的基础上减去在另一个集合中已经在基础集合中存在的元素.如果只有一个key,返回该key中的所有元素.
127.0.0.1:6379> SDIFF key1 key
1) "5"
2) "6"
127.0.0.1:6379> SDIFF key key1
1) "1"
2) "2"

在这里插入图片描述

  • sdiffstore
    sdiffstore destination key [key...]
    把集合之间差集的结果保存到指定的集合中,保存数据的集合中的原数据会被覆盖掉.
127.0.0.1:6379> SDIFFSTORE key2 key key1
(integer) 2
127.0.0.1:6379> SMEMBERS key2
1) "1"
2) "2"

1.4 指令小结

在这里插入图片描述

2. set的内部编码方式

Redis中的set的编码方式主要有两种,一种是intset,一种是hashtable.

  • intset
    当集合中的元素都是整数的时候,而且元素的个数小于512个的时候,set会使用intset来编码.
127.0.0.1:6379> SADD key3 1 2 3 4 
(integer) 4
127.0.0.1:6379> OBJECT encoding key3
"intset"
  • hashtable
    当无法满足intset的条件的时候,就会编码为hashtable.
127.0.0.1:6379> sadd key3 aaa
(integer) 1
127.0.0.1:6379> OBJECT encoding key3
"hashtable"

我们知道,在hashtable的编码在hash类型的数据中也存在,set中的编码也存在hashtable,这和Java中的set接口的实现方式可以是HashSet有些类似.

3. Set的应用场景

  • 使用Set来保存标签,以构造用户画像
    平台可以通过获取用户的信息和根据用户的浏览记录来分析这个用户的形象.也就是给这个用户上标签.比如分析出来你是一个青年,就会在set中加入"青年"这个标签,再比如你是一个男性,就会在set中加入"男性"这个标签.
    如果两家公司之间有着某种商业合作,他们就会共享用户的标签.获取到另一家公司对于这个用户的标签之后,放入到自家公司对于这个用户的标签中,如果对这个用户的标签有重复,那么set就可以自动去重.
sadd user:1:tags tag1 tag2 tag5
sadd user:2:tags tag2 tag3 tag5
...
sadd user:k:tags tag1 tag2 tag4
  • 使用set来计算用户之间的共同好友
    这个功能用的最多的是qq.他是基于集合求交集来实现的.
    比如A和B是好友,A和C是好友,B和C,D是好友,那么系统就会把D推荐给A.
  • 使用set统计UV
    这个功能主要使用的是set的去重功能来完成的.
    我们衡量一个互联网产品的流量,主要是通过两个指标来衡量的.第一是pv,第二是uv.
    PV就是每次访问该服务器都会产生一个PV,而uv是每个用户访问服务器都会产生uv,但是同一个用户多次访问不会使得uv增加,存储在set中的uv会按照用户进行去重.

4. Redis中关于zset的操作

4.1 概述

所谓zset,指的就是有序集合,有序集合中和集合set类似,其中的元素都是不可重复的,但是与set不同的是,set中的元素是有序的,在zset中,我们为member引入了score属性,在为member排序的时候,我们就是按照分数(score)来对member进行排序的,如果有其中两个元素的分数是相同的,那么就按照他们的字典序来排序,排列时,默认按照升序的方式来排列.但其中zset中存储的元素主要还是member,score只是对member起到了辅助作用.
在这里插入图片描述
下面是集合,列表,有序集合三者的异同点:
在这里插入图片描述

4.2 常用指令

  • zadd
    zadd key [NX|XX] [GT|LT] [CH] [INCR] socre member [socre member...]
    在我们给有序集合中添加元素的时候,即要添加分数,又要添加元素.可以一次添加一个元素和分数,还可以一次添加多个.如果修改元素的分数之后会影响到之前的顺序,就会自动移动元素的位置,重新排序.

其中,member和score可以理解为一个普通的pair,不可以把他们理解为哈希的关系,因为这里并没有明确谁是键,谁是值,他们是双向的,既可以通过member来找score,又可以通过score来找member.

[NX|XX],如果没有这两个参数中的其中一个的话,那么在添加元素和分数的时候,如果元素不存在,则添加新的元素和分数,如果元素已经存在,则会更新分数.
其中nx属性指的是只可以新建元素,不可以更新元素,和前面string类型中的类似,如果存在,就不添加,如果不存在,就添加.
xx属性指的是只可以更新元素,不可以新建元素,和前面的string类型中的类似,如果不存在,则不新建,如果存在,则覆盖掉之前的value.
[LT|GT],其中,LT是less than的缩写,GT是greater than的缩写,加上两个属性之后,如果加上LT属性,则在指定分数低于原来的分数的时候更新元素,如果加上的是GT属性,则在指定分数高于原来分数的时候更新元素,这两个属性并不会影响添加新的元素.
[CH],是change的缩写,在加上这个属性之前,返回值只包含成功添加的元素,在加上这个属性之后,就会包含更新的元素.
[INCR],类似与zincrby的效果,将指定的元素添加上对应的分数,此时只可以指定一个元素和分数.

  • zrange
    zrange key start stop [withscores]
    返回指定区间中的元素,区间为左闭右闭,如果加上withsocres的属性,带着分数会一起返回.其中和list类似,zrange key 0 -1 withscores表示的是返回zset中所有的元素.,zset中的元素是有序的,谁在前谁在后都是很明确的,所以就可以赋予有序集合中的元素"下标"这样的概念.
127.0.0.1:6379> zadd key 97 zhaoyun 93 zhangfei 96 guanyu 95 huangzhong
4
127.0.0.1:6379> zrange key 0 -1 withscores
zhangfei
93
huangzhong
95
guanyu
96
zhaoyun
97
127.0.0.1:6379> zadd key 99 zhaoyun 
0
127.0.0.1:6379> zrange key 0 -1 withscores
zhangfei
93
huangzhong
95
guanyu
96
zhaoyun
99
127.0.0.1:6379> zadd key nx ch 98 zhaoyun 
0
127.0.0.1:6379> zrange key 0 -1 withscores
zhangfei
93
huangzhong
95
guanyu
96
zhaoyun
99
127.0.0.1:6379> zadd key xx ch 98 zhaoyun 
1
127.0.0.1:6379> ZRANGE key 0 -1 withscores
zhangfei
93
huangzhong
95
guanyu
96
zhaoyun
98
127.0.0.1:6379> zadd key ch incr 2 huangzhong
97
127.0.0.1:6379> zrange key 0 -1 withscores
zhangfei
93
guanyu
96
huangzhong
97
zhaoyun
98
  • zcard
    zcard key
    查询指定的key中有多少个元素.
127.0.0.1:6379> zrange key 0 -1 withscores
zhangfei
93
guanyu
96
huangzhong
97
zhaoyun
98
127.0.0.1:6379> zcard key
4
  • zcount
    zcount key min max
    返回指定分数区间的元素个数,默认都是闭区间,如果想要指定为开区间,可以在分数的前面加上"(".其中,max和min可以是浮点数,也可以使用-inf+inf来表示正无穷和负无穷.
127.0.0.1:6379> ZCOUNT key 93 97
3
127.0.0.1:6379> ZCOUNT key (93 97
2
127.0.0.1:6379> ZCOUNT key -inf +inf
4
127.0.0.1:6379> ZCOUNT key 92.5 97
3
  • zrevrange
    zrevrange key start stop [withsocres]
    把元素按照分数以降序的方式进行打印,加上withscores选项会把分数也打印出来.其中zrevrange key 0 -1 withscores表示的是降序打印所有的元素.
127.0.0.1:6379> ZREVRANGE key 0 -1 withscores 
zhaoyun
98
huangzhong
97
guanyu
96
zhangfei
93
  • zrangebysocre
    zrangebyscore key min max [withsocres]
    这个指令和zcount有些类似,不过zcount返回的是指定分数区间的元素个数,而这里返回的是指定区间的元素.默认区间是闭区间,可以通过加上"("来指定为开区间.其中min和max可以是浮点数,也可以用-inf+inf来表示正无穷和负无穷.
127.0.0.1:6379> ZRANGEBYSCORE key 93 97 withscores
zhangfei
93
guanyu
96
huangzhong
97
127.0.0.1:6379> ZRANGEBYSCORE key (93 97 withscores
guanyu
96
huangzhong
97
127.0.0.1:6379> ZRANGEBYSCORE key (93 96.5 withscores
guanyu
96
  • zpopmax
    zpopmax key [count]
    删除并返回分数最高的count个元素,如果没有加count选项,默认返回一个.这个指令有些类似于我们前面所学的top-k问题.如果存在多个元素分数相同,那么在删除的时候,依然按照字典序只删除一个元素.
127.0.0.1:6379> ZADD key 98 machao
1
127.0.0.1:6379> ZREVRANGE key 0 -1 withscores
zhaoyun
98
machao
98
huangzhong
97
guanyu
96
zhangfei
93
127.0.0.1:6379> ZPOPMAX key 
zhaoyun
98
127.0.0.1:6379> ZPOPMAX key
machao
98
127.0.0.1:6379> ZADD key 98 zhaoyun 
1
127.0.0.1:6379> zadd key 98 machao
1
127.0.0.1:6379> ZPOPMAX key 2
zhaoyun
98
machao
98
  • bzpopmax
    bzpopmax key [key...] timeout
    zpopmax的阻塞版本,与之前学的blpop类似,一次可以指定一个key,一次可以指定多个key,如果指定多个key,就会从前到后遍历这些key,如果有可以返回的元素,则会立即返回,如果获取不到,则会阻塞等待,在指定时间之后返回nil.
27.0.0.1:6379> zadd key 98 zhaoyun
1
127.0.0.1:6379> BZPOPMAX key 5
key
zhaoyun
98
127.0.0.1:6379> ZADD key1 98 machao
1
127.0.0.1:6379> BZPOPMAX key key1 5
key
huangzhong
97
//客户端1
127.0.0.1:6379> BZPOPMAX key2 100
key2
zhugeliang
96
//客户端2
127.0.0.1:6379> zadd key2 96 zhugeliang
(integer) 1
  • zpopmin
    zpopmin key [count]
    删除并返回分数最低的count个元素,如果没有加count选项,默认返回一个.这个指令有些类似于我们前面所学的top-k问题.如果存在多个元素分数相同,那么在删除的时候,依然按照字典序只删除一个元素.
127.0.0.1:6379> ZADD key 91 machao 91 zhugeliang
2
127.0.0.1:6379> ZPOPMIN key 
machao
91
127.0.0.1:6379> ZPOPMIN key
zhugeliang
91
127.0.0.1:6379> ZADD key 91 machao 91 zhugeliang
2
127.0.0.1:6379> ZPOPMIN key 2
machao
91
zhugeliang
91
  • bzpopmin
    用法和bzpopmin一样,这里不再赘述.
  • zrank
    返回指定元素的排名,基于的是升序排列.需要注意的是,这里的排名是从0开始的.
127.0.0.1:6379> zadd key 97 zhaoyun 94 machao
2
127.0.0.1:6379> zrange key 0 -1 withscores
zhangfei
93
machao
94
guanyu
96
zhaoyun
97
127.0.0.1:6379> zrank key machao
1
127.0.0.1:6379> zrank key zhangfei
0
  • zrevrank
    zrevrank key member
    返回指定元素的排名,基于的是降序排列.zrank,zrevrank和zrange,zrevrange的关系一样.
127.0.0.1:6379> zrange key 0 -1 withscores
zhangfei
93
machao
94
guanyu
96
zhaoyun
97
127.0.0.1:6379> ZREVRANK key zhaoyun
0
  • zscore
    zscore key member
    返回指定元素的分数
127.0.0.1:6379> ZSCORE key zhaoyun
97
  • zrem
    zrem key member [member...]
    删除key中指定的元素
127.0.0.1:6379> ZREM key machao
1
127.0.0.1:6379> zrange key 0 -1 withscores
zhangfei
93
guanyu
96
zhaoyun
97
  • zremrangebyrank
    zremrangebyrank key start stop
    删除指定下标范围之间的元素,默认是升序.
127.0.0.1:6379> ZADD key 98 machao 99 liubei
2
127.0.0.1:6379> ZREMRANGEBYRANK key 0 1
2
127.0.0.1:6379> zrange key 0 -1 withscores
zhaoyun
97
machao
98
liubei
99
  • zremrangebyscore
    zremrangebyscore key max min
    删除指定分数范围之间的元素,默认是升序
127.0.0.1:6379> zadd key 98 machao 99 liubei
2
127.0.0.1:6379> zrange key 0 -1 withscores
zhangfei
93
guanyu
96
zhaoyun
97
machao
98
liubei
99
127.0.0.1:6379> ZREMRANGEBYSCORE key 98 99
2
127.0.0.1:6379> zrange key 0 -1 withscores
zhangfei
93
guanyu
96
zhaoyun
97
  • zincrby
    zincrby key incrment member
    为指定的元素加上指定的分数,之后会重新进行排序,和我们前面提到的zadd key incr score member指令类似.
127.0.0.1:6379> zrange key 0 -1 withscores
zhaoyun
97
machao
98
liubei
99
127.0.0.1:6379> ZINCRBY key 2 zhaoyun
99
127.0.0.1:6379> zrange key 0 -1 withscores
machao
98
liubei
99
zhaoyun
99

4.3 集合间的操作

集合间的操作我们在上一篇文章中提到过,包含交集,差集,并集.那么在zset中,有没有与set中类似的zinter,zunion,zdiff的指令呢?在Redis6.2之后的版本确实有,但是在我们当前Redis5的版本中没有这样的指令.
zset中常见的集合间操作指令有两个,zinterstore,zunionstore.

  • zinterstore
    ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE <SUM | MIN | MAX>]
    • destination: 指的是求出交集之后保存结果的集合.
    • numkeys: 指的是后面要求交集的集合个数.
    • weights: 前面求交集的key的权重,会在前面对应的key的分数中乘以权重.
    • aggregate: 集合间分数的计算方式,可以是加和,可以取最大值,可以取最小值.如果不加的话,默认是sum

这里为什么要使用numkeys指定求交集的key的个数.这是因为在key之后还有其他的一些属性,我们要使用numkeys把key和其他属性做出区分.这个功能和我们之前学习http协议的时候,报头中的content-length的功能有些相似.用于区分开报头和正文.

127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> zadd key 99 zhaoyun 97 liubei 96 caocao 95 machao 
4
127.0.0.1:6379> zadd key1 97 zhaoyun 92 zhangfei 93 caocao 97 huangzhon
4
127.0.0.1:6379> zadd key2 93 zhugeliang
1
127.0.0.1:6379> ZINTERSTORE key2 2 key key1 aggregate sum
2
127.0.0.1:6379> zrange key2 0 -1 withscores
caocao
189
zhaoyun
196
127.0.0.1:6379> ZINTERSTORE key2 2 key key1 weights 1.2 1.5
(integer) 2
127.0.0.1:6379> zrange key2 0 -1 withscores
1) "caocao"
2) "254.69999999999999"
3) "zhaoyun"
4) "264.30000000000001"

在这里插入图片描述

  • zunionstore
    ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight[weight ...]] [AGGREGATE <SUM | MIN | MAX>]
    选项和上面的求交集的一样,这里不再赘述.
127.0.0.1:6379> zunionstore key2 2 key key1 aggregate sum
(integer) 6
127.0.0.1:6379> zrange key2 0 -1 withscores
 1) "zhangfei"
 2) "92"
 3) "machao"
 4) "95"
 5) "huangzhon"
 6) "97"
 7) "liubei"
 8) "97"
 9) "caocao"
10) "189"
11) "zhaoyun"
12) "196"
127.0.0.1:6379> ZUNIONSTORE key2 2 key key1 weights 1.2 1.5 aggregate sum
(integer) 6
127.0.0.1:6379> zrange key2 0 -1 withscores
 1) "machao"
 2) "114"
 3) "liubei"
 4) "116.39999999999999"
 5) "zhangfei"
 6) "138"
 7) "huangzhon"
 8) "145.5"
 9) "caocao"
10) "254.69999999999999"
11) "zhaoyun"
12) "264.30000000000001"

在这里插入图片描述

5. zset内部编码方式

zset内部编码方式主要有两种方式,一种是ziplist,一种是skiplist.

  • ziplist
    如果有序集合中元素个数较少,或者单个元素体积较小,我们就使用ziplist来编码.默认整体元素个数不超过512个,默认单个元素不超过64字节.
  • skiplist
    当ziplist不满足条件的时候,就会使用skiplist的编码方式.
127.0.0.1:6379> zadd key1 91 aaa 92 bbb 98 ccc
(integer) 3
127.0.0.1:6379> OBJECT encoding key1
"ziplist"
127.0.0.1:6379> zadd key1 nx 94 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
(integer) 1
127.0.0.1:6379> OBJECT encoding key1
"skiplist"

6. zset的应用场景

zset最典型的应用场景,就是排行榜系统.比如微博热搜,游戏天梯排行系统等.最关键的要点就是,排行榜的分数是实时变化的.

  • 游戏天梯排行.
    我们只需要把玩家的信息和对应的分数给放到一个有序的集合中即可,Redis就会自动帮我们生成一个排行榜.随时可以按照排行,按照分数,进行范围查询.随着分数的改变,也可以比较方便地实用zincrby修改分数,排行顺序也可以自动调整.
  • 微博热搜
    微博中的每一个帖子都有各种各样的信息,包括点赞数,浏览数,转发数,评论数等.这时候我们就可以在Redis中使用求交集的方法或者使用求并集的方法,针对每一个帖子不同的信息赋予不同的权重,这样综合考虑下来计算得到综合分数,就计算出了最终一个帖子的热度,求得交集或者并集的zset中也会自动按照综合热度进行排行.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2142522.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

动手学深度学习8.5. 循环神经网络的从零开始实现-笔记练习(PyTorch)

本节课程地址&#xff1a;从零开始实现_哔哩哔哩_bilibili 本节教材地址&#xff1a;8.5. 循环神经网络的从零开始实现 — 动手学深度学习 2.0.0 documentation (d2l.ai) 本节开源代码&#xff1a;...>d2l-zh>pytorch>chapter_multilayer-perceptrons>rnn-scratc…

【优化器】Optimizer——深度学习中的优化器是什么作用呢?

【优化器】Optimizer——深度学习中的优化器是什么作用呢&#xff1f; 【优化器】Optimizer——深度学习中的优化器是什么作用呢&#xff1f; 文章目录 【优化器】Optimizer——深度学习中的优化器是什么作用呢&#xff1f;1.什么是优化器&#xff1f;梯度下降法3. 常见的优化…

数据结构易错整理1

目录 数据结构的基础概念 数据结构基础概念 数据结构的逻辑结构 数据结构的物理结构 算法分析 时间复杂度 例题 数据结构的基础概念 数据结构基础概念 设计存储结构时不仅要存储格数据元素的值&#xff0c;而且还要存储数据元素之间的关系 数据结构具有特定关系的数据…

C/C++语言基础--从C到C++的不同(下),15个部分说明C与C++的不同

本专栏目的 更新C/C的基础语法&#xff0c;包括C的一些新特性 前言 1-10在上篇C/C语言基础–从C到C的不同(上&#xff09;&#xff1b;当然C和C的不同还有很多&#xff0c;本人暂时只总结这些&#xff0c;其他的慢慢更新&#xff1b;上一篇C/C语言基础–从C到C的不同(上&…

Sass实现文字两侧横线及Sass常用方案

Sass常用方案及Sass实现文字两侧横线 1.Sass实现文字两侧横线2.用Sass简化媒体查询3.使用继承占位符实现样式复用4.Sass 模块化5.lighten 和 darken 自我记录 1.Sass实现文字两侧横线 mixin 的基本作用&#xff1a; 代码复用&#xff1a;把常用的样式封装在一起&#xff0c;…

C++和OpenGL实现3D游戏编程【目录】

欢迎来到zhooyu的专栏。 个人主页&#xff1a;【zhooyu】 文章专栏&#xff1a;【OpenGL实现3D游戏编程】 贝塞尔曲面演示&#xff1a; 贝塞尔曲面演示zhooyu 本专栏内容&#xff1a; 我们从游戏的角度出发&#xff0c;用C去了解一下游戏中的功能都是怎么实现的。这一切还是要…

【刷题日记】螺旋矩阵

54. 螺旋矩阵 这个是一道模拟题&#xff0c;但我记得我大一第一次做这道题的时候真的就是纯按步骤模拟&#xff0c;没有对代码就行优化&#xff0c;导致代码写的很臃肿。 有这么几个地方可以改进。 看题目可以知道最终的结果一定是rows*cols个结点,所以只需要遍历rows*cols次…

Docker部署镜像 发布容器 容器网络互联 前端打包

准备工作 导入相关依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.7</version></dependency><dependency><groupId>com.baomidou<…

CLIP论文中关键信息记录

由于clip论文过长&#xff0c;一直无法完整的阅读该论文&#xff0c;故而抽取论文中的关键信息进行记录。主要记录clip是如何实现的的&#xff08;提出背景、训练数据、设计模式、训练超参数、prompt的作用&#xff09;&#xff0c;clip的能力&#xff08;clip的模型版本、clip…

【Python机器学习】序列到序列建模——对序列到序列模型的增强

有两种增强训练序列到序列模型的方法&#xff0c;可以提高模型的精确率和可扩展性。 使用装桶法降低训练复杂度 输入序列可以有不同的长度&#xff0c;这使短序列的训练数据添加了大量填充词条。过多的填充会使计算成本高昂&#xff0c;特别是当大多数序列都很短&#xff0c;…

你的绩效是不是常年都是B

原创不易&#xff0c;求赞&#xff0c;求关注&#xff0c;&#x1f64f;&#x1f64f;&#x1f64f;&#x1f64f;&#x1f64f;&#x1f64f;&#x1f64f;&#x1f64f; 目录 原创不易&#xff0c;求赞&#xff0c;求关注&#xff0c;&#x1f64f;&#x1f64f;&#x1f64…

村落检测系统源码分享

村落检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

Chainlit集成Langchain并使用通义千问AI知识库高级检索(多重查询)网页对话应用教程

前言 之前写过几篇利用Chainlit集成Langchain和国内通义千问大模型集成的知识库检索增加的网页对话应用的技术文章。文章中关于Langchain的知识库检索只是入门级别的教学&#xff0c;本篇文章针对Langchain的知识库高级检索技术和之前对话应用的代码进行完善。 本次主要改进的…

月薪14K的网安公司,来做一下笔试题呀~

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 网络安全简介…

leetcode-枚举算法

1.两数之和 题目一&#xff1a;两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素…

JVM JMM 专题篇 ( 12000 字详解 )

一&#xff1a;JVM 简介 JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java 虚拟机&#xff0c;虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。 常见的虚拟机&#xff1a;JVM、VMwave、Virtual Box&#xff0c;JVM 和其…

微调大模型不再难:LoRA方法带你轻松节省99%的训练成本!

我们之前说大模型有四种玩家&#xff0c;其中前三种都是要做模型训练的。而大部分公司或个人&#xff0c;都是在第二种开源大模型的基础上来做训练。 而这种训练方式又分为两种。一种要么就是从头训练&#xff0c;要么就Fine-tuning接着开源模型来训练&#xff0c;在基座模型已…

IP 协议分析《实验报告》

目录 一、 实验目的 二、实验设备和环境 三、实验记录 1、实验环境搭建 2、IP 协议分析 1.设置抓包接口 2.IP 报文分析 3.报文长度计算 4.生存时间 TTL 5.分析总结 3、IP分片 1.IP 分片简介 2.捕获分组 3.结果分析 一、 实验目的 1、掌握 IP 协议数据报格式&…

知识图谱与异构图神经网络(7)--1

知识图谱是由实体(节点)和关系( 不同类型的边) 组成的多关系图。作为一种非常重要又特殊的图结构数据&#xff0c;知识图谱被广泛应用在人工智能和自然语言处理领域&#xff0c;从语义解析、命名实体消歧到问答系统、推荐系统中都可以看到来自知识图谱的技术推动。本质上&#…

树和二叉树基本术语、性质

目录 树的相关知识 常见考点1&#xff1a;结点数总度数&#xff0b;1 常见考点2&#xff1a; 度为m的树和m叉树 常见考点3&#xff1a;度为m的树第i层至多有结点数 常见考点4&#xff1a;高度为h的m叉树至多有结点 ​编辑 常见考点5&#xff1a;高度为h的m叉树&#xff0c;高…