关于#Redis#的问题,如何解决?

将下列代码缺失部分补全:
基于RedisTemplate实现保存数据并设置过期时间:

    @Test
    void stringTest(){
        ValueOperations operations = redisTemplate.opsForValue();
        //保存数据
        operations.[                            ]
("zy:20:id:1:name","jack");
        //获取数据
        Object o = operations.[                          ]
("zy:20:id:1:name");
       //设置过期时间
        redisTemplate.[                            ]
("zy:20:id:1:name",30, TimeUnit.SECONDS);

    }

//这三个空怎么填

保存数据:用ValueOperations对象的set方法来保存数据。


operations.set("zy:20:id:1:name","jack");

获取数据:用ValueOperations对象的get方法来获取数据。参数是要获取的键

operations.set("zy:20:id:1:name","jack");

设置过期时间:用redisTemplate的expire方法设置键的过期时间。

redisTemplate.expire("zy:20:id:1:name", 30, TimeUnit.SECONDS);

建议学会查看源码,找对应的方法
下面给出参考:

    @Test
    void stringTest(){
        ValueOperations operations = redisTemplate.opsForValue();
        //保存数据
        operations.set("zy:20:id:1:name","jack");
        //获取数据
        Object o = operations.get("zy:20:id:1:name");
        //设置过期时间
        redisTemplate.expire("zy:20:id:1:name",30, TimeUnit.SECONDS);
    }

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/940547
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:使用RedisTemplate保存数据,Redis中出现乱码的问题
  • 除此之外, 这篇博客: redis分布式锁的原理及代码实现中的 基于RedisTemplate的redis分布式锁实现 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • @Slf4j
    @Component
    public class RedisLock {
        @Resource
        private RedisTemplate<String, Object> redisTemplate;
        private final String value = UUID.randomUUID().toString();
    
        public boolean rLock(String key, Long time) {
            boolean locked = false;
            //重试次数
            int tryCount = 3;
            //分布式锁,失败重试
            while (!locked && tryCount > 0) {
                locked = redisTemplate
                    .opsForValue()
                    .setIfAbsent(key, this.value, time, TimeUnit.MINUTES);
                tryCount--;
                if (!locked) {
                    log.info("抢夺锁失败,等待重试!");
                }
                try {
                    Thread.sleep(300);
                } catch (InterruptedException e) {
                    log.error("线程被中断" + Thread.currentThread().getId(), e);
                }
            }
            return locked;
        }
    
    
        public Boolean unLock(String key) {
            String script = "if redis.call(\"get\",KEYS[1]) == ARGV[1] then\n" +
                    "    return redis.call(\"del\",KEYS[1])\n" +
                    "else\n" +
                    "    return 0\n" +
                    "end";
            RedisScript<Boolean> redisScript = RedisScript.of(script, Boolean.class);
            List<String> keys = Collections.singletonList(key);
    
            Boolean result = redisTemplate.execute(redisScript, keys, value);
            log.info("释放锁成功!" + result);
            return result;
        }
    }
    

    使用

    @GetMapping("/lock")
        public String lock() throws InterruptedException {
            boolean lock = redisLock.rLock("order-xxx", 10L);
            if (lock){
                log.info("抢夺锁成功!执行任务!");
                Thread.sleep(5000L);
                boolean unLock = redisLock.unLock("order-xxx");
                if (unLock){
                    log.info("释放锁成功!");
                }
            }else {
                log.info("抢夺锁失败!");
            }
            return "分布式锁执行!";
        }
    
  • 您还可以看一下 朱学超老师的Redis高并发秒杀和分布式锁技术应用及实战解析课程中的 课程导读(学前必看)小节, 巩固相关知识点