redis简单启用

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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值