zoukankan      html  css  js  c++  java
  • redis使用pipelined批量取数据

    在实际的操作中,往往会发生这样的场景,当命令 1 在时刻 T1 发送到 Redis 服务器后,服务器就很快执行完了命令 1,而命令 2 在 T2 时刻却没有通过网络送达 Redis 服务器,这样就变成了 Redis 服务器在等待命令 2 的到来,当命令 2 送达,被执行后,而命令 3 又没有送达 Redis,Redis 又要继续等待,依此类推,这样 Redis 的等待时间就会很长,很多时候在空闲的状态,而问题出在网络的延迟中,造成了系统瓶颈。

    所以在循环大量的从redis中取数据时就会因网络延时造成查询时间过长。

    所以决定试试pipelined批处理,经过业务测试,这种方式确实很快,速度可以提升10倍以上,这里就不写怎么测试的了,有兴趣的可以自行测试,下面写一下如何使用:

    因为我用的是springboot项目所以采用的是redisTemplate操作redis,我取的是hash值,代码如下:

        /**
         * 批量取hash数据
         *
         * @param key 
         * @param hashKeys
         * @param db
         * @return
         */
        public List<Object> hashGetBatch(String Key, List<String> hashKeys, int db) {
            RedisTemplate<Serializable, Object> redisTemplate = getRedisTemplateByDb(db);
            List list = redisTemplate.executePipelined(new RedisCallback<String>() {
                @Override
                public String doInRedis(RedisConnection connection) throws DataAccessException {
                    for (String hashKey : hashKeys) {
                        connection.hGet(Key.getBytes(), hashKey.getBytes());
                    }
                    return null;
                }
            });
            return list;
        }

    大家用的时候可以直接使用redisTemplate,不用传db参数,因为我们是以前老项目,一个项目中需要操作多个db,所以自己封装了个工具类

  • 相关阅读:
    (转) SYSTEM_HANDLE_INFORMATION中ObjectTypeIndex的定义
    表达式求值
    c++程序猿经典面试题(2)
    互联网金融风生水起,合作与创新将成为重要议题
    启发录-打造用户喜爱的产品
    android:“新版飞机大战”源码开源啦!
    java入门之——对象转型
    表达式求值
    cocos2d-x中绘制3D图形--3D ToolKit for cocos2dx实现原理
    滚动载入server端内容——样例
  • 原文地址:https://www.cnblogs.com/wiliamzhao/p/13667955.html
Copyright © 2011-2022 走看看