在 Spring 中操作 Redis

🧸欢迎来到dream_ready的博客,📜相信您对博主首页也很感兴趣o (ˉ▽ˉ;)

📜redis和缓存及相关问题和解决办法 什么是缓存预热、缓存穿透、缓存雪崩、缓存击穿

目录

1、引入依赖

[2、对 Redis 的配置文件进行书写](#2、对 Redis 的配置文件进行书写)

[3、Spring中使用 StringRedisTemplate 这个类操作数据库](#3、Spring中使用 StringRedisTemplate 这个类操作数据库)

[4、对set 和 get 相关命令举例](#4、对set 和 get 相关命令举例)

[5、Spring 中没有封装的命令](#5、Spring 中没有封装的命令)

[6、对 List 相关命令举例](#6、对 List 相关命令举例)

[7、对 Set 相关命令举例](#7、对 Set 相关命令举例)

[8、对 Hash 相关命令操作](#8、对 Hash 相关命令操作)

[9、对 ZSet 进行操作](#9、对 ZSet 进行操作)

10、注:学习此篇博客方法


1、引入依赖

创建 Spring 项目时,一定要引入这个依赖

这是操作 redis 的依赖

2、对 Redis 的配置文件进行书写

这里以演示本地连接为例,若想本地操作远程服务器的redis,则要进行更为麻烦的配置,此处就不再展示了,毕竟本文主题是教大家spring如何操作redis

注:若redis配置的有密码,或者想要使用某个固定的数据源,也可以增加下面两个配置

当然,还可以增加其他的连接配置,大家可以自行搜索,这里讲的这几个绝对够大家基础使用了!!!

3、Spring中使用 StringRedisTemplate 这个类操作数据库

需要注意的是,操作redis的方法很多,除了 StringRedisTemplate 外,还有 Jedis 等等都可以操作redis,此处主要讲解以 StringRedisTemplate 的方式操作redis,读者若想了解其他操作redis的方式,也可以查询相关资料自行学习

首先,使用 @Autowired 注解将这个类注入该类

  • 使用Jedis,是通过 Jedis 对象里的各种方法来操作 redis 的
  • 此处 Spring 中是通过 StringRedisTemplate 来操作redis的
  • 最原始提供的类是 RedisTemplate
  • StringRedisTemplate 是 RedisTemplate 的子类,专门用来处理 文本数据的
  • 这个类提供的方法,相比于之前的 Jedis 中的各种方法,还是存在较大的差异的!!!

可以看到,此处就与 Jedis 不同了,又多了一层,主要是选择对应数据类型的类,然后再选操作方法

此处以 对value操作的相关方法举例:

可以看到,有get、set等多种不同方法的操作方法以满足我们的需求

4、对set 和 get 相关命令举例

java 复制代码
    @GetMapping("/testString")
    @ResponseBody
    public String testString() {
        // 先清除之前的数据
        redisTemplate.execute((RedisConnection connection) -> {
            // execute 要求回调方法中必须写 return 语句,返回个东西
            // 这个回调返回的对象,就会作为 execute 本身的返回值
            connection.flushAll();
            return null;
        });
        redisTemplate.opsForValue().set("key", "111");
        redisTemplate.opsForValue().set("key2", "222");
        redisTemplate.opsForValue().set("key3", "333");

        String value = redisTemplate.opsForValue().get("key");
        System.out.println("value: " + value);

        return "OK";
    }

5、Spring 中没有封装的命令

有些命令 Spring 没有封装,这时咱就要用 Redis 原生的命令进行操作了,通过 excute 方法就可以使用 Redis 原生的命令了

这里的 RedisConnection 就代表了 Redis 连接,对标 Jedis 对象

以 flushall 举例:

6、对 List 相关命令举例

java 复制代码
    @GetMapping("/testList")
    @ResponseBody
    public String testList() {
        // 先清除之前的数据
        redisTemplate.execute((RedisConnection connection) -> {
            // execute 要求回调方法中必须写 return 语句,返回个东西
            // 这个回调返回的对象,就会作为 execute 本身的返回值
            connection.flushAll();
            return null;
        });

        redisTemplate.opsForList().leftPush("key", "111");
        redisTemplate.opsForList().leftPush("key", "222");
        redisTemplate.opsForList().leftPush("key", "333");

        String value = redisTemplate.opsForList().rightPop("key");
        System.out.println("value:" + value);
        value = redisTemplate.opsForList().rightPop("key");
        System.out.println("value:" + value);
        value = redisTemplate.opsForList().rightPop("key");
        System.out.println("value:" + value);

        return "OKList";
    }

7、对 Set 相关命令举例

java 复制代码
    @GetMapping("/testSet")
    @ResponseBody
    public String testSet() {
        // 先清除之前的数据
        redisTemplate.execute((RedisConnection connection) -> {
            // execute 要求回调方法中必须写 return 语句,返回个东西
            // 这个回调返回的对象,就会作为 execute 本身的返回值
            connection.flushAll();
            return null;
        });

        redisTemplate.opsForSet().add("key", "111", "222", "333");
        Set<String> result = redisTemplate.opsForSet().members("key");
        System.out.println("result:" + result);

        Boolean exists = redisTemplate.opsForSet().isMember("key", "111");
        System.out.println("exists:" + exists);

        Long count = redisTemplate.opsForSet().size("key");
        System.out.println("count:" + count);

        redisTemplate.opsForSet().remove("key", "111", "222");
        result = redisTemplate.opsForSet().members("key");
        System.out.println("result:" + result);

        return "OKSet";
    }

8、对 Hash 相关命令操作

java 复制代码
    @GetMapping("/testHash")
    @ResponseBody
    public String testHash() {
        // 先清除之前的数据
        redisTemplate.execute((RedisConnection connection) -> {
            // execute 要求回调方法中必须写 return 语句,返回个东西
            // 这个回调返回的对象,就会作为 execute 本身的返回值
            connection.flushAll();
            return null;
        });

        redisTemplate.opsForHash().put("key", "f1", "111");
        redisTemplate.opsForHash().put("key", "f2", "222");
        redisTemplate.opsForHash().put("key", "f3", "333");

        String value = (String) redisTemplate.opsForHash().get("key", "f1");
        System.out.println("value:" + value);

        Boolean exists = redisTemplate.opsForHash().hasKey("key", "f1");
        System.out.println("exist:" + exists);

        redisTemplate.opsForHash().delete("key", "f1", "f2");

        Long size = redisTemplate.opsForHash().size("key");
        System.out.println("size:" + size);

        return "OKHash";
    }

9、对 ZSet 进行操作

java 复制代码
    @GetMapping("/testZSet")
    @ResponseBody
    public String testZSet() {
        redisTemplate.execute((RedisConnection connection) -> {
            connection.flushAll();
            return null;
        });

        redisTemplate.opsForZSet().add("key", "zhangsan", 10);
        redisTemplate.opsForZSet().add("key", "lisi", 20);
        redisTemplate.opsForZSet().add("key", "wangwu", 30);

        Set<String> members = redisTemplate.opsForZSet().range("key", 0, -1);
        System.out.println("members:" + members);

        Set<ZSetOperations.TypedTuple<String>> membersWithScore = redisTemplate.opsForZSet().rangeWithScores("key", 0 ,-1);
        System.out.println("membersWithScore:" + membersWithScore);

        Double score = redisTemplate.opsForZSet().score("key", "zhangsan");
        System.out.println("score:" + score);

        redisTemplate.opsForZSet().remove("key", "zhangsan");

        Long size = redisTemplate.opsForZSet().size("key");
        System.out.println("size:" + size);

        Long rank = redisTemplate.opsForZSet().rank("key", "lisi");
        System.out.println("rank:" + rank);

        return "OKZSet";
    }

10、注:学习此篇博客方法

此篇博客上的代码为对某种数据类型整体操作的方法,是一连串的,并没有再拆开来细讲每一行代码的作用

大家可以使用gpt将每段我的代码发过去,让gpt生成更加详细的注释,这样学习事半功倍!!!

🧸前路漫漫,愿星光与您相伴!

相关推荐
编程、小哥哥7 分钟前
设计模式之抽象工厂模式(替换Redis双集群升级,代理类抽象场景)
redis·设计模式·抽象工厂模式
2401_8574396910 分钟前
SpringBoot框架在资产管理中的应用
java·spring boot·后端
怀旧66611 分钟前
spring boot 项目配置https服务
java·spring boot·后端·学习·个人开发·1024程序员节
李老头探索13 分钟前
Java面试之Java中实现多线程有几种方法
java·开发语言·面试
芒果披萨19 分钟前
Filter和Listener
java·filter
qq_49244844623 分钟前
Java实现App自动化(Appium Demo)
java
阿华的代码王国32 分钟前
【SpringMVC】——Cookie和Session机制
java·后端·spring·cookie·session·会话
德育处主任Pro1 小时前
『Django』APIView基于类的用法
后端·python·django
找了一圈尾巴1 小时前
前后端交互通用排序策略
java·交互
哎呦没3 小时前
SpringBoot框架下的资产管理自动化
java·spring boot·后端