spring-data-redis進行選庫操作

前言

spring-data-redis對reids基本操作進行很好的封裝,操作時候簡單便捷,但是spring-data-redis在初始化選redis某個庫后不能進行修改,如果想以數(shù)據(jù)庫區(qū)分業(yè)務邏輯需要進行選庫操作

配置

  • 為了簡單配置,在springboot的基礎(chǔ)上配置reids操作

在springboot配置的基礎(chǔ)上引入spring-data-redis,不同版本的springboot引入的spring-boot-starter-data-redis可能不同,具體參看官方文檔。

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
        <version>1.5.9.RELEASE</version>
    </dependency>

在application.yml或者application.properties中配置基本的連接信息如下:

spring:
  redis:
    database: 0
    host: 127.0.0.1
    password:
    pool:
      max-active: 8
      max-wait: 5000
      max-idle: 8
      min-idle: 3
    timeout: 5000

之后自定義RedisTemplate繼承spring-data-redis的StringRedisTemplate,定義REDIS_DB_INDEX為ThreadLocal類型,每個線程選庫操作互不影響。


    public static ThreadLocal<Integer> REDIS_DB_INDEX = new ThreadLocal<Integer>(){
        @Override
        protected Integer initialValue() {
            return 0;
        }
    };

    @Override
    protected RedisConnection preProcessConnection(RedisConnection connection, boolean existingConnection) {
        try {
            Integer dbIndex = REDIS_DB_INDEX.get();
            //如果設置了dbIndex
            if (dbIndex != null) {
                if (connection instanceof JedisConnection) {
                    if (((JedisConnection) connection).getNativeConnection().getDB().intValue() != dbIndex) {
                        connection.select(dbIndex);
                    }
                } else {
                    connection.select(dbIndex);
                }
            } else {
                connection.select(0);
            }
        } finally {
            REDIS_DB_INDEX.remove();
        }
        return super.preProcessConnection(connection, existingConnection);
    }
}

注冊自定義的RedisTemplate到Bean容器中

@Configuration
public class RedisConfig {


    @Bean
    public RedisSerializer fastJson2JsonRedisSerializer() {
        return new FastJson2JsonRedisSerializer<Object>(Object.class);
    }

    @Bean
    public RedisTemplate initRedisTemplate(RedisConnectionFactory redisConnectionFactory, RedisSerializer fastJson2JsonRedisSerializer) throws Exception {
        RedisTemplate redisTemplate = new RedisTemplate();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        redisTemplate.setValueSerializer(fastJson2JsonRedisSerializer);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

上述代碼使用FastJson座位redis默認序列化工具,配置FastJson序列化需要自定義序列化器

public class FastJson2JsonRedisSerializer<T> implements RedisSerializer<T> {

    public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");

    private Class<T> clazz;

    public FastJson2JsonRedisSerializer(Class<T> clazz) {
        super();
        this.clazz = clazz;
    }

    @Override
    public byte[] serialize(T t) throws SerializationException {
        if (t == null) {
            return new byte[0];
        }
        return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET);
    }

    @Override
    public T deserialize(byte[] bytes) throws SerializationException {
        if (bytes == null || bytes.length <= 0) {
            return null;
        }
        String str = new String(bytes, DEFAULT_CHARSET);

        return (T) JSON.parseObject(str, clazz);
    }

}

之后便可以進行選庫操作:

    RedisTemplate.REDIS_DB_INDEX.set(10);
    redisTemplate.opsForValue().set("author","stevejobson");

當然最好自己寫一份RedisServcie封裝上述操作。

注意:

Redis進行選庫操作并不能提高運行效率,不過如果業(yè)務量過大,可以將不同模塊的不同業(yè)務的reids存儲存放到不同庫中,有效的區(qū)分數(shù)據(jù)

當然強烈建議在設計redis key的時候進行能的對業(yè)務進行區(qū)分,便于后期維護

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,533評論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,261評論 6 342
  • 摘要: 原創(chuàng)出處 www.bysocket.com 「泥瓦匠BYSocket 」歡迎轉(zhuǎn)載,保留摘要,謝謝! 『產(chǎn)品...
    子木聊出海閱讀 1,651評論 5 50
  • 子曰:“唯仁者能好人,能惡人?!?孔子說:“只有仁人才能正確喜愛人,厭惡人?!?仁人少矣。
    石埭生閱讀 289評論 0 1
  • 昨天有一則新聞,說的是在昨天清晨,杭州某高檔小區(qū)某戶起火,消防隊員現(xiàn)場搜出4名傷者,但將其送往醫(yī)院后,均搶救...
    葡萄樹的好枝子閱讀 318評論 0 3

友情鏈接更多精彩內(nèi)容