自定义 RedisTemplate

2023-12-10  本文已影响0人  Tinyspot

1. 示例

@RestController
@RequestMapping("/redis/manager")
public class RedisManagerController {

    @Resource
    private RedisTemplateManager redisTemplateManager;

    @RequestMapping("/all")
    public String getAllKey() {
        return JSON.toJSONString(redisTemplateManager.getRedisTemplate().keys("*"));
    }

    @GetMapping("/setValue")
    public String setValue(String key, String value){
        redisTemplateManager.getRedisTemplate().opsForValue().set(key, value);
        return "success";
    }

    @RequestMapping("/getValue")
    public String getValue(String key) {
        return redisTemplateManager.getRedisTemplate().opsForValue().get(key).toString();
    }

    @RequestMapping("/opsForZSet")
    public String opsForZSet(String key) {
        ZSetOperations zSetOperations = redisTemplateManager.getRedisTemplate().opsForZSet();
        zSetOperations.add(key, "aaa", 1);
        zSetOperations.add(key, "bbb", 2);
        zSetOperations.add(key, "ccc", 3);

        Set range = zSetOperations.range(key, 0, zSetOperations.size(key));
        return JSON.toJSONString(range);
    }

}

1.1 RedisTemplate 配置

@Configuration
public class RedisConfig {
    @Bean(name = "redisTemplate")
    public RedisTemplate<String, Object> getRedisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(factory);

        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(stringRedisSerializer);
        redisTemplate.setValueSerializer(stringRedisSerializer);

        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

    @Bean(name = "redisTemplateNew")
    public RedisTemplate<String, Object> getRedisTemplateNew(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(factory);

        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(stringRedisSerializer);
        redisTemplate.setValueSerializer(stringRedisSerializer);

        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

2. RedisTemplateManager 类

2.1 RedisTemplateManager

@Component
public class RedisTemplateManager {

    @Resource
    private RedisTemplate<String, String> redisTemplate;
    @Resource
    private RedisTemplate<String, String> redisTemplateNew;

    private LogRedisTemplate logRedisTemplateNew;
    private LogRedisTemplate logRedisTemplateOld;

    public RedisTemplate<String, String> getRedisTemplate() {
        return getNewRedisTemplate();
    }

    private RedisTemplate<String, String> getNewRedisTemplate() {
        if (logRedisTemplateNew == null) {
            logRedisTemplateNew = new LogRedisTemplate(redisTemplateNew, "new");
        }
        return logRedisTemplateNew;
    }

    private RedisTemplate<String, String> getOldRedisTemplate() {
        if(logRedisTemplateOld == null){
            logRedisTemplateOld = new LogRedisTemplate(redisTemplate,"old");
        }
        return logRedisTemplateOld;
    }
}

2.2 LogRedisTemplate

/**
 * 参考 RedisTemplate 类,需要重写 RedisOperations 的方法
 */
public class LogRedisTemplate extends RedisTemplate<String, String> implements RedisOperations<String, String> {

    private final String tag;
    private final RedisTemplate<String, String> redisTemplate;
    private LogZSetOperations logZSetOperations;

    public LogRedisTemplate(RedisTemplate<String, String> redisTemplate, String tag) {
        this.redisTemplate = redisTemplate;
        this.tag = tag;
    }

    @Override
    public Set<String> keys(String pattern) {
        return redisTemplate.keys(pattern);
    }

    @Override
    public ValueOperations<String, String> opsForValue() {
        return redisTemplate.opsForValue();
    }

    @Override
    public ZSetOperations<String, String> opsForZSet() {
        if(logZSetOperations == null){
            logZSetOperations = new LogZSetOperations(redisTemplate.opsForZSet(),tag);
        }
        return logZSetOperations;
    }

    @Override
    public RedisSerializer<?> getKeySerializer() {
        return redisTemplate.getKeySerializer();
    }

    @Override
    public RedisSerializer<?> getValueSerializer() {
        return redisTemplate.getValueSerializer();
    }

    // ...
}

2.3 处理 Zset 类型

public class LogZSetOperations implements ZSetOperations<String, String> {

    private final ZSetOperations<String, String> zsetOperations;
    private final String tag;

    public LogZSetOperations(ZSetOperations<String, String> zsetOperations, String tag) {
        this.zsetOperations = zsetOperations;
        this.tag = tag;
    }

    @Override
    public Boolean add(String key, String value, double score) {
        return zsetOperations.add(key, value, score);
    }

    @Override
    public Set<String> range(String key, long start, long end) {
        return zsetOperations.range(key, start, end);
    }

    @Override
    public Long size(String key) {
        return zsetOperations.size(key);
    }

    // ...
}
上一篇 下一篇

猜你喜欢

热点阅读