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 类型存储。

相关推荐
小oo呆9 小时前
【学习心得】Python多线程
python
happylifetree13 小时前
Python70:核心语法-函数进阶-案例2
python
王中阳Go13 小时前
两个入口答案不一致先别调模型:6 行入口口径对账表(附脚本)
人工智能·后端·python·大语言模型·1024程序员节
BK贝壳14 小时前
bool-hybrid-array 落盘我只认 .bha:用 Create_BHA / Ask_BHA 做布尔数组序列化
数据结构·python·numpy·1024程序员节
Sakura_j_h_14 小时前
Python 在定时任务里输出 emoji,UnicodeEncodeError 从哪来
开发语言·字符编码·windows·python·定时任务
Lucis__15 小时前
Redis持久化机制解析
redis·缓存·操作系统·文件·非关系型数据库·1024程序员节
不脱发的程序猿15 小时前
纳指ETF量化策略
数据库·人工智能·1024程序员节
supabc12315 小时前
欧盟电子发票(XRechnung/Peppol/ZUGFeRD)踩坑记:用 Python 不装 Java 跑官方校验规则
xml·python·开源·电子发票·1024程序员节
ZhengEnCi16 小时前
AI Agent工具调用防护层怎么写-一份能直接跑的Python四层拦截实现
python·llm·agent
李纲明16 小时前
WordPress 后台登录马上被踢回登录页:Cookie 域、HTTPS、盐值和页面缓存怎么查
运维·缓存·https·php·wordpress·cookie