一、zset数据结构

zset为有序集合。就是在set的基础上,添加了一个score值。zset的每一个成员都有一个分数与之对应,并且分数可以重复。score就相当于权重,可以根据score值进行排序展示。

项目中使用了SpringBoot整合的redisTemplate

常用方法如下:

Boolean add(K key, V value, double score):新增一个有序集合,存在的话为false,不存在的话为true

Long add(K key, Set<TypedTuple<V>> tuples):新增一个有序集合

Long remove(K key, Object... values):从有序集合中移除一个或者多个元素

Double incrementScore(K key, V value, double delta):增加元素的score值,并返回增加后的值

Set<V> range(K key, long start, long end):通过索引区间返回有序集合成指定区间内的成员,其中有序集成员按分数值递增(从小到大)顺序排列

Set<TypedTuple<V>> rangeWithScores(K key, long start, long end):通过索引区间返回有序集合成指定区间内的成员对象,其中有序集成员按分数值递增(从小到大)顺序排列

Set<V> rangeByScore(K key, double min, double max):通过分数返回有序集合指定区间内的成员,其中有序集成员按分数值递增(从小到大)顺序排列

Set<V> reverseRange(K key, long start, long end):通过索引区间返回有序集合成指定区间内的成员,其中有序集成员按分数值递减(从大到小)顺序排列

Double score(K key, Object o):获取指定成员的score值

二、代码实现

1、添加依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
 </dependency>

2、注入RedisTemplate方法

@Autowired
public RedisTemplate redisTemplate;

3.创建对象,用来接收redis数据

@Data
public class RangeVo implements Serializable {
 
 private String shopName;
 
 private Double shopPrice;
  
}

4.添加十条redis数据

@Test
public void getzset4(){
 
 String keyModel = "testList";
 for (int i = 0; i < 10 ; i++) {
  int score = new Random().nextInt(50);
  String ss = "shop"+i;
  redisTemplate.opsForZSet().add(keyModel,ss,score);
 }
}

5.根据某个key查询并每次查询score都会加1

@Test
 public void setOneValue(){
  String keyModel = "testList";
  String ss = "shop8";
 
  Double aDouble = redisTemplate.opsForZSet().incrementScore(keyModel, ss, 1);
 
  System.out.println(aDouble);
 }

6.查询redis中所有数据,zset会根据score自动排序

@Test
 public void getList(){
 
  String key = "testList";
 
  List<RangeVo> list = new ArrayList<>();
  /** 从小到大排序 返回value 和 score* 参数注释 key 为有序集合的key,1,50 是分数范围 1-50,0 是偏移量即从哪条数据开始排序, 5是取5条满足条件的数据*/
  Set<ZSetOperations.TypedTuple<Object>> set = redisTemplate.opsForZSet().rangeByScoreWithScores(key,1,50,0,5);
  Iterator<ZSetOperations.TypedTuple<Object>> iterator = set.iterator();
  while (iterator.hasNext()){
   ZSetOperations.TypedTuple<Object> next = iterator.next();
   RangeVo rangeVo = new RangeVo();
   rangeVo.setShopName((String) next.getValue());
   rangeVo.setShopPrice(next.getScore());
   list.add(rangeVo);
  }
 
  System.out.println(list);
 }

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐