先配置RedisTemplate<String, Object>
@Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<String, Object> configRedisTemplate = new RedisTemplate<>(); configRedisTemplate.setValueSerializer(new JdkSerializationRedisSerializer()); configRedisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer()); configRedisTemplate.setKeySerializer(new StringRedisSerializer()); configRedisTemplate.setHashKeySerializer(new StringRedisSerializer()); configRedisTemplate.setConnectionFactory(redisConnectionFactory); return configRedisTemplate; }
再自定义一个RedisCacheManager,可以使用CachePut或其他注解自定义过期时间,例如@CachePut(cacheNames = Constant.RedisKeyPrefix.DEVICE_ITEM + "#600000", key = "#device.id")
import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.cache.RedisCache; import org.springframework.data.redis.cache.RedisCacheConfiguration; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.cache.RedisCacheWriter; import java.lang.reflect.Field; import java.time.Duration; /** * @author yiChuYun_lq * @date 2019/7/4 14:47 * @since 1.0.0 */ @Slf4j public class CustomizeRedis extends RedisCacheManager { private RedisCacheConfiguration cacheConfig; public CustomizeRedis(RedisCacheWriter cacheWriter, RedisCacheConfiguration cacheConfig) { super(cacheWriter, cacheConfig, true); this.cacheConfig = cacheConfig; } @Override protected RedisCache createRedisCache(String name, RedisCacheConfiguration cacheConfig) { String[] values = name.split("#"); long expiration = computeExpiration(values); if (cacheConfig == null) cacheConfig = this.cacheConfig; if (expiration > -1) { Class<? extends RedisCacheConfiguration> cacheConfigClass = cacheConfig.getClass(); try { Field ttl = cacheConfigClass.getDeclaredField("ttl"); ttl.setAccessible(true); ttl.set(cacheConfig, Duration.ofSeconds(expiration)); } catch (NoSuchFieldException | IllegalAccessException e) { log.error(e.getMessage()); } } return super.createRedisCache(values[0], cacheConfig); } private long computeExpiration(String[] values) { if (values.length > 1) { return Long.parseLong(values[1]); } return -1; } } 再使用自定义的RedisCacheManager @Bean public RedisCacheManager cacheManager(RedisConnectionFactory factory) { return new CustomizeRedis(RedisCacheWriter.lockingRedisCacheWriter(factory), RedisCacheConfiguration.defaultCacheConfig()); }
在定义一个Redis工具类RedisUtils
import com.fansmore.api.common.Constant; import org.springframework.data.redis.core.RedisTemplate; import java.util.concurrent.TimeUnit; public class RedisUtils { public static RedisTemplate<String, Object> getRedis() { return SpringUtils.getBean("redisTemplate"); } /*返回-1为永不过期,-2未已过期或不存在*/ public static Long getExpire(String token) { return getExpire(token, TimeUnit.SECONDS); } public static Long getExpire(String token, TimeUnit unit) { return getRedis().getExpire(token, unit); } public static boolean isExpire(String token) { Long expire = getExpire(token); return Constant.RedisExpireKey.EXPIRE == expire; } public static Object getCache(String token) { if (token == null) token = ""; return getRedis().opsForValue().get(token); } public static void setCache(String token, Object obj) { setCache(token, obj, 0); } public static void setCache(String token, Object obj, long expire) { setCache(token, obj, expire, null); } public static void setCache(String token, Object obj, long expire, TimeUnit unit) { if (expire > 0) { if (unit == null) { getRedis().opsForValue().set(token, obj, expire, TimeUnit.MILLISECONDS); } else { getRedis().opsForValue().set(token, obj, expire, unit); } } else { getRedis().opsForValue().set(token, obj); } } public static void delCache(String token) { getRedis().delete(token); } }
最后就可以辛苦的码代码了,注意一些坑,设置了过期时间,必须指定时间单位,不然反序列化会出现问题。
最后附上一些常用的redis-cli命令
连接服务器redis-cli -h IP地址 -p 端口
授权 auth 密码
查看key使用keys *key*
查看过期时间ttl ttl key,返回-1代表永不过期,返回-2代表已过期或不存在