SpringBoot系列教程之RedisTemplate ZSet數據結構使用教程

更多Spring文章,歡迎點擊 一灰灰Blog-Spring專題

Redis的五大數據結構,目前就剩下最後的ZSET,能夠簡單的理解爲帶權重的集合;與前面的set最大的區別,就是每一個元素能夠設置一個score,從而能夠實現各類排行榜的功能java

原文地址: 181212-SpringBoot高級篇Redis之ZSet數據結構使用姿式git

I. 基本使用

在開始以前,序列化的指定須要額外處理,前面List這一篇已經說起,相關內容能夠參考:github

1. 新增元素

新增元素時,用起來和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);
}

2. 刪除元素

刪除就和普通的set沒啥區別了數據結構

/**
 * 刪除元素 zrem
 *
 * @param key
 * @param value
 */
public void remove(String key, String value) {
    redisTemplate.opsForZSet().remove(key, value);
}

3. 修改score

zset中的元素塞入以後,能夠修改其score的值,經過 zincrby 來對score進行加/減;當元素不存在時,則會新插入一個spring-boot

從上面的描述來看,zincrbyzadd 最大的區別是前者是增量修改;後者是覆蓋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);
}

4. 獲取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);
}

5. 獲取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);
}

6. 集合大小

/**
 * 返回集合的長度
 *
 * @param key
 * @return
 */
public Long size(String key) {
    return redisTemplate.opsForZSet().zCard(key);
}

7. 獲取集合中數據

由於是有序,因此就能夠獲取指定範圍的數據,下面有兩種方式

  • 根據排序位置獲取數據
  • 根據score區間獲取排序位置
/**
 * 查詢集合中指定順序的值, 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);
}

II. 其餘

0. 項目

1. 一灰灰Blog

一灰灰的我的博客,記錄全部學習和工做中的博文,歡迎你們前去逛逛

2. 聲明

盡信書則不如,以上內容,純屬一家之言,因我的能力有限,不免有疏漏和錯誤之處,如發現bug或者有更好的建議,歡迎批評指正,不吝感激

3. 掃描關注

一灰灰blog

QrCode

知識星球

goals

相關文章
相關標籤/搜索