黑发不知勤学早,白首方悔读书迟
网上好多RedisUtil工具类,这里给大家展示用接口来实现,我们可以注入后直接调用:
注:
里面的方法并不全面,有没涉及到的方法可以进入到RedisTemplate
看源码中的方法,然后写到接口中实现一下就可以使用。
例子:
private RedisService redisService;
public void redisTest(@RequestBody User user) {
User user1 = new User("loveLetter", 18, "测试");
boolean set = redisService.set(user.getId(), user1);
System.out.println("Redis set key:" + set);
System.out.println("Redis get key:"+redisService.get(user.getId()));
}
控制台输出:
1、在pom里引入Maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2、配置RedisConfig
package com.loveletter.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
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.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/**
* @author loveLetter
* @create 2022/3/23
*/
@Configuration
public class RedisConfig {
@Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
StringRedisTemplate redisTemplate = new StringRedisTemplate();
redisTemplate.setConnectionFactory(redisConnectionFactory);
return redisTemplate;
}
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
/**
* 通用的序列化和反序列化设置
* ObjectMapper类是Jackson库的主要类。它提供一些功能将转换成Java对象匹配JSON结构,反之亦然。
*/
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
// key序列化
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
3、新建RedisService
package com.loveletter.redis;
import java.util.List;
import java.util.Map;
/**
* @author loveLetter
* @create 2022/3/23
*/
public interface RedisService {
/**
* 批量删除
*
* @param keys key数组
*/
public void remove(final String... keys);
/**
* 批量删除指定key
*
* @param pattern
*/
public void removePattern(final String pattern);
/**
* 删除指定key
*
* @param key
*/
public void remove(final String key);
/**
* 判断指定key是否存在
*
* @param key
* @return
*/
public boolean exists(final String key);
/**
* 设置key的过期时间(秒)
*
* @param key
* @param expireTime
*/
public void refreshExpireTime(final String key, Integer expireTime);
/**
* 获取指定key
*
* @param key
* @return
*/
public Object get(final String key);
/**
* 添加key-value(使用默认失效时间1天)
*
* @param key
* @param value
* @return
*/
public boolean set(final String key, Object value);
/**
* 添加key-value(指定失效时间)
*
* @param key
* @param value
* @param expireTime 失效时间为null则永久生效(单位秒)
* @return
*/
public boolean set(final String key, Object value, Integer expireTime);
/**
* 插入list
*
* @param key
* @param list
* @param <T>
*/
<T> boolean setList(String key, List<T> list);
/**
* 插入list
*
* @param key
* @param list
* @param expireTime
* @param <T>
*/
<T> boolean setList(String key, List<T> list, Integer expireTime);
/**
* 将list放入缓存
*
* @param key 键
* @param value 值
* @return
*/
boolean lSet(String key, Object value);
/**
* 将list放入缓存
*
* @param key 键
* @param value 值
* @param expireTime 超时时间秒
* @return
*/
boolean lSet(String key, Object value, Integer expireTime);
/**
* 将list放入缓存
*
* @param key 键
* @param value 值
* @return
*/
boolean rSet(String key, Object value);
/**
* 将list放入缓存
*
* @param key 键
* @param value 值
* @param expireTime 超时时间秒
* @return
*/
boolean rSet(String key, Object value, Integer expireTime);
/**
* 取list
*
* @param key
* @param <T>
* @return
*/
<T> List<T> getList(String key);
/**
* 存储map
*
* @param key
* @param map
* @param expireTime 失效时间为null则永久生效(单位秒)
* @return
*/
public <K, HK, HV> boolean setMap(K key, Map<HK, HV> map, Integer expireTime);
/**
* 获取map
*
* @param key
* @param <K>
* @param <HK>
* @param <HV>
* @return
*/
public <K, HK, HV> Map<HK, HV> getMap(final K key);
/**
* redis计数器
*
* @param key
* @return
*/
Integer incr(String key);
}
4、新建RedisServiceImpl
package com.loveletter.redis;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
/**
* @author loveLetter
* @create 2022/3/23
*/
@Service
public class RedisServiceImpl implements RedisService {
@Autowired
private RedisTemplate redisTemplate;
/**
* 一天有多少分钟,默认时间是一天
*/
private static final Integer MINUTES_OF_ONE_DAY = 24 * 60;
//private static ObjectMapper objectMapper = new ObjectMapper();
/**
* 批量删除对应的value
*
* @param keys
*/
@Override
public void remove(final String... keys) {
for (String key : keys) {
remove(key);
}
}
/**
* 批量删除key
*
* @param pattern
*/
@Override
public void removePattern(final String pattern) {
Set<Serializable> keys = redisTemplate.keys(pattern);
if (keys.size() > 0) {
redisTemplate.delete(keys);
}
}
/**
* 删除对应的value
*
* @param key
*/
@Override
public void remove(final String key) {
if (exists(key)) {
redisTemplate.delete(key);
}
}
/**
* 判断缓存中是否有对应的value
*
* @param key
* @return
*/
@Override
public boolean exists(final String key) {
return redisTemplate.hasKey(key);
}
/**
* 更新缓存时间
*
* @param key
* @param expireTime
*/
@Override
public void refreshExpireTime(final String key, Integer expireTime) {
if (exists(key)) {
redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
}
}
/**
* 读取缓存
*
* @param key
* @return
*/
@Override
public Object get(final String key) {
Object result = null;
ValueOperations<String, Object> operations = redisTemplate.opsForValue();
result = operations.get(key);
return result;
}
/**
* 写入缓存
*
* @param key
* @param value
* @return
*/
@Override
public boolean set(final String key, Object value) {
boolean result = false;
try {
ValueOperations<String, Object> operations = redisTemplate.opsForValue();
operations.set(key, value);
redisTemplate.expire(key, MINUTES_OF_ONE_DAY, TimeUnit.MINUTES);
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 写入缓存
*
* @param key
* @param value
* @return
*/
@Override
public boolean set(final String key, Object value, Integer expireTime) {
boolean result = false;
try {
ValueOperations<String, Object> operations = redisTemplate.opsForValue();
operations.set(key, value);
if (expireTime != null) {
redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
}
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 插入list
*
* @param key
* @param list
* @param <T>
*/
@Override
public <T> boolean setList(String key, List<T> list) {
return setList(key, list, MINUTES_OF_ONE_DAY * 60);
}
@Override
public <T> boolean setList(String key, List<T> list, Integer expireTime) {
return set(key, list, expireTime);
}
/**
* 将list放入缓存
*
* @param key 键
* @param value 值
* @return
*/
@Override
public boolean lSet(String key, Object value) {
return lSet(key, value, 0);
}
/**
* 将list放入缓存
*
* @param key 键
* @param value 值
* @param expireTime 超时时间秒
* @return
*/
@Override
public boolean lSet(String key, Object value, Integer expireTime) {
try {
redisTemplate.opsForList().leftPush(key, value);
if (expireTime > 0) {
redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 将list放入缓存
*
* @param key 键
* @param value 值
* @return
*/
@Override
public boolean rSet(String key, Object value) {
return lSet(key, value, 0);
}
/**
* 将list放入缓存
*
* @param key 键
* @param value 值
* @param expireTime 超时时间秒
* @return
*/
@Override
public boolean rSet(String key, Object value, Integer expireTime) {
try {
redisTemplate.opsForList().rightPush(key, value);
if (expireTime > 0) {
redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 取list
*
* @param key
* @param <T>
* @return
*/
@Override
public <T> List<T> getList(String key) {
Object jsonStr = get(key);
if (jsonStr == null) {
return null;
}
try {
return (List<T>) jsonStr;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
public <K, HK, HV> boolean setMap(K key, Map<HK, HV> map, Integer expireTime) {
HashOperations<K, HK, HV> operations = redisTemplate.opsForHash();
operations.putAll(key, map);
if (expireTime != null) {
redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
}
return false;
}
@Override
public <K, HK, HV> Map<HK, HV> getMap(final K key) {
HashOperations<K, HK, HV> operations = redisTemplate.opsForHash();
return operations.entries(key);
}
/**
* redis计数器
*
* @param key
* @return
*/
@Override
public Integer incr(String key) {
ValueOperations<String, Object> ops = redisTemplate.opsForValue();
try {
//此方法会先检查key是否存在,存在+1,不存在先初始化,再+1
ops.increment(key, 1);
return (int) get(key);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return 0;
}
}