不废话,上代码,主要是解决序列化之类的问题
import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.interceptor.KeyGenerator; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheConfiguration; 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.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializationContext; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import java.lang.reflect.Method; import java.time.Duration; /** * @author 李家民 */ @Configuration @EnableCaching public class RedisConfig { @Bean public KeyGenerator wiselyKeyGenerator() { 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(); } }; } @Bean public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(objectMapper); // 序列号key value redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer); redisTemplate.afterPropertiesSet(); return redisTemplate; } @Bean public CacheManager cacheManager(RedisConnectionFactory factory) { RedisSerializer<String> redisSerializer = new StringRedisSerializer(); 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); // 配置序列化(解决乱码的问题),过期时间600秒 RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofSeconds(600)) .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer)) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)) .disableCachingNullValues(); RedisCacheManager cacheManager = RedisCacheManager.builder(factory) .cacheDefaults(config) .build(); return cacheManager; } }
public class RedisConst { public static final String SKUKEY_PREFIX = "sku:"; public static final String SKUKEY_SUFFIX = ":info"; //单位:秒 public static final long SKUKEY_TIMEOUT = 24 * 60 * 60; //单位:秒 尝试获取锁的最大等待时间 public static final long SKULOCK_EXPIRE_PX1 = 1; //单位:秒 锁的持有时间 public static final long SKULOCK_EXPIRE_PX2 = 1; public static final String SKULOCK_SUFFIX = ":lock"; public static final long SKUKEY_TEMPORARY_TIMEOUT=60*60; public static final String USER_KEY_PREFIX = "user:"; public static final String USER_CART_KEY_SUFFIX = ":cart"; public static final long USER_CART_EXPIRE = 60 * 60 * 24 * 7; //用户登录 public static final String USER_LOGIN_KEY_PREFIX = "user:login:"; // public static final String userinfoKey_suffix = ":info"; public static final int USERKEY_TIMEOUT = 60 * 60 * 24 * 7; //秒杀商品前缀 public static final String SECKILL_GOODS = "seckill:goods"; public static final String SECKILL_ORDERS = "seckill:orders"; public static final String SECKILL_ORDERS_USERS = "seckill:orders:users"; public static final String SECKILL_STOCK_PREFIX = "seckill:stock:"; public static final String SECKILL_USER = "seckill:user:"; //用户锁定时间 单位:秒 public static final int SECKILL__TIMEOUT = 60 * 60 * 1; }