SpringBoot整合Redis

66 阅读4分钟

Redis介绍

Redis是将数据存储在内存中,Redis的速度非常快,也支持开发人员的大多数数据集,Redis提供了多种功能特性,可用作非关系型数据库、缓存中间件、消息中间件等。

整合Redis的步骤

  • 1.在pom文件中添加Spring Data Redis依赖启动器

  • 2.编写实体类

  • 3.编写Repository接口

  • 4.在全局配置文件application.properties中添加Redis数据库连接配置

  • 5.编写单元测试进行接口方法测试以及整合测试

第一步,在pom.xml文件中添加SpringDataRedis 依赖启动器

image.png

第二步,安装Redis。

windows下安装和配置Redis - 简书

Redis Desktop Manager(Redis可视化工具)安装及使用详细教程_redisdesktopmanager-CSDN博客

服务启动不成功,显示端口号被占用了

redis下的端口号如何改变 • Worktile社区

在redius中配置用户名和密码

image.png

我去,环境变量刚才没配置好,一直进不去

图形化界面连接数据库

image.png

image.png

可以看到我们已经连接成功了。

第二步,配置文件中连接

image.png

字符串

image.png 错误原因:

一个@Autowired只能标记一个对象

完整代码:

@Test
    void testString(){
        ValueOperations<String,String> ops = redisTemplate.opsForValue();
//      这行代码的作用是获取 RedisTemplate 对象的 ValueOperations 操作对象,用于执行与 Redis 中 "String" 类型相关的操作。
        ops.set("name","小林");
        System.out.println(ops.get("name"));
        //大概存储为一个字段一个value的形式
        ops.set("age","18",30, TimeUnit.SECONDS);
        //8秒过期
        System.out.println(ops.get("age"));
    }

效果:

image.png

对象

1.在实体类中加入@Data注解之后依旧要写构造方法,不然依旧会显示空

2.在实体类中要接入接口确保它可以被 JDK 的默认序列化机制正确处理

image.png

全部代码

package com.xyu.po;
import lombok.Data;
import java.io.Serializable;  // 引入 Serializable 接口
@Data
public class User implements Serializable {   // 实现 Serializable 接口
    private String name;
    private int age;
    // 构造函数
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

@Test
void class_1(){
    ValueOperations<String, Object> ops = redisTemplate.opsForValue();
    // 创建 User 对象
    User user = new User("小六", 20);
    // 存储到 Redis
    ops.set("user_key", user);
    // 从 Redis 获取数据
    User retrievedUser = (User) ops.get("user_key");
    // 打印输出
    System.out.println("从 Redis 获取的 User: " + retrievedUser);
}

效果:

image.png

Hash 是一种非常常用的数据结构,允许存储多个字段和对应的值

全部代码

    @Test
    void Hash_1(){
        HashOperations hash =redisTemplate.opsForHash();
        hash.put("user:1000", "name", "John Doe");
        hash.put("user:1000", "age", 30);
        hash.put("user:1000", "email", "john@example.com");
//      key: 这是 Redis 哈希表的键(也叫做哈希的名称)。它是你存储哈希表的标识符,可以理解为类似于数据库表的名字。例如,"user:1000" 表示用户 ID 为 1000 的哈希表。
//      field: 这是哈希表中的字段名称。哈希表是由多个字段组成的,每个字段都对应一个值。可以理解为哈希表中的 "列"。例如,"name""age""email"。
//      alue: 这是哈希表字段的值。它是你想要存储在该字段中的数据。例如,"John Doe"30"john@example.com"。
        System.out.println(hash.get("user:1000", "name"));
    }
}

效果

image.png

list数据

全部代码

    @Test
    void list(){
        ListOperations listOperations =redisTemplate.opsForList();
        listOperations.leftPush("myList", "a");  // 列表变为: ["a"]
        listOperations.leftPush("myList", "b");  // 列表变为: ["b", "a"]
        listOperations.leftPush("myList", "c");  // 列表变为: ["c", "b", "a"]
        System.out.println(listOperations.range("myList",0,-1));
        listOperations.leftPop("myList");
        System.out.println(listOperations.size("myList"));
    }
}

效果:

image.png

Set数据(不可以重复)

全部代码

@Test
void testSet() {
    // 获取 Set 操作对象
    SetOperations<String, String> ops = redisTemplate.opsForSet();
    // 1. SADD 操作:添加元素到 Set
    ops.add("user_set1", "小林", "小林2", "小林3");
    ops.add("user_set2", "小林2", "小林3", "小林4");
    // 2. SMEMBERS 操作:获取 Set 中的所有元素
    System.out.println("user_set1 = " + ops.members("user_set1"));
    System.out.println("user_set2 = " + ops.members("user_set2"));
    // 3. SCARD 操作:获取 Set 的大小
    System.out.println("size of user_set1 = " + ops.size("user_set1"));
    System.out.println("size of user_set2 = " + ops.size("user_set2"));
    // 4. SINTER 操作:计算两个 Set 的交集
    System.out.println("交集 = " + ops.intersect("user_set1", "user_set2"));
    // 5. SUNION 操作:计算两个 Set 的并集
    System.out.println("并集 = " + ops.union("user_set1", "user_set2"));
    // 6. SREM 操作:从 Set 中移除元素
    ops.remove("user_set1", "小林2");
    System.out.println("user_set1 after removal = " + ops.members("user_set1"));
}

效果:

image.png

ZSet(有序集合)是一个非常重要的数据结构,它是一个集合类型,每个元素都会关联一个分数(score),并且 Redis 会根据分数对集合中的元素进行自动排序。

代码

@Test
void testZSetOperations() {
    // 获取 ZSet 操作对象
    ZSetOperations<String, String> ops = redisTemplate.opsForZSet();
    // 1. 添加元素到 ZSet(ZADD)
    ops.add("user_scores", "小林", 90);
    ops.add("user_scores", "小江", 80);
    ops.add("user_scores", "小李", 70);
    ops.add("user_scores", "小秋", 75);
    // 2. 获取分数升序排列的元素(ZRANGE)
    System.out.println("分数升序:" + ops.range("user_scores", 0, -1));
    // 3. 获取分数降序排列的元素(ZREVRANGE)
    System.out.println("分数降序:" + ops.reverseRange("user_scores", 0, -1));
    // 4. 修改分数(ZINCRBY)
    ops.incrementScore("user_scores", "小江", 10); // 小江增加 10 分
    // 5. 获取修改后的 ZSet(ZRANGE)
    System.out.println("修改后分数升序:" + ops.rangeWithScores("user_scores", 0, -1));
}

效果 image.png

keys

image.png

image.png