redisTemplate does not support zpopmax, the solution is to use reverseRangeWithScore

zpopmax can be used on the redis client
Insert image description here
redisTemplate does not support zpopmax
Insert image description here

solution

Use reverseRangeWithScore
Next we will test
Insert image description here

We want to return the largest value, which should be c

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.Set;

@SpringBootTest
@RunWith(SpringRunner.class)
public class TEST1 {
    
    

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    public void Data(){
    
    
//        redisTemplate.opsForZSet().add("goods","a",10);
//        redisTemplate.opsForZSet().add("goods","b",10);
//        redisTemplate.opsForZSet().add("goods","c",11);
        String goods = zPopMaxFromSet("goods");
        System.out.println(goods);

    }


    public String zPopMaxFromSet(String setName) {
    
    
        ZSetOperations<String, String> zSetOperations = redisTemplate.opsForZSet();
        Set<ZSetOperations.TypedTuple<String>> maxElements = zSetOperations.reverseRangeWithScores(setName, 0, 0);

        if (!maxElements.isEmpty()) {
    
    
            ZSetOperations.TypedTuple<String> maxElement = maxElements.iterator().next();
            //获取值
            String element = maxElement.getValue();
            //获取得分
            Double score = maxElement.getScore();
            zSetOperations.remove(setName, element);
            return element;
        }
        return null; // 集合为空
    }
}

Insert image description here
有人想问了zSetOperations.reverseRangeWithScores(setName, 0, 0); 0,0代表什么
start index position and end position
Insert image description here
Insert image description here
test

    @ApiOperation("测试")
    @GetMapping("/test/{start}/{end}")
    public List<String> testRedis(@PathVariable Integer start, @PathVariable Integer end){
    
    
        ZSetOperations<String, String> zSetOperations = redisTemplate.opsForZSet();
        Set<ZSetOperations.TypedTuple<String>> maxElements = zSetOperations.reverseRangeWithScores("goods", start,end );
        Iterator<ZSetOperations.TypedTuple<String>> iterator = maxElements.iterator();
        ArrayList<String> list = new ArrayList<>();
        while(iterator.hasNext()){
    
    
            list.add(iterator.next().getValue());

        }
        return list; // 集合为空
    }

Insert image description here
Insert image description here
Insert image description here

Remember to serialize

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.io.Serializable;



@Configuration
public class RedisConfig {
    
    
    /**
     * @param lettuceConnectionFactory
     * @return
     *
     * redis序列化的工具配置类,下面这个请一定开启配置
     * 127.0.0.1:6379> keys *
     * 1) "ord:102"  序列化过
     * 2) "\xac\xed\x00\x05t\x00\aord:102"   野生,没有序列化过
     */
    @Bean
    public RedisTemplate redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
    
    
        RedisTemplate redisTemplate = new RedisTemplate();

        redisTemplate.setConnectionFactory(lettuceConnectionFactory);
        //设置key序列化方式string
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        //设置value的序列化方式json
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());

        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());

        redisTemplate.afterPropertiesSet();

        return redisTemplate;
    }
}

Guess you like

Origin blog.csdn.net/qq_46548855/article/details/134289559