redis系列:通过文章点赞排名案例学习sortedset命令
前言
這一篇文章將講述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ù)升序還是降序排序。功能效果如下
命令介紹
| ZADD | ZADD key [NX\ | XX][CH] [INCR] score member [score member ...] | 將所有指定成員添加到鍵為key有序集合(sorted set)里面 |
| ZRANGE | ZRANGE key start stop [WITHSCORES] | 返回有序集key中,指定區(qū)間內(nèi)的成員。其中成員的位置按score值遞減(從小到大)來(lái)排列。 | |
| ZREVRANGE | ZREVRANGE 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í)表示踩。功能效果如下
命令介紹
| ZINCRBY | ZINCRBY 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è)面效果圖如下
命令介紹
| ZRANK | ZRANK key member | 返回有序集key中成員member的排名。其中有序集成員按score值遞增(從小到大)順序排列。排名以0為底,也就是說(shuō),score值最小的成員排名為0。 |
| ZREVRANK | ZREVRANK key member | 返回有序集key中成員member的排名,其中有序集成員按score值從大到小排列。 |
其他命令
獲取屬性
| ZCARD | ZCARD key | 返回key的有序集元素個(gè)數(shù)。 |
| ZCOUNT | ZCOUNT key min max | 返回有序集key中,score值在min和max之間(默認(rèn)包括score值等于min或max)的成員個(gè)數(shù)。 |
| ZLEXCOUNT | ZLEXCOUNT key min max | 用于計(jì)算有序集合中指定成員之間的成員數(shù)量。 |
| ZSCORE | ZSCORE 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")); }獲取成員
| ZRANGEBYLEX | ZRANGEBYLEX key min max [LIMIT offset count] | 返回指定成員區(qū)間內(nèi)的成員,按成員字典正序排序。 |
| ZRANGEBYSCORE | ZRANGEBYSCORE key min max [WITHSCORES]`[LIMIT offset count]` | 返回所有符合score條件的成員 |
| ZREVRANGEBYLEX | ZREVRANGEBYLEX key max min [LIMIT offset count] | 返回指定成員區(qū)間內(nèi)的成員,按成員字典倒序排序。 |
| ZREVRANGEBYSCORE | ZREVRANGEBYSCORE key max min [WITHSCORES]`[LIMIT offset count]` | 返回有序集合中指定分?jǐn)?shù)區(qū)間內(nèi)的成員,分?jǐn)?shù)由高到低排序。 |
| ZSCAN | ZSCAN 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)命令
| ZREM | ZREM key member [member ...] | 刪除有序集合中的成員 |
| ZREMRANGEBYLEX | ZREMRANGEBYLEX key min max | 刪除名稱(chēng)按字典由低到高排序成員之間所有成員 |
| ZREMRANGEBYRANK | ZREMRANGEBYRANK key start stop | 移除有序集key中,指定排名(rank)區(qū)間內(nèi)的所有成員。 |
| ZREMRANGEBYSCORE | ZREMRANGEBYSCORE 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)); }交并集
| ZINTERSTORE | ZINTERSTORE destination numkeys key [key ...]`[WEIGHTS weight] [SUM\ | MIN\ | MAX]` | 計(jì)算給定的numkeys個(gè)有序集合的交集,并且把結(jié)果放到destination中 |
| ZUNIONSTORE | ZUNIONSTORE 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í)行的命令如下
執(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)題。
- 上一篇: WPF 4 开发Windows 7 跳转
- 下一篇: css之object-fit