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