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 作為條件查詢,則必須要加注解 @Indexedprivate 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 {@Autowiredprivate UserDao userDao;@Testvoid save() {User user = new User();user.setAge(35);user.setName("Jack");user.setUserId("3");//保存和修改 支持。 主鍵存在則修改,不存在則保存userDao.save(user);}@Testvoid get(){Optional<User> byId = userDao.findById("1");if(byId.isPresent()){System.out.println(byId.get());}else{System.out.println("沒有值");}}@Testvoid findByname(){//測試自定義方法 (如果不支持,注意實體類中是否加@Indexed ,且在數據入庫前是否已經加此注解) List<User> list = userDao.findUserByName("Jack");System.out.println(list);}@Testvoid del(){//支持刪除userDao.deleteById("2");}}
執行保存之后,通過idea 的 redis 瀏覽器客戶端,查看結果
可以看到,保存時,把實體對象 標注 @Id 的屬性(主鍵)存入set 集合,保證主鍵唯一的特點。再把對象的屬性和數據,轉為 hash 類型存儲。