日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

redis系列:通过文章点赞排名案例学习sortedset命令

發(fā)布時(shí)間:2025/6/17 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 redis系列:通过文章点赞排名案例学习sortedset命令 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

這一篇文章將講述Redis中的sortedset類(lèi)型命令,同樣也是通過(guò)demo來(lái)講述,其他部分這里就不在贅述了。

項(xiàng)目Github地址:https://github.com/rainbowda/learnWay/tree/master/learnRedis/case-sortedset

案例

demo功能是文章點(diǎn)贊排名等等,整個(gè)demo的大致頁(yè)面如下。

準(zhǔn)備工作

首先定義一個(gè)存儲(chǔ)文章的key

private static final String ZSET_KEY = "articleList";

redis操作對(duì)象

private RedisTemplate redisTemplate; //string 命令操作對(duì)象 private ValueOperations valueOperations; //zset 命令操作對(duì)象 private ZSetOperations zSetOperations;

sortedset在Redis中的結(jié)構(gòu)可以看下圖(圖片來(lái)源于Redis in Action)。

列表查詢(xún)

@RequestMapping(value = "/getList/{sortType}", method = RequestMethod.GET) public Set getList(@PathVariable String sortType) {//如果沒(méi)有數(shù)據(jù),則添加10條數(shù)據(jù)if (zSetOperations.size(ZSET_KEY) == 0){for (int i = 1; i <= 10; i++) {zSetOperations.add(ZSET_KEY,"文章:"+i, (int)(Math.random()*10+i));}}//ASC根據(jù)分?jǐn)?shù)從小到大排序,DESC反之if ("ASC".equals(sortType)){return zSetOperations.rangeWithScores(ZSET_KEY, 0, -1);} else {return zSetOperations.reverseRangeWithScores(ZSET_KEY, 0, -1);} }

這里為了省去一個(gè)個(gè)添加數(shù)據(jù)的麻煩,就在獲取列表數(shù)據(jù)中加了個(gè)判斷。當(dāng)文章數(shù)據(jù)為0時(shí),默認(rèn)添加10條數(shù)據(jù),設(shè)置隨機(jī)score加上所在的索引。
然后根據(jù)url中的參數(shù)sortType來(lái)決定返回的數(shù)據(jù)是按照分?jǐn)?shù)升序還是降序排序。功能效果如下

命令介紹

命令用例描述
ZADDZADD key [NX\XX][CH] [INCR] score member [score member ...]將所有指定成員添加到鍵為key有序集合(sorted set)里面
ZRANGEZRANGE key start stop [WITHSCORES]返回有序集key中,指定區(qū)間內(nèi)的成員。其中成員的位置按score值遞減(從小到大)來(lái)排列。
ZREVRANGEZREVRANGE key start stop [WITHSCORES]返回有序集key中,指定區(qū)間內(nèi)的成員。其中成員的位置按score值遞減(從大到小)來(lái)排列。

贊或踩

java代碼如下

@RequestMapping(value = "/star", method = RequestMethod.POST) public boolean starOrUnStar(String member, String type) {if ("UP".equals(type)){zSetOperations.incrementScore(ZSET_KEY, member, 1);} else {zSetOperations.incrementScore(ZSET_KEY, member, -1);}return true; }

根據(jù)type決定是否加減分?jǐn)?shù),當(dāng)type為UP時(shí)表示贊,為其他(DOWN)時(shí)表示踩。功能效果如下

命令介紹

命令用例描述
ZINCRBYZINCRBY key increment member為有序集key的成員member的score值加上增量increment

升降序排名

java代碼如下

@RequestMapping(value = "/rank/{type}/{member}", method = RequestMethod.GET) public Long rank(@PathVariable String member, @PathVariable String type) {Long rank = null;if ("ASC".equals(type)){rank = zSetOperations.rank(ZSET_KEY, member);} else {rank = zSetOperations.reverseRank(ZSET_KEY, member);}return rank; }

根據(jù)type決定是升序排名還是降序排名,如果是ASC則調(diào)用rank方法獲取升序排名,其他則調(diào)用reverseRank獲取降序排名。與下方redis命令類(lèi)似

ZRANK articleList "文章1" ZREVRANK articleList "文章1"

頁(yè)面效果圖如下

命令介紹

命令用例描述
ZRANKZRANK key member返回有序集key中成員member的排名。其中有序集成員按score值遞增(從小到大)順序排列。排名以0為底,也就是說(shuō),score值最小的成員排名為0。
ZREVRANKZREVRANK key member返回有序集key中成員member的排名,其中有序集成員按score值從大到小排列。

其他命令

獲取屬性

命令用例描述
ZCARDZCARD key返回key的有序集元素個(gè)數(shù)。
ZCOUNTZCOUNT key min max返回有序集key中,score值在min和max之間(默認(rèn)包括score值等于min或max)的成員個(gè)數(shù)。
ZLEXCOUNTZLEXCOUNT key min max用于計(jì)算有序集合中指定成員之間的成員數(shù)量。
ZSCOREZSCORE key member返回有序集key中,成員member的score值。
ZCARD命令

返回key的有序集元素個(gè)數(shù)。
ZCARD key
返回值:key存在的時(shí)候,返回有序集的元素個(gè)數(shù),否則返回0。

redis客戶端執(zhí)行的命令如下

zadd zCardKey 1 one zcard zCardKey

下面是java代碼

@Test public void zCard() {jedis.zadd("zCardKey",1, "one");jedis.zadd("zCardKey",2, "two");System.out.println(jedis.zcard("zCardKey"));System.out.println(zSetOperations.size("zCardKey")); }
ZCOUNT命令

返回有序集key中,score值在min和max之間(默認(rèn)包括score值等于min或max)的成員數(shù)量。
ZCOUNT key min max
返回值:指定分?jǐn)?shù)范圍的元素個(gè)數(shù)。

redis客戶端執(zhí)行的命令如下

zadd zCountKey 1 one 2 two 3 three 4 four zcount zCountKey 2 3

執(zhí)行結(jié)果如下

下面是java代碼

@Test public void zCount() {jedis.zadd("zCountKey",1, "one");jedis.zadd("zCountKey",2, "two");jedis.zadd("zCountKey",3, "three");jedis.zadd("zCountKey",4, "four");System.out.println(jedis.zcount("zCountKey",2, 3));System.out.println(zSetOperations.count("zCountKey",2, 3)); }
ZLEXCOUNT命令

計(jì)算有序集合中指定成員之間的成員數(shù)量(按成員字典正序排序),可以使用 - 和 + 表示score最小值和最大值
ZLEXCOUNT key min max

redis客戶端執(zhí)行的命令如下

ZADD zLexCountKey 2 "b" 1 "a" 3 "c" 5 "e" 4 "d" ZLEXCOUNT zLexCountKey - + ZLEXCOUNT zLexCountKey [b [d

執(zhí)行結(jié)果如下

下面是java代碼

@Test public void zLexCount() {zSetOperations.add("zLexCountKey", "b", 2);zSetOperations.add("zLexCountKey", "a", 1);zSetOperations.add("zLexCountKey", "c", 3);zSetOperations.add("zLexCountKey", "e", 5);zSetOperations.add("zLexCountKey", "d", 4);System.out.println(jedis.zlexcount("zLexCountKey", "-", "+"));System.out.println(jedis.zlexcount("zLexCountKey", "[b", "[d")); }
ZSCORE命令

返回有序集key中,成員member的score值。
ZSCORE key member
返回值:成員member的score值

redis客戶端執(zhí)行的命令如下

zadd zScoreKey 1 one ZSCORE zScoreKey one

下面是java代碼

@Test public void zScore() {jedis.zadd("zScoreKey",1, "one");System.out.println(jedis.zscore("zScoreKey", "one"));System.out.println(zSetOperations.score("zScoreKey", "one")); }

獲取成員

命令用例描述
ZRANGEBYLEXZRANGEBYLEX key min max [LIMIT offset count] 返回指定成員區(qū)間內(nèi)的成員,按成員字典正序排序。
ZRANGEBYSCOREZRANGEBYSCORE key min max [WITHSCORES]`[LIMIT offset count]`返回所有符合score條件的成員
ZREVRANGEBYLEXZREVRANGEBYLEX key max min [LIMIT offset count] 返回指定成員區(qū)間內(nèi)的成員,按成員字典倒序排序。
ZREVRANGEBYSCOREZREVRANGEBYSCORE key max min [WITHSCORES]`[LIMIT offset count]`返回有序集合中指定分?jǐn)?shù)區(qū)間內(nèi)的成員,分?jǐn)?shù)由高到低排序。
ZSCANZSCAN key cursor [MATCH pattern]`[COUNT count]`請(qǐng)參考 SCAN
ZRANGEBYLEX命令

返回指定成員區(qū)間內(nèi)的成員,按成員字典正序排序。https://redis.io/commands/zrangebylex
ZRANGEBYLEX key min max [LIMIT offset count]
返回值:指定成員范圍的元素列表。

redis客戶端執(zhí)行的命令如下

ZADD zRangeByLexKey 0 ba 0 a 0 ab 0 aa 0 b ZRANGEBYLEX zRangeByLexKey - + ZRANGEBYLEX zRangeByLexKey [aa (ba

執(zhí)行結(jié)果如下

下面是java代碼

@Test public void zRangeByLex() {zSetOperations.add("zRangeByLexKey", "ba", 0);zSetOperations.add("zRangeByLexKey", "a", 0);zSetOperations.add("zRangeByLexKey", "ab", 0);zSetOperations.add("zRangeByLexKey", "aa", 0);zSetOperations.add("zRangeByLexKey", "b", 0);System.out.println(jedis.zrangeByLex("zRangeByLexKey", "-", "+"));RedisZSetCommands.Range range = new RedisZSetCommands.Range();range.gte("aa");range.lt("ba");System.out.println(zSetOperations.rangeByLex("zRangeByLexKey",range)); }
ZRANGEBYSCORE命令

獲取score在范圍之內(nèi)的數(shù)據(jù)。min和max可以是-inf和+inf
ZRANGEBYSCORE key min max [WITHSCORES]`[LIMIT offset count] `

redis客戶端執(zhí)行的命令如下

ZADD zRangeByScoreKey 1 ba 2 a 3 ab 4 aa 5 b ZRANGEBYSCORE zRangeByScoreKey -inf +inf ZRANGEBYSCORE zRangeByScoreKey 2 4

執(zhí)行結(jié)果如下

下面是java代碼

@Test public void zRangeByScore() {zSetOperations.add("zRangeByScoreKey", "ba", 1);zSetOperations.add("zRangeByScoreKey", "a", 2);zSetOperations.add("zRangeByScoreKey", "ab", 3);zSetOperations.add("zRangeByScoreKey", "aa", 4);zSetOperations.add("zRangeByScoreKey", "b", 5);System.out.println(jedis.zrangeByScore("zRangeByScoreKey", "-inf", "+inf"));RedisZSetCommands.Range range = new RedisZSetCommands.Range();System.out.println(zSetOperations.rangeByScore("zRangeByScoreKey", 2, 4)); }

移除相關(guān)命令

命令用例描述
ZREMZREM key member [member ...]刪除有序集合中的成員
ZREMRANGEBYLEXZREMRANGEBYLEX key min max刪除名稱(chēng)按字典由低到高排序成員之間所有成員
ZREMRANGEBYRANKZREMRANGEBYRANK key start stop移除有序集key中,指定排名(rank)區(qū)間內(nèi)的所有成員。
ZREMRANGEBYSCOREZREMRANGEBYSCORE key min max移除有序集key中,所有score值介于min和max之間(包括等于min或max)的成員
ZREM命令

ZREM key member [member ...]
返回值:有序集合中刪除的成員個(gè)數(shù)

redis客戶端執(zhí)行的命令如下

ZADD zRemKey 1 "one" 2 "two" 3 "three" ZREM zRemKey one ZRANGE zRemKey 0 -1

執(zhí)行結(jié)果如下

下面是java代碼

@Test public void zRem() {zSetOperations.add("zRemKey", "one", 1);zSetOperations.add("zRemKey", "two", 2);zSetOperations.add("zRemKey", "three", 3);//jedis.zrem("zRemKey", "one");zSetOperations.remove("zRemKey", "one");System.out.println(zSetOperations.range("zRemKey", 0 , -1)); }

交并集

命令用例描述
ZINTERSTOREZINTERSTORE destination numkeys key [key ...]`[WEIGHTS weight] [SUM\MIN\MAX]`計(jì)算給定的numkeys個(gè)有序集合的交集,并且把結(jié)果放到destination中
ZUNIONSTOREZUNIONSTORE destination numkeys key [key ...]`[WEIGHTS weight] [SUM\MIN\MAX]`計(jì)算給定的numkeys個(gè)有序集合的并集,并且把結(jié)果放到destination中
ZINTERSTORE命令

計(jì)算給定的numkeys個(gè)有序集合的交集,并且把結(jié)果放到destination中。
在給定要計(jì)算的key和其它參數(shù)之前,必須先給定key個(gè)數(shù)(numberkeys)。
默認(rèn)情況下,結(jié)果中一個(gè)元素的分?jǐn)?shù)是有序集合中該元素分?jǐn)?shù)之和,前提是該元素在這些有序集合中都存在。因?yàn)榻患笃涑蓡T必須是給定的每個(gè)有序集合中的成員,結(jié)果集中的每個(gè)元素的分?jǐn)?shù)和輸入的有序集合個(gè)數(shù)相等。
對(duì)于WEIGHTS和AGGREGATE參數(shù)的描述,參見(jiàn)命令ZUNIONSTORE。
如果destination存在,就把它覆蓋。

ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
返回值:結(jié)果有序集合destination中元素個(gè)數(shù)。
redis客戶端執(zhí)行的命令如下

ZADD zInterStoreKey1 1 "one" 2 "two" ZADD zInterStoreKey2 1 "one" 2 "two" 3 "three" ZINTERSTORE zInterStoreSumResult 2 zInterStoreKey1 zInterStoreKey2 WEIGHTS 2 3ZRANGE zInterStoreSumResult 0 -1 WITHSCORES

執(zhí)行結(jié)果如下

下面是java代碼

@Test public void zInterStore() {zSetOperations.add("zInterStoreKey1", "one", 1);zSetOperations.add("zInterStoreKey1", "two", 2);zSetOperations.add("zInterStoreKey2", "one", 1);zSetOperations.add("zInterStoreKey2", "two", 2);zSetOperations.add("zInterStoreKey2", "three", 3);ZParams zParams = new ZParams();zParams.weightsByDouble(2, 3);zParams.aggregate(ZParams.Aggregate.SUM);jedis.zinterstore("zInterStoreSumResult", zParams, "zInterStoreKey1", "zInterStoreKey2");printTuple("zInterStoreSumResult", jedis.zrangeWithScores("zInterStoreSumResult", 0, -1)); }
ZUNIONSTORE命令

計(jì)算給定的numkeys個(gè)有序集合的并集,并且把結(jié)果放到destination中。
WEIGHTS參數(shù)相當(dāng)于權(quán)重,默認(rèn)就是1,可以給不同的key設(shè)置不同的權(quán)重
AGGREGATE參數(shù)默認(rèn)使用的參數(shù)SUM,還可以選擇MIN或者M(jìn)AX。這個(gè)參數(shù)決定結(jié)果集的score是取給定集合中的相加值、最小值還是最大值
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...] ] [AGGREGATE SUM|MIN|MAX]

redis客戶端執(zhí)行的命令如下

ZADD zUnionStoreKey1 1 "one" 2 "two" ZADD zUnionStoreKey2 1 "one" 2 "two" 3 "three" ZUNIONSTORE zUnionStoreSumResult 2 zUnionStoreKey1 zUnionStoreKey2 WEIGHTS 2 3 ZUNIONSTORE zUnionStoreMinResult 2 zUnionStoreKey1 zUnionStoreKey2 WEIGHTS 2 3 AGGREGATE MIN ZUNIONSTORE zUnionStoreMaxResult 2 zUnionStoreKey1 zUnionStoreKey2 WEIGHTS 2 3 AGGREGATE MAX* ZRANGE zUnionStoreSumResult 0 -1 WITHSCORES ZRANGE zUnionStoreMinResult 0 -1 WITHSCORES ZRANGE zUnionStoreMaxResult 0 -1 WITHSCORES

執(zhí)行結(jié)果如下

下面是java代碼

@Test public void zUnionStore() {zSetOperations.add("zUnionStoreKey1", "one", 1);zSetOperations.add("zUnionStoreKey1", "two", 2);zSetOperations.add("zUnionStoreKey2", "one", 1);zSetOperations.add("zUnionStoreKey2", "two", 2);zSetOperations.add("zUnionStoreKey2", "three", 3);ZParams zParams = new ZParams();zParams.weightsByDouble(2, 3);zParams.aggregate(ZParams.Aggregate.SUM);jedis.zunionstore("zUnionStoreSumResult", zParams, "zUnionStoreKey1", "zUnionStoreKey2");//求最小值z(mì)Params.aggregate(ZParams.Aggregate.MIN);jedis.zunionstore("zUnionStoreMinResult", zParams, "zUnionStoreKey1", "zUnionStoreKey2");//求最大值z(mì)Params.aggregate(ZParams.Aggregate.MAX);jedis.zunionstore("zUnionStoreMaxResult", zParams, "zUnionStoreKey1", "zUnionStoreKey2");//springzSetOperations.unionAndStore("zUnionStoreKey1", "zUnionStoreKey2", "zUnionStoreResult");printTuple("zUnionStoreSumResult", jedis.zrangeWithScores("zUnionStoreSumResult", 0, -1));printTuple("zUnionStoreMinResult", jedis.zrangeWithScores("zUnionStoreMinResult", 0, -1));printTuple("zUnionStoreMaxResult", jedis.zrangeWithScores("zUnionStoreMaxResult", 0, -1));printTuple("zUnionStoreResult", jedis.zrangeWithScores("zUnionStoreResult", 0, -1)); }

還是那句話建議學(xué)習(xí)的人最好每個(gè)命令都去敲下,加深印象。

紙上得來(lái)終覺(jué)淺,絕知此事要躬行?!鲎浴抖棺x書(shū)示子聿》

總結(jié)

以上是生活随笔為你收集整理的redis系列:通过文章点赞排名案例学习sortedset命令的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。