Skip to content

使用RedisTemplate切换数据库

  • 介绍:在使用 Redis 时,默认有 16 个数据库(编号从 0 到 15),有时候需要根据业务在一个线程中需要同时对不同的数据库进行读写

  • 方式一:使用 LettuceConnectionFactory 动态切换数据库

    java
    LettuceConnectionFactory connectionFactory = (LettuceConnectionFactory) redisTemplate.getConnectionFactory();
    connectionFactory.setDatabase(1);
    redisTemplate.setConnectionFactory(connectionFactory);
    connectionFactory.afterPropertiesSet();
    connectionFactory.resetConnection();
    • 注意:setDatabase 方法是线程不安全的,在并发情况下可能会导致数据混淆。可以通过 synchronized 关键字加锁来解决这个问题
  • 方式二:为每个数据库创建一个 RedisTemplate 实例

    java
    @Configuration
    public class RedisConfig {
        @Value("${redis.host}")
        private String host;
        @Value("${redis.port}")
        private int port;
        @Value("${redis.password}")
        private String password;
        @Value("${redis.dbs}")
        private List<Integer> dbList;
        private static Map<Integer, RedisTemplate<String, Object>> redisTemplateMap = new HashMap<>();
        
        @PostConstruct
        public void initRedisTemplate() {
            for (Integer db : dbList) {
                redisTemplateMap.put(db, createRedisTemplate(db));
            }
        }
        
        /***
        * 创建指定数据库的 RedisTemplate 实例
        */
        private RedisTemplate<String, Object> createRedisTemplate(int db) {
            RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
            config.setHostName(host);
            config.setPort(port);
            config.setDatabase(db);
            config.setPassword(password);
            LettuceConnectionFactory factory = new LettuceConnectionFactory(config);
            factory.afterPropertiesSet();
            RedisTemplate<String, Object> template = new RedisTemplate<>();
            template.setConnectionFactory(factory);
            template.afterPropertiesSet();
            return template;
        }
        
        /***
        * 获取指定数据库的 RedisTemplate 实例
        */
        public RedisTemplate<String, Object> getRedisTemplateByDb(int db) {
            return redisTemplateMap.get(db);
        }
    }

MIT版权,未经许可禁止任何形式的转载