tags: [springboot,redis]
categories: [中间件]
前言
这两天做项目上也用到这块,自己在解决自己项目上问题时也用到,其中关于序列化和基本使用这块,重复犯了一些错误,耽误不少时间,所以记录下来
SpringBoot版本:2.2.6 Redis版本:5.0.8 已安装好了Redis于服务器上
基本配置使用
引入依赖
值得注意的是 springboot2.0
使用依赖为spring-boot-starter-data-redis
,后面依赖commons-pool2
是使用lettuce
需要的,使用之前的jedis来操作也是可以的,这里没有这么做
<!--redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--redis lettuce-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
配置文件
建议为Redis配置密码,防止被清数据,另外可以设置Redis自启
redis:
database: 0
password: 密码
host: IP
port: 端口
lettuce:
pool:
max-active: 100
max-idle: 10
max-wait: 3000
timeout: 5000
配置类
在这里设置了默认的序列化方式
如不设置,Redis默认会使用JdkSerializationRedisSerializer
来执行序列化,这种序列化方式的缺点在于被序列化的对象必须实现序列化接口,否则会报错
序列化
事实上它也支持序列化为xml格式,只是现如今基本不用该数据格式了,序列化为JSON格式,有使用FastJSON或者Jackson的,我本就是Jackson的忠实用户,自然是使用Jackson来序列化,所以使用GenericJackson2JsonRedisSerializer
来序列化对象,但是听说Jackson不支持JAVA8的LocalDate,我还没验证过
到目前为止,我还是认为StringRedisSerializer
这种序列化方式是最方便的,即使是对象存入,我们只需要在存入之前将对象序列化,取出来后再反序列化就行了,一般的对象序列化,若存入string字符串,会在外层继续加上一个””,我们存入”string”,后面会变为””string””,导致难以阅读
我目前只用到了string和HASH两种数据结构,这里只有这两种~
@Configuration
public class RedisConfig {
/**
* TODO: 使用泛型接受
*
* @param connectionFactory connectionFactory
* @return RedisTemplate
*/
@Bean
public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory connectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(connectionFactory);
return redisTemplate;
}
@Bean
public StringRedisTemplate stringRedisTemplate(LettuceConnectionFactory connectionFactory) {
StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
stringRedisTemplate.setKeySerializer(new StringRedisSerializer());
stringRedisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
stringRedisTemplate.setHashKeySerializer(new StringRedisSerializer());
stringRedisTemplate.setHashValueSerializer(new StringRedisSerializer());
stringRedisTemplate.setConnectionFactory(connectionFactory);
return stringRedisTemplate;
}
}
到这里我们已经可以使用上面的StringRedisTemplate
和RedisTemplate
来存取数据了,但是为了简化操作,最好还是能对常用redis操作做一些封装,以下是我做项目中用到的一些基本操作
工具类
@Component
public class RedisUtil {
@Resource
private RedisTemplate<String, Object> redisTemplate;
@Resource
private RedisTemplate<String, String> stringStringRedisTemplate;
/**
* 删除key
*
* @param key key
*/
public void delete(String key) {
redisTemplate.delete(key);
}
/**
* 批量删除key
*
* @param keys keys
*/
public void delete(Collection<String> keys) {
redisTemplate.delete(keys);
}
/**
* 是否存在key
*
* @param key key
* @return Boolean
*/
public Boolean hasKey(String key) {
return redisTemplate.hasKey(key);
}
/**
* 取值
*
* @param key key
* @return value
*/
public String get(String key){
return stringStringRedisTemplate.opsForValue().get(key);
}
/**
* 存入KEY并设置过期时间
*
* @param key key
* @param value value
* @param seconds 时间
* @param timeUnit 单位
*/
public void setKeyWithExpired(String key, String value, int seconds, TimeUnit timeUnit){
stringStringRedisTemplate.opsForValue().set(key, value, seconds, timeUnit);
}
/**
* 存入HASH 并设置key value
*
* @param hash hash
* @param hKey hKey
* @param hValue hValue
*/
public void hashPutKey(String hash, String hKey, String hValue){
redisTemplate.opsForHash().put(hash, hKey, hValue);
}
/**
* 获取指定hash下指定key的value
* @param hash hash
* @param hKey hKey
* @return obj
*/
public Object hashGetKey(String hash, String hKey){
return redisTemplate.opsForHash().get(hash, hKey);
}
/**
* 存入HASH 并设置key value
*
* @param hash hash
* @return Map<Object, Object>
*/
public Map<Object, Object> hashEntries(String hash){
return stringStringRedisTemplate.opsForHash().entries(hash);
}
}