提示RedisCache没有incr、decr等方法,请问是需要自己添加吗?
3条回答 默认 最新
Oityup 2023-02-24 11:34关注是的,Spring Boot默认的RedisCache并没有实现incr、decr等方法。您需要实现一个自定义的缓存管理器来扩展RedisCache的功能。
以下是一些实现incr和decr的示例代码:
import org.springframework.cache.Cache; import org.springframework.cache.support.SimpleValueWrapper; import org.springframework.data.redis.cache.RedisCache; import org.springframework.data.redis.core.RedisOperations; public class CustomRedisCache extends RedisCache { private final RedisOperations redisOperations; public CustomRedisCache(String name, byte[] prefix, RedisOperations<? extends Object, ? extends Object> redisOperations, long expiration) { super(name, prefix, redisOperations, expiration); this.redisOperations = redisOperations; } @Override public ValueWrapper get(Object key) { ValueWrapper wrapper = super.get(key); if (wrapper != null && wrapper.get() != null) { return new SimpleValueWrapper(Integer.valueOf(wrapper.get().toString())); } return wrapper; } @Override public void put(Object key, Object value) { redisOperations.opsForValue().increment(key.toString(), (long) value); super.put(key, value); } public void decrement(Object key) { redisOperations.opsForValue().decrement(key.toString()); } public long getLong(Object key) { Long value = redisOperations.opsForValue().increment(key.toString(), 0L); return (value != null ? value : 0L); } }这个自定义缓存管理器扩展了RedisCache,并添加了一个名为decrement的新方法。同时,在get和put方法中,它将缓存中的值转换为整数。
在您的Spring Boot应用程序中,您可以通过将CustomRedisCache作为缓存管理器来使用它:
@Configuration @EnableCaching public class CacheConfig extends CachingConfigurerSupport { @Autowired private RedisConnectionFactory redisConnectionFactory; @Bean @Override public CacheManager cacheManager() { RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate()); redisCacheManager.setDefaultExpiration(3600); redisCacheManager.setUsePrefix(true); CustomRedisCache customRedisCache = new CustomRedisCache("customCache", "customCache:".getBytes(), redisTemplate(), 3600); Map<String, RedisCacheConfiguration> cacheConfigurations = new HashMap<>(); cacheConfigurations.put("customCache", RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(1))); redisCacheManager.setCacheConfigurations(cacheConfigurations); redisCacheManager.setCaches(Arrays.asList(customRedisCache)); return redisCacheManager; } @Bean public RedisTemplate<String, Object> redisTemplate() { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); return redisTemplate; } }```
这里的CustomRedisCache被添加到了RedisCacheManager中,而其他的默认RedisCache使用RedisCacheConfiguration设置缓存时间。这样,您就可以使用自定义的缓存管理器来实现incr和decr方法。解决 无用评论 打赏 举报 编辑记录