1.先配置pom文件
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.5.4</version> </dependency>
2.开一个配置类
package com.jt.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.RedisSerializer; import java.io.Serializable; @Configuration public class RedisConfiguration { @Bean public RedisTemplate<String, Serializable> redisTemplate( RedisConnectionFactory redisConnectionFactory) { RedisTemplate<String, Serializable> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory); redisTemplate.setKeySerializer(RedisSerializer.string()); redisTemplate.setValueSerializer(RedisSerializer.json()); redisTemplate.setHashKeySerializer(RedisSerializer.string()); redisTemplate.setHashValueSerializer(RedisSerializer.json()); return redisTemplate; } }
3.接下来,可以在测试包下创建`RedisTemplateTests`类,进行简单的测试:
```java package cn.tedu.csmall.product.webapi; import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import java.io.Serializable;
@SpringBootTest
public class RedisTemplateTests {
@Autowired
RedisTemplate<String, Serializable> redisTemplate;
@Test public void testSetValue() {
// 对于普通的字符串值,调用opsForValue() // 再调用set()方法实现存入数据 // 此方法的特点与Map中的put()类似,既是新增数据的方法,也是修改数据的方法 String key = "category";
Serializable value = "Phone"; ValueOperations<String, Serializable> opsForValue = redisTemplate.opsForValue(); opsForValue.set(key, value); } }
存入值后,可以通过同样的“值操作器”取出值,例如: ```java @Test public void testGetValue() { // 因为值是字符串值,需要先调用opsForValue() // 再调用get()方法根据key获取值 String key = "category"; Serializable value = redisTemplate.opsForValue().get(key); System.out.println(value); } ``` 由于值的操作配置序列化器是JSON的序列化器,所以,通过以上方式,还可以将整个对象直接写入到Redis中并读取出来,因为序列化器会将对象转换为JSON格式的字符串,只不过,为了保证反序列化成功,还会在JSON数据中添加数据的类型。 另外,由于默认情况下并不支持Java 8中的日期时间(`LocalDateTime`、`LocalDate`、`LocalTime`),为了保证能够对这些数据类型执行正确的序列化和反序列化,需要在对应的属性上添加注解,例如: ```java // 使用以下注解时,需要添加Jackson相关依赖 @JsonSerialize(using = LocalDateTimeSerializer.class) @JsonDeserialize(using = LocalDateTimeDeserializer.class) private LocalDateTime gmtCreate; ``` 接下来,即可通过`RedisTemplate`的`opsForValue()`再调用`set()` / `get()`方法写入 / 读取整个对象,例如: ```java @Test public void testSetObjectValue() { String key = "category999"; Category category = new Category(); category.setId(999L); category.setName("礼品"); category.setEnable(1); category.setGmtCreate(LocalDateTime.now()); redisTemplate.opsForValue().set(key, category); } @Test public void testGetObjectValue() { String key = "category999"; Serializable serializable = redisTemplate.opsForValue().get(key); System.out.println("获取到的值:" + serializable); System.out.println("获取到的值的类型:" + serializable.getClass().getName()); } ``` 由于Redis中的数据存在与数据库中的数据不一致的风险,则可能某些数据是无效的,需要清楚,并且,如果反复向Redis中存入大量不同Key的数据,也可能导致Redis服务器内存不足,则需要清除数据。在向Redis中存入数据时,可以指定数据的TTL(Time To Live:有效生存时间),当此生存时间结束后,对应的数据将被自动清理: ```java @Test public void testSetValueDuration() { String key = "brand"; Serializable value = "华为"; ValueOperations<String, Serializable> opsForValue = redisTemplate.opsForValue(); opsForValue.set(key, value, 15, TimeUnit.SECONDS); } ``` 也可以自行通过指令清理(删除)某些数据,例如: ```java @Test public void testDelete() { String key = "category"; redisTemplate.delete(key); } ``` 另外,还有关于列表的数据操作,例如添加元素到Redis中的列表中: ```java @Test public void testSetListValue() { // 向Redis中存入列表数据 // 需要调用RedisTemplate对象得到opsForList()返回对象后再操作 List<String> categories = new ArrayList<>(); categories.add("家电"); categories.add("食品"); categories.add("衣物"); String key = "categories"; // redisTemplate.opsForList().set(key, 0, categories.get(0)); for (int i = 0; i < categories.size(); i++) { redisTemplate.opsForList().rightPush(key, categories.get(i)); } } ``` 获取列表的长度: ```java @Test public void testGetListSize() { String key = "categories"; Long size = redisTemplate.opsForList().size(key); System.out.println("size = " + size); } ``` 获取列表中的元素: ```java @Test public void testGetListValue() { // 在RedisTemplate获取的opsForList()返回的结果对象中 // 当获取列表值时,默认是分页获取的,所以,每次获取都需要指定获取哪个区间段的值 // 在指定区间时,start取值为0表示从头开始,end取值为-1表现末尾(直至最后一个元素) // 在获取列表值时,会获取包含start至包含end的元素 // start / end均表示元素在列表中的索引,是从0开始顺序编号的 String key = "categories"; long start = 2; long end = 4; List<Serializable> list = redisTemplate.opsForList().range(key, start, end); for (Serializable serializable : list) { System.out.println(serializable); } }