一、环境
1-1、SpringBoot 2.2.0
1-2、JDK 11
1-3、spring-boot-starter-data-redis 2.2.0
<!--Redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
<!-- 辅助Redis -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.4.2</version>
</dependency>
二、引入Redis
2-1、application.yml/properties
spring:
redis:
database: 1
host: 127.0.0.1
port: 6379
password: 123456
timeout: 1000
lettuce:
pool:
max-active: 8
max-idle: 8
2-2、RedisConfig
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.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/**
* 这里主要是对redis序列化进行一个配置
*
* @author 小道仙
* @date 2020年11月22日
*/
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
template.setHashKeySerializer(stringRedisSerializer);
// value序列化方式采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
Redis的数据类型有很多,但是我们一般用的比较多的就是String类型,我们经常会在String里面存储比如List、Object什么的。但是比如你不对数据进行序列化就会报错。
在RedisTemplate.class里面我们可以看到一个afterPropertiesSet方法,它就是用来做默认配置的,我们可以看到如果我们没有自定义自己的序列化方式,将使用JDK序列化。
this.enableDefaultSerializer 的默认值是 true
2-3、RedisUtils
Spring已经给我们封装好了RedisTemplete来操作redis。redis的数据类型有很多,String、List、Set、ZSet、Hash,但可能实际上我们使用的最多是String,所以我们封装一个Utils来使得我们的操作更加的简洁。
RedisUtils
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;
/**
* redis相关操作
*
* @author 小道仙
* @date 2020年11月21日
*/
@Component
public class RedisUtils {
/**
* 因为要定义一个静态变量,所以不能直接在变量上面使用 @Autowired 要使用set方式注入
*/
public static RedisTemplate<String, Object> redisTemplate;
@Autowired
public RedisUtils(RedisTemplate<String, Object> redisTemplate) {
RedisUtils.redisTemplate = redisTemplate;
}
/**
* 设置一个不过期的key-value
*/
public static void set(String key,Object value){
redisTemplate.opsForValue().set(key, value);
}
/**
* 设置一个过期的key-value
* 过期时间 expiresTime,单位秒
*/
public static void set(String key, Object value,Long expiresTime){
redisTemplate.opsForValue().set(key, value,expiresTime, TimeUnit.SECONDS);
}
/**
* 删除一个元素
*/
public static Boolean delete(String key){
return redisTemplate.delete(key);
}
/**
* 判断这个key是否存在
*/
public static Boolean hashKey(String key){
return redisTemplate.hasKey(key);
}
}
上面的封装方法主要是对String类型进行操作,但是因为我们在RedisConfig里面配置了序列化,所以我们这个Value可以是任何类型的,但是最后都会被序列化字符串存储起来。
Redis有五种数据类型,对应的RedisTemplete也提供了五种操作的方法
// 操作String类型
redisTemplate.opsForValue();
// 操作Set类型
redisTemplate.opsForSet();
// 操作ZSet类型
redisTemplate.opsForZSet();
// 操作List类型
redisTemplate.opsForList();
// 操作哈希类型
redisTemplate.opsForHash();
因为上面的RedisUtils只封装了对String进行操作的方法,但是变量 redisTemplate 是一个静态变量,我们可以使用它来操作其它的类型,比如我们要操作List类型数据时候可以选择这样。
RedisUtils.redisTemplate.opsForList();
三、测试使用
3-1、插入数据
@GetMapping("/test")
public void test(){
List<String> list = new ArrayList<>();
list.add("111");
list.add("222");
list.add("333");
RedisUtils.set("key1",list);
RedisUtils.redisTemplate.opsForList().leftPush("key2",list);
}
我们使用Redis工具查看结果
对于String类型操作很简单,下面就演示一下对于List数据类型的操作,其它的操作以此类推,也可以去看看文档。
3-2、List类型操作
我们知道List是一个数据集合,可以理解成它在里面是一个队列的形式存储一个个排序好了。
3-2-1、插入数据
因为它是集合,所以我们可以从它的前面和后面插入数据。
RedisUtils.redisTemplate.opsForList().leftPush("key2",list);
RedisUtils.redisTemplate.opsForList().rightPush("key2",list);
3-2-2、取出数据
1、类似于栈的pop出数据
RedisUtils.redisTemplate.opsForList().leftPop("key2");
RedisUtils.redisTemplate.opsForList().rightPop("key2");
2、类似于List的下标取出数据
RedisUtils.redisTemplate.opsForList().index("key2",0);
3、按照下标取出一个数据集
List<Object> key1 = RedisUtils.redisTemplate.opsForList().range("key2", 0, 10);
3-2-3、其它
1、通过key和下标去修改某个元素的内容
RedisUtils.redisTemplate.opsForList().set("key2",0,list);
2、返回当前key的元素个数
RedisUtils.redisTemplate.opsForList().size("key2");
3、删除某个key
RedisUtils.delete("key2");
4、其它
上面的种种操作,我们同时设置key然后再操作,我们也可以直接先找到这个元素,然后再做操作的时候就不需要设置key了。也就是我们先找到这个元素。