更多Spring文章,歡迎點擊 一灰灰Blog-Spring專題
Redis的五大數據結構,目前就剩下最後的ZSET,能夠簡單的理解爲帶權重的集合;與前面的set最大的區別,就是每一個元素能夠設置一個score,從而能夠實現各類排行榜的功能java
原文地址: 181212-SpringBoot高級篇Redis之ZSet數據結構使用姿式git
在開始以前,序列化的指定須要額外處理,前面List這一篇已經說起,相關內容能夠參考:github
新增元素時,用起來和set差很少,無非是多一個score的參數指定而已redis
若是元素存在,會用新的score來替換原來的,返回0;若是元素不存在,則會會新增一個spring
/** * 添加一個元素, zset與set最大的區別就是每一個元素都有一個score,所以有個排序的輔助功能; zadd * * @param key * @param value * @param score */ public void add(String key, String value, double score) { redisTemplate.opsForZSet().add(key, value, score); }
刪除就和普通的set沒啥區別了數據結構
/** * 刪除元素 zrem * * @param key * @param value */ public void remove(String key, String value) { redisTemplate.opsForZSet().remove(key, value); }
zset中的元素塞入以後,能夠修改其score的值,經過 zincrby
來對score進行加/減;當元素不存在時,則會新插入一個spring-boot
從上面的描述來看,zincrby
與 zadd
最大的區別是前者是增量修改;後者是覆蓋score方式學習
/** * score的增長or減小 zincrby * * @param key * @param value * @param score */ public Double incrScore(String key, String value, double score) { return redisTemplate.opsForZSet().incrementScore(key, value, score); }
這個須要注意的是,當value在集合中時,返回其score;若是不在,則返回null大數據
/** * 查詢value對應的score zscore * * @param key * @param value * @return */ public Double score(String key, String value) { return redisTemplate.opsForZSet().score(key, value); }
前面是獲取value對應的score;這裏則是獲取排名;這裏score越小排名越高;ui
從這個使用也能夠看出結合四、5, 用zset來作排行榜能夠很簡單的獲取某個用戶在全部人中的排名與積分
/** * 判斷value在zset中的排名 zrank * * @param key * @param value * @return */ public Long rank(String key, String value) { return redisTemplate.opsForZSet().rank(key, value); }
/** * 返回集合的長度 * * @param key * @return */ public Long size(String key) { return redisTemplate.opsForZSet().zCard(key); }
由於是有序,因此就能夠獲取指定範圍的數據,下面有兩種方式
/** * 查詢集合中指定順序的值, 0 -1 表示獲取所有的集合內容 zrange * * 返回有序的集合,score小的在前面 * * @param key * @param start * @param end * @return */ public Set<String> range(String key, int start, int end) { return redisTemplate.opsForZSet().range(key, start, end); } /** * 查詢集合中指定順序的值和score,0, -1 表示獲取所有的集合內容 * * @param key * @param start * @param end * @return */ public Set<ZSetOperations.TypedTuple<String>> rangeWithScore(String key, int start, int end) { return redisTemplate.opsForZSet().rangeWithScores(key, start, end); } /** * 查詢集合中指定順序的值 zrevrange * * 返回有序的集合中,score大的在前面 * * @param key * @param start * @param end * @return */ public Set<String> revRange(String key, int start, int end) { return redisTemplate.opsForZSet().reverseRange(key, start, end); } /** * 根據score的值,來獲取知足條件的集合 zrangebyscore * * @param key * @param min * @param max * @return */ public Set<String> sortRange(String key, int min, int max) { return redisTemplate.opsForZSet().rangeByScore(key, min, max); }
一灰灰的我的博客,記錄全部學習和工做中的博文,歡迎你們前去逛逛
盡信書則不如,以上內容,純屬一家之言,因我的能力有限,不免有疏漏和錯誤之處,如發現bug或者有更好的建議,歡迎批評指正,不吝感激
一灰灰blog
知識星球