SpringData Redis CrudRepository方式
一、配置 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 类型存储。