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);
    不然会切换失败


  • 相关阅读:
    微信小程序(9)--音频及视频弹幕
    VUE 插槽
    ES6 export
    实现服务端向客户端推消息
    制作镜像语言网站
    xss 防护总结
    一步一步webpack 3
    一步步学习webpack2 配置
    一步步学习webpack 1
    node 插件
  • 原文地址:https://www.cnblogs.com/koenigsea/p/13558550.html
Copyright © 2011-2022 走看看