Redis之十:Spring Data Redis --- CrudRepository方式

SpringData Redis CrudRepository方式

Spring Data Redis 的 CrudRepository 是 Spring Data 框架中用于提供基础 CRUD(创建、读取、更新和删除)操作的一个接口。在与 Redis 集成时,尽管 Redis 是一个键值存储系统,并没有像关系型数据库那样直接支持复杂的 SQL 查询语句,但 Spring Data Redis 通过自定义的 Repository 接口提供了对 Redis 数据进行 CRUD 操作的能力。

CrudRepository 是一系列通用数据访问操作的基接口,它包含了一些如 save(T entity)deleteById(ID id)findAll() 等方法。当应用于 Redis 上时,这些方法会映射到相应的 Redis 命令或数据结构操作上。

一、配置 POM 依赖

两种方式:使用连接池 和 不使用连接池

要使用连接池,多一个依赖,下面配置:

复制代码
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <!-- 如果使用连接池 -->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-pool2</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

二、 配置文件 连接池

复制代码
# Redis数据库索引,默认为0
spring.redis.database=0
# Redis端口
spring.redis.port=6379
# Redis服务器主机
spring.redis.host=localhost
# 密码
spring.redis.password=123456

# 如果要用下面的连接池 则需要添加依赖commons-pool2
# 连接池最大连接数
spring.redis.lettuce.pool.max-active=8
# 连接池最大空闲
spring.redis.lettuce.pool.max-idle=8
# 连接池最小空闲
spring.redis.lettuce.pool.min-idle=2
# 连接池最大阻塞等待时间
spring.redis.lettuce.pool.max-wait=1ms
# 超时时间
spring.redis.lettuce.shutdown-timeout=100ms

三、 编写实体类

注意:使用 redis 注解 @RedisHash

复制代码
@Data
@RedisHash("User")               //----------注意 支持redis注解
public class User {
    @Id                           //-----------注意主键-----
    private String userId;
    @Indexed                    //-----------注意:如果要按 name 作为条件查询,则必须要加注解 @Indexed
    private String name;
    private Integer age;
    private Date createTime = new Date();
}

如果我们需要在下面的 DAO 中按属性查询 (ByName) , 则在保存对象前,必须已经添加了 @Indexed 注解,否则查询时查询不到。

注意:保存入库前!!!

三、编写 Dao 接口

自定义接口只需要继承 CrudRepository,默认接口中已经自带 CRUD 方法,如果需要其他方法,按约定自定义方法。

复制代码
public interface UserDao extends CrudRepository<User,String> {
    //按约定规则 自定义 按名字属性查询
    public List<User> findUserByName(String sname);
    Student findBySid(Integer sid);
    // 可以查全部
    List<Student> queryAllBy();
}

四、测试

复制代码
package com.example.demo;

import com.example.demo.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.lang.reflect.Array;
import java.util.List;
import java.util.Optional;

@SpringBootTest
class DemoApplicationTests {
    @Autowired
    private UserDao userDao;
    @Test
    void save() {
        User user = new User();
        user.setAge(35);
        user.setName("Jack");
        user.setUserId("3");
        //保存和修改  支持。 主键存在则修改,不存在则保存
        userDao.save(user);
    }

    @Test
    void get(){
        Optional<User> byId = userDao.findById("1");
        if(byId.isPresent()){
            System.out.println(byId.get());
        }else{
            System.out.println("没有值");
        }
    }

    @Test
    void findByname(){
        //测试自定义方法   (如果不支持,注意实体类中是否加@Indexed ,且在数据入库前是否已经加此注解) 
        List<User> list = userDao.findUserByName("Jack");
        System.out.println(list);
    }

    @Test
    void del(){
        //支持删除
        userDao.deleteById("2");
    }

}

执行保存之后,通过idea 的 redis 浏览器客户端,查看结果

可以看到,保存时,把实体对象 标注 @Id 的属性(主键)存入set 集合,保证主键唯一的特点。再把对象的属性和数据,转为 hash 类型存储。

相关推荐
码农阿豪5 小时前
行标识符的抉择:深入理解数据库领域的OID与ROWID机制
数据库·oracle
不剪发的Tony老师6 小时前
MyCLI:一个增强型MySQL命令行客户端
数据库·mysql
Mr_Xuhhh6 小时前
Java泛型进阶:从基础到高级特性完全指南
开发语言·windows·python
SHANGHAILINGEN6 小时前
2400 万个未培养病毒重新定义病毒多样性
数据库·测序·组学
刘晨鑫16 小时前
PostgreSQL日常维护
数据库·postgresql
xiaokangzhe6 小时前
PG数据库日常应用
数据库·oracle
一个有温度的技术博主6 小时前
Redis主从同步原理:从全量同步到增量同步的完整解析
redis·分布式·缓存
XDHCOM6 小时前
MySQL ER_DD_VERSION_INSTALLED报错解析,数据字典版本问题,故障修复与远程处理指南
数据库·mysql
老天文学家了6 小时前
蓝桥杯备战Python
开发语言·python
ID_180079054737 小时前
除了 Python,还有哪些语言可以解析 JSON 数据?
开发语言·python·json