SpringData Redis
Spring Data Redis 是 Spring Data 項目的一部分,它為 Java 應用程序提供了一種便捷的方式來與 Redis 數據庫進行交互。
Spring Data Redis 提供了對 Redis 的抽象封裝,使得開發者能夠以面向對象的方式操作 Redis,并簡化了 Redis 在 Spring 管理的應用中的集成工作。
其主要特性包括:
- 自動配置:在使用 Spring Boot 時,通過引入?
spring-boot-starter-data-redis
?啟動器,可以快速實現自動配置和連接到 Redis 服務器。 - 模板類:提供了?
RedisTemplate
?類,這是一個通用的 Redis 操作類,用于執行 Redis 命令以及轉換鍵值對的序列化和反序列化過程。 - Repository 支持:類似于 Spring Data JPA,Spring Data Redis 也支持自定義 Repository 接口,通過繼承?
CrudRepository
、PagingAndSortingRepository
?或自定義方法來簡化 CRUD 操作。 - 數據綁定:可以通過注解或元數據映射將 Java 對象與 Redis 中的數據結構(例如 Hash)關聯起來,簡化復雜類型的操作。
- 事務管理:支持 Redis 事務處理,可以通過編程式或者聲明式事務管理來保證數據的一致性。
- 發布訂閱(Pub/Sub):提供了對 Redis 發布/訂閱功能的支持,方便構建消息驅動的系統。
- 緩存支持:結合 Spring Cache Abstraction,可以利用 Redis 作為分布式緩存解決方案
Spring Data Redis 提供的兩個核心API:RedisTemplate 模板類 和 CrudRepository 持久化接口
下面先來介紹 Spring Data Redis 中的 RedisTemplate 的具體用法
一、配置pom.xml
首先創建springboot項目
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</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>
二、配置 application
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=123456
spring.redis.database=1 # 0~15 默認0
三、DAO RedisTemplate依賴
@Autowired
private RedisTemplate redisTemplate;
public void set(Student student){//保存基本信息 String 注意:不能使用相同的 name 去redis客戶端取值的。redisTemplate.opsForValue().set("name",student.getName());}public void get(String key){String name = redisTemplate.opsForValue().get("name").toString();System.out.println(name);}
四、測試
@SpringBootTest
class DemoApplicationTests {@Autowiredprivate StudentDao studentDao;@Testvoid set() {Student student = new Student();student.setName("AAAAAAAAAAABBBBBBBBBBB");studentDao.set(student);}@Testvoid get(){studentDao.get(null);}
}
就此,來測試是否連通 redis 。保存和取值 String 進行測試。
五、保存一個對象
1. 實體類,實現序列化接口
@Data
public class Student implements Serializable {private String name;private int age;
}
2.編寫DAO
public void set(Student student){redisTemplate.opsForValue().set("student",student); //存儲對象}
public Student get(String key){return (Student) redisTemplate.opsForValue().get(key);}
六、list 類型操作
public void pushlist(){//獲取操作list類型的 工具類ListOperations<String,String> listOperations = redisTemplate.opsForList();listOperations.leftPush("words","Sky");listOperations.leftPush("words","Desk");listOperations.leftPush("words","Person"); //添加隊頭listOperations.rightPush("words","Apple"); //追加隊尾
}
public void rangeList(){ListOperations<String,String> listOperations = redisTemplate.opsForList();List<String> list = listOperations.range("words", 0, Integer.MAX_VALUE);System.out.println(list);
}
七、set 類型
public void setadd(){SetOperations setOperations = redisTemplate.opsForSet();setOperations.add("myset","A","B","C");setOperations.add("myset","X","Y","C");}
public void setmembers(){SetOperations setOperations = redisTemplate.opsForSet();Set myset = setOperations.members("myset");System.out.println(myset);
}
八、zset 類型
public void zsetadd(){ZSetOperations zSetOperations = redisTemplate.opsForZSet();//第三個為score 排序依據分數 權重zSetOperations.add("zset","CCC",5);zSetOperations.add("zset","DDD",3);zSetOperations.add("zset","AAA",1);zSetOperations.add("zset","EEE",2);zSetOperations.add("zset","BBB",4);
}
public void zsetget(){ZSetOperations zSetOperations = redisTemplate.opsForZSet();Set zset = zSetOperations.range("zset", 0, 100);System.out.println(zset);
}
九、hash 類型
public void hashadd(){HashOperations hashOperations = redisTemplate.opsForHash();hashOperations.put("person","sid","1001");hashOperations.put("person","age","23");Map<String,String> map = new HashMap<>();map.put("name","諸葛亮");map.put("email","zhuge@sina.com");hashOperations.putAll("person",map);
}public void hashget(){HashOperations<String,String,String> hashOperations = redisTemplate.opsForHash();Map<String,String> map = hashOperations.entries("person");System.out.println(map);
}
十、序列化亂碼問題
使用 RedisTemplate 存取redis的數據時,因為序列化原因,存入的數據看上去亂碼,不是原本設置的key。 但是不影響應用程序的存取。但是直接操作redis 查看還是不太方便。下面來解決這個問題
1. 添加 jackson 依賴
因為下面的配置類需要依賴json
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.11.0</version>
</dependency>
2. 編寫配置類
package com.example.demo;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration
public class Config {@Autowiredprivate RedisTemplate redisTemplate;@Beanpublic RedisTemplate redisTemplateInit() {//設置序列化Key的實例化對象redisTemplate.setKeySerializer(new StringRedisSerializer());//設置序列化Value的實例化對象redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());return redisTemplate;}
}
再次運行保存
public void set(Student student){
// redisTemplate.opsForValue().set("name",student.getName());redisTemplate.opsForValue().set("student",student); //存儲對象}
在redis 中就可以看到和使用 student 作為 key 來查看數據了。