Springboot+Vue+SSE+Redis

提示RedisCache没有incr、decr等方法,请问是需要自己添加吗?

是的,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方法。

是的,RedisCache并没有实现incr、decr等方法,需要自己添加。

RedisCache是Spring提供的一个用于缓存的实现,它默认使用了RedisTemplate来操作Redis,但是RedisTemplate只提供了基础的操作方法,如get、set、delete等,如果想使用incr、decr等方法,需要自己扩展RedisTemplate。

下面是一个实现incr、decr方法的示例代码:

public class RedisTemplateEx extends RedisTemplate<String, Object> {

    /**
     * redis中的key值,在执行incr、decr操作时需要转换成string类型
     */
    private static final String CACHE_KEY = "cache_key:";

    /**
     * 自增操作
     */
    public Long incr(String key, long delta) {
        return execute((RedisCallback<Long>) connection -> connection.incrBy(getRedisKey(key), delta));
    }

    /**
     * 自减操作
     */
    public Long decr(String key, long delta) {
        return execute((RedisCallback<Long>) connection -> connection.decrBy(getRedisKey(key), delta));
    }

    /**
     * 转换redis key为string类型
     */
    private byte[] getRedisKey(String key) {
        return (CACHE_KEY + key).getBytes();
    }
}

使用示例:

@Autowired
private RedisTemplateEx redisTemplate;

public void incr(String key, long delta) {
    redisTemplate.incr(key, delta);
}

public void decr(String key, long delta) {
    redisTemplate.decr(key, delta);
}

在上面的示例代码中,我们创建了一个RedisTemplateEx类,继承自RedisTemplate,并添加了incr、decr方法。在这两个方法中,我们使用RedisCallback来执行incrBy、decrBy操作,同时将Redis中的key转换成string类型。

需要注意的是,在使用incr、decr方法时,需要将redis中的key值转换成string类型,并加上前缀“cache_key:”。这是因为RedisTemplate默认的key序列化方式是使用JdkSerializationRedisSerializer,序列化出来的key值是二进制形式,而incr、decr等方法只支持string类型的key。

希望这个回答能够帮到你。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^