SpringBoot Redis序列化配置详解编程语言
2023-06-13 09:20:46 时间
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
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.stereotype.Component;
import java.lang.reflect.Method;
@Configuration
@Component
public class RedisConfig extends CachingConfigurerSupport {
private static final Logger logger = LoggerFactory.getLogger(RedisConfig.class);
public RedisConfig(){
logger.info("init RedisConfig...");
/**
* 生成key的策略
* @return
@Bean
public KeyGenerator keyGenerator() {
return new KeyGenerator() {
@Override
public Object generate(Object target, Method method, Object... params) {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName());
sb.append(method.getName());
for (Object obj : params) {
sb.append(obj.toString());
return sb.toString();
/**
* 管理缓存
* @param redisTemplate
* @return
@SuppressWarnings("rawtypes")
@Bean
public CacheManager cacheManager(RedisTemplate redisTemplate) {
RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
//设置缓存过期时间
// rcm.setDefaultExpiration(60);//秒
return rcm;
/**
* RedisTemplate配置
* @param factory
* @return
@Bean
public RedisTemplate String, String redisTemplate(RedisConnectionFactory factory) {
StringRedisTemplate template = new StringRedisTemplate(factory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
template.setValueSerializer(jackson2JsonRedisSerializer);//如果key是String 需要配置一下StringSerializer,不然key会乱码 /XX/XX
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
RedisUtils.java Redis工具类
import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.connection.DataType; 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.Component; import java.io.Serializable; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; * redicache 工具类 @SuppressWarnings("unchecked") @Component public class RedisUtils { private static final Logger log = LoggerFactory.getLogger(RedisUtils.class); private static final PropertiesUtils redisProper = new PropertiesUtils("spring/redis-time-config.properties"); @SuppressWarnings("rawtypes") @Autowired private RedisTemplate redisTemplate; /** * 批量删除对应的value * @param keys public void remove(final String... keys) { for (String key : keys) { remove(key);
public int getCountPattern(String pattern){ Set Serializable keys = redisTemplate.keys(pattern); return keys==null?0:keys.size(); /** * 批量删除key * @param pattern public void removePattern(final String pattern) { Set Serializable keys = redisTemplate.keys(pattern); if (keys.size() 0) redisTemplate.delete(keys); /** * 批量删除key * @param keys public void removeKeys(final Set String keys) { if (keys.size() 0) redisTemplate.delete(keys); public Long ttl(String key) { return StringUtils.isNoneEmpty(key) ? Long.valueOf(-1L) : redisTemplate.getExpire(key); /** * 删除对应的value * @param key public void remove(final String key) { if (exists(key)) { redisTemplate.delete(key); /** * 判断缓存中是否有对应的value * @param key * @return public boolean exists(final String key) { return redisTemplate.hasKey(key); /** * 读取缓存 * @param key * @return public Object get(final String key) { Object result = null; ValueOperations Serializable, Object operations = redisTemplate.opsForValue(); result = operations.get(key); return result; /** * 读取缓存 * @param key * @return public Long size(final String key) { Long result = null; ValueOperations Serializable, Object operations = redisTemplate.opsForValue(); result = operations.size(key); return result; public K Set K keys(K pattern){ return redisTemplate.keys(pattern); /** * 写入缓存 * @param key * @param value * @return public boolean set(final String key, Object value) { boolean result = false; try { ValueOperations Serializable, Object operations = redisTemplate.opsForValue(); operations.set(key, value); result = true; } catch (Exception e) { e.printStackTrace(); return result; /** * 写入缓存 * @param key * @param value * @return public boolean set(final String key, Object value, Long expireTime) { return set(key, value, expireTime, TimeUnit.SECONDS); /** * 写入缓存 * @param key * @param value * @return public boolean set(final String key, Object value, Long expireTime, TimeUnit timeUnit) { boolean result = false; try { ValueOperations Serializable, Object operations = redisTemplate.opsForValue(); operations.set(key, value); redisTemplate.expire(key, expireTime, timeUnit); result = true; } catch (Exception e) { e.printStackTrace(); return result; /** * 写入缓存 * @param key * @param value * @return public boolean setInt(final String key, int value, Long expireTime, TimeUnit timeUnit) { boolean result = false; try { ValueOperations String, Integer operations = redisTemplate.opsForValue(); operations.set(key, value); redisTemplate.expire(key, expireTime, timeUnit); result = true; } catch (Exception e) { e.printStackTrace(); return result; /** * 写入缓存 * @param key * @param value * @return public boolean setInt(final String key, int value) { boolean result = false; try { ValueOperations String, Integer operations = redisTemplate.opsForValue(); operations.set(key, value); result = true; } catch (Exception e) { e.printStackTrace(); return result; /** * 写入缓存 * @param key * @param key * @return public int getInt(final String key) { int result = -1; if (exists(key)) { ValueOperations String, Integer operations = redisTemplate.opsForValue(); result = operations.get(key); return result; public Long increment(String key, long val){ if( exists(key) ){ return redisTemplate.opsForValue().increment(key, val); return null; public Long addHyperLogLog(Object val1, Object ...val2){ return redisTemplate.opsForHyperLogLog().add(val1, val2); public Long sAdd(Object key, Object... values) { return isNullOrEmpty(key) ? null : redisTemplate.opsForSet().add(key, values); public Set String sMembers(String key) { return isNullOrEmpty(key) ? null : redisTemplate.opsForSet().members(key); public Long sRem(Object key, Object... values) { return isNullOrEmpty(key) ? null : redisTemplate.opsForSet().remove(key, values); public Object sPop(Object key) { return isNullOrEmpty(key) ? null : redisTemplate.opsForSet().pop(key); public boolean sMove(Object srcKey, Object destKey, Object member) { return (!isNullOrEmpty(srcKey) !isNullOrEmpty(destKey)) ((member != null) redisTemplate.opsForSet().move(srcKey, member, destKey)); public Long sLen(Object key) { return isNullOrEmpty(key) ? null : redisTemplate.opsForSet().size(key); public boolean sIsMember(Object key, Object member) { return !isNullOrEmpty(key) redisTemplate.opsForSet().isMember(key, member); public Set Object sInter(Object key, Object... keys) { return key == null ? null : redisTemplate.opsForSet().intersect(key, keys); public Long sInterStore(Object destKey, Object srckey, Object... srcKeys) { return !isNullOrEmpty(destKey) srckey != null ? redisTemplate.opsForSet().intersectAndStore(srckey, srcKeys, destKey) : null; public Set Object sUnion(Object... keys) { if (keys != null keys.length != 0) { List keyList = Arrays.asList(keys); return redisTemplate.opsForSet().union(keyList.remove(0), keyList); } else { return null; public Long sUnionStore(Object dstKey, Object... keys) { if (keys != null keys.length != 0 dstKey != null) { List keyList = Arrays.asList(keys); return redisTemplate.opsForSet().unionAndStore(keyList.remove(0), keyList, dstKey); } else { return null; public Set Object sDiff(Object... keys) { if (keys != null keys.length != 0) { List keyList = Arrays.asList(keys); return redisTemplate.opsForSet().difference(keyList.remove(0), keyList); } else { return null; public Long sDiffStore(Object dstKey, Object... keys) { if (!isNullOrEmpty(dstKey) keys != null keys.length != 0) { List keyList = Arrays.asList(keys); return redisTemplate.opsForSet().differenceAndStore(keyList.remove(0), keyList, dstKey); } else { return null; public boolean hSet(String key, Map String, Object param, Long expireTime, TimeUnit timeUnit) { try { hSet(key, param); redisTemplate.expire(key, expireTime, timeUnit); return true; } catch (Exception e) { e.printStackTrace(); return false; public void hSet(String key, Map String, Object param) { HashOperations String, String, Object hashOperations = redisTemplate.opsForHash(); Set Map.Entry String, Object entrySet = param.entrySet(); for (Map.Entry String, Object entry : entrySet) { hashOperations.put(key, entry.getKey(), entry.getValue()); public void hSet(String key, Object field, Object value) { redisTemplate.opsForHash().put(key, field, value); public Object hGet(String key, Object field) { if (StringUtils.isEmpty(key)) { return null; return redisTemplate.opsForHash().get(key, field); public String hGet(String key, String field) { if (StringUtils.isEmpty(key)) { return null; HashOperations String, String, String hashOperations = redisTemplate.opsForHash(); return hashOperations.get(key, field); public boolean hExists(String key, Object hashKey) { return !isNullOrEmpty(key) redisTemplate.opsForHash().hasKey(key, hashKey); public Long hDel(Object key, Object... hashKeys) { return isNullOrEmpty(key) ? Long.valueOf(0L) : redisTemplate.opsForHash().delete(key, hashKeys); public Long hLen(String key) { return StringUtils.isNoneEmpty(key) ? Long.valueOf(0L) : redisTemplate.opsForHash().size(key); public Set Object hKeys(Object key) { return isNullOrEmpty(key) ? null : redisTemplate.opsForHash().keys(key); public List Object hValues(Object key) { return isNullOrEmpty(key) ? null : redisTemplate.opsForHash().values(key); public Map Object, Object hGetAll(Object key) { return isNullOrEmpty(key) ? null : redisTemplate.opsForHash().entries(key); public Object getUnknownType(Object key){ try { DataType dataType = redisTemplate.type(key); switch (dataType){ case NONE: log.info("key:[{}]不存在", key); return null; case STRING: return redisTemplate.opsForValue().get(key); case LIST: return redisTemplate.opsForList().range(key, 0, -1); case SET: return redisTemplate.opsForSet().members(key); case ZSET: return redisTemplate.opsForZSet().range(key, 0, -1); case HASH: return redisTemplate.opsForHash().entries(key); default: return null; }catch (Exception e){ log.error("查询出现异常:{}", e); return null; private static boolean isNullOrEmpty(Object obj) { boolean result = false; if (obj == null || "null".equals(obj) || "".equals(obj.toString().trim())) { result = true; return result;
String[] redispropers=redisProper.getPropertiesValues(redisKey); Long redisExp=Long.valueOf(redispropers[0]); TimeUnit redisTimeType= UtilHelper.getTimeUtil(redispropers[1]); redisTemplate.opsForValue().set(key,value,redisExp, redisTimeType);
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/16223.html
cjavaxml相关文章
- SpringBoot之Redis访问(spring-boot-starter-data-redis)详解数据库
- SSM整合Redis实现缓存优化(ssm配置redis)
- 缓存配置Redis类缓存实现低延迟又高性能(怎么配置redis类)
- 构实现更高效的Redis之旅自定义数据结构(自定义redis数据结)
- 等保级别的Redis数据库测评实践(等保redis数据库测评)
- 深入分析Redis连接池的实时状态(查看redis连接池状态)
- 深入探索Redis安装配置指南(查看redis安装配置)
- 利用Redis实现分布式锁的应用(用redis分布式锁)
- 本地Redis服务器的配置与部署(本地redis的配置)
- 清空Redis一步搞定值清空问题(清空redis的值)
- 互联网Redis开源技术探索之旅(互联网redis源码)
- 使用SSM和Redis提升架构性能(ssm加入redis)
- 华硕电脑Redis打开即闪退(华硕redis打开闪退)
- Redis默认持久化增强数据可靠性(redis默认持久化配置)
- Redis大小默认配置分析(redis 默认大小)
- 谁也无法避开Redis的高并发下的死锁(redis高并发死锁)
- Redis集群同步实现最佳性能(redis 集群同步配置)
- Redis集群事件实时通知机制(redis集群事件通知)
- 使用Redis队列实现排行榜功能(redis队列排行榜实现)
- Redis管理数据库配置表细节(redis配置数据库下表)
- 资源Redis配置Pool资源,提升效率(redis 配置pool)
- Redis集群最少配置3台服务器(redis集群单数台)
- Redis实现性能优化配置技巧(redis配置性能优化)