zoukankan      html  css  js  c++  java
  • Springboot Redis SwitchDB + SwapDB

    冷启动数据环境中,流程如下:

    Start ->
        FlushDB ->
            LOAD Data from Oracle/MySQL ->
                Insert Data into Redis ->
                    End

    FlushDB这个时间点a,完成LOAD时间点b,完成Insert 时间点c。

    也就是说在(c - a)这么长的时间内,用户是无法获取数据的,即数据空白期。

    这是很影响用户体验的。

    我们改善一下流程:

    Start ->
        Select DB-sub ->
            FlushDB-sub ->
                LOAD Data from Oracle/MySQL ->
                    Insert Data into Redis DB-sub ->
                        SwapDB main & sub ->
                            END 
    

    这样的话,我们只在最后一个swap的过程中会有一个数据空白期,但是swap执行速度极快,也就是说,空白期几乎没有。

    用Springboot实现,则会使用到Redis的Select以及Swapdb

    SELECT int
    SWAPDB int int 

    pom.xml:

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

    配置类:

    @Configuration
    public class RedisConfig {
        private final LettuceConnectionFactory factory;
    
        public RedisConfig(LettuceConnectionFactory factory) {
            this.factory = factory;
        }
    
        @Bean
        public RedisTemplate<String, Object> redisTemplate() {
            factory.setShareNativeConnection(false);
            RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
            redisTemplate.setKeySerializer(new StringRedisSerializer());
            redisTemplate.setHashKeySerializer(new StringRedisSerializer());
            redisTemplate.setHashValueSerializer(new StringRedisSerializer());
            redisTemplate.setValueSerializer(new StringRedisSerializer());
            redisTemplate.setConnectionFactory(factory);
            return redisTemplate;
        }
    
        @Bean
        public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) {
            return redisTemplate.opsForHash();
        }
    
        @Bean
        public ValueOperations<String, String> valueOperations(RedisTemplate<String, String> redisTemplate) {
            return redisTemplate.opsForValue();
        }
    
        @Bean
        public ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) {
            return redisTemplate.opsForList();
        }
    
        @Bean
        public SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) {
            return redisTemplate.opsForSet();
        }
    
        @Bean
        public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) {
            return redisTemplate.opsForZSet();
        }
    
    }

    功能类:

    public boolean insert() {
            stringRedisTemplate.executePipelined((RedisCallback<Object>) redisConnection -> {
                StringRedisConnection stringRedisConn = (StringRedisConnection) redisConnection;
                logger.info("[REDIS] Switching to DB[" + subDatabase + "]");
                stringRedisConn.select(subDatabase);
                stringRedisConn.flushDb();       
                /** insert */
                stringRedisConn.set(key,value); 
                return null;
            });
            return true;
        }        
    

    swapDB 只能用Jedis实现:

        public void dbSwap() {
            Jedis jedis = new Jedis(host, port);
            jedis.auth(password);
            logger.info("[REDIS] Swapping DB[" + database + "] and DB[" + subDatabase + "]");
            jedis.swapDB(database, subDatabase);
        }
    

      

    注意一下,为了selectdb,在配置类中

    factory.setShareNativeConnection(false);
    不然会切换失败


  • 相关阅读:
    python等缩进语言的词法分析实现
    收集Android程序测试代码覆盖率
    对语言之争的看法
    关于asmlinkage
    洛谷 P4171 [JSOI2010] 满汉全席(2sat)
    Codeforces Round #748 (Div. 3)解题报告
    洛谷 P1712 [NOI2016] 区间(尺取法、线段树)
    洛谷 P4782 【模板】2SAT 问题
    洛谷 P3513 [POI2011]KONConspiracy(2sat方案数)
    梦见和深爱的女孩牵着手,竟然从梦中幸福惊醒,醒后一片悲伤~~
  • 原文地址:https://www.cnblogs.com/koenigsea/p/13558550.html
Copyright © 2011-2022 走看看