`
kavy
  • 浏览: 888065 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

使用redis管道(pipeline)实现批量查询,批量修改

 
阅读更多

 Pipeline:“管道”,和很多设计模式中的“管道”具有同样的概念,pipleline的操作,将明确client与server端的交互,都是“单向的”:你可以将多个command,依次发给server,但在此期间,你将无法获得单个command的响应数据,此后你可以关闭“请求”,然后依次获取每个command的响应结果。

 

    从简单来说,在IO操作层面,对于client而言,就是一次批量的连续的“write”请求,然后是批量的连续的“read”操作。其实对于底层Socket-IO而言,对于client而言,只不过是多次write,然后一次read的操作;对于server端,input通道上read到数据之后,就会立即被实施,也会和非pipeline一样在output通道上输出执行的结果,只不过此时数据会被阻塞在网络缓冲区上,直到client端开始read或者关闭链接。

 

redisService:

 

public interface RedisService {

    /**

     * 根据 redis  的key的集合批量查询对应存在数据

     * @param keys

     * @param useParallel  是否使用parallel 在没有顺序要求的时候,提高效率,true为表示使用,false 表示不用,默认为true

     * @return

     */

    Map<String,Object> batchQueryByKeys(List<String> keys,Boolean useParallel);

 

 

    /**

     * 使用管道的方式,批量添加数据

     * @param keyValueMap

     * @param expire 过期时间

     * @return

     */

    List<Object> batchPutInPipelined(Map<String,Object> keyValueMap,long expire);

 

    /**

     * batch increment an integer value in pipelined

     *

     * @param  entityList

     *

     * @return

     *

     */

    List<MapEntity> batIncByPipelined(List<MapEntity> entityList);

 

 

}

AbstractRedisService 抽象类

 

public abstract class AbstractRedisService implements RedisService{

    private static final Logger logger = LoggerFactory.getLogger(AbstractRedisService.class);

    protected abstract RedisTemplate getRedisTemplate();

 

    @Override

    public Boolean expire(String key, long timeout, TimeUnit timeUnit) {

        return getRedisTemplate().expire(key,timeout,timeUnit);

    }

 

 

    @Override

   public Map<String,Object> batchQueryByKeys(List<String> keys,Boolean useParallel){

        if(null == keys || keys.size() == 0 ){

            return null;

        }

 

        if(null == useParallel){

            useParallel = true;

        }

 

        List<Object> results = getRedisTemplate().executePipelined(

                new RedisCallback<Object>() {

                    public Object doInRedis(RedisConnection connection) throws DataAccessException {

                        StringRedisConnection stringRedisConn = (StringRedisConnection)connection;

                        for(String key:keys) {

                            stringRedisConn.get(key);

                        }

                        return null;

                    }

                });

        if(null == results || results.size() == 0 ){return null;}

 

        Map<String,Object> resultMap  =  null;

 

        if(useParallel){

 

            Map<String,Object> resultMapOne  = Collections.synchronizedMap(new HashMap<String,Object>());

 

            keys.parallelStream().forEach(t -> {

                resultMapOne.put(t,results.get(keys.indexOf(t)));

            });

 

            resultMap = resultMapOne;

 

        }else{

 

            Map<String,Object> resultMapTwo  = new HashMap<>();

 

            for(String t:keys){

                resultMapTwo.put(t,results.get(keys.indexOf(t)));

            }

 

            resultMap = resultMapTwo;

        }

 

        return  resultMap;

 

    }

 

    @Override

   public List<Object> batchPutInPipelined(Map<String,Object> keyValueMap,long expire){

 

        List<Object> results = getRedisTemplate().executePipelined(

                new RedisCallback<Object>() {

                    public Object doInRedis(RedisConnection connection) throws DataAccessException {

                        StringRedisConnection stringRedisConn = (StringRedisConnection)connection;

                        for(String key:keyValueMap.keySet()) {

                            if(null != keyValueMap.get(key)){

                                stringRedisConn.set(key, keyValueMap.get(key).toString());

                                stringRedisConn.expire(key,expire);

                            }

                        }

                        return null;

                    }

                });

 

        return  results;

 

    }

 

 

    @Override

    public List<MapEntity> batIncByPipelined(List<MapEntity> params){

 

        List<Object> results = getRedisTemplate().executePipelined(

                new RedisCallback<Object>() {

                    public Object doInRedis(RedisConnection connection) throws DataAccessException {

                        StringRedisConnection stringRedisConn = (StringRedisConnection)connection;

                        for(MapEntity entity:params) {

                            if(null != entity){

                                stringRedisConn.incrBy(entity.getKey(), entity.getValue());

                            }

                        }

                        return null;

                    }

                });

 

        List<MapEntity> resultList  = Lists.newArrayList();

 

        for(MapEntity entity:params){

            resultList.add(new MapEntity(entity.getKey(),(Long)results.get(params.indexOf(entity))));

        }

 

 

        return  resultList;

 

    }

}

 RedisServiceImpl 实现类

 

public class RedisServiceImpl extends AbstractRedisService  {

    private RedisTemplate redisTemplate;

 

    public RedisServiceImpl(RedisTemplate redisTemplate) {

        this.redisTemplate = redisTemplate;

    }

 

    @Override

    protected RedisTemplate getRedisTemplate() {

        return redisTemplate;

    }

}

补充: 具体RedisTemplate 替代 jedis 方法 点这里 https://www.cnblogs.com/yinfengjiujian/p/9084711.html 

————————————————

版权声明:本文为CSDN博主「代码也文艺」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_37107280/java/article/details/84567631

分享到:
评论

相关推荐

    Redis-PipeLine批量导入.docx

    总的来说,Redis Pipeline 批量导入是一种高效的数据导入方式,通过预处理命令文件并使用 Redis 协议格式,可以确保数据的准确导入并减少网络延迟。同时,结合 MySQL 数据库的特性,可以方便地将数据库数据转换为 ...

    详解Java使用Pipeline对Redis批量读写(hmset&hgetall)

    Java使用Pipeline对Redis进行批量读写,主要是针对Redis的hmset和hgetall操作,能够显著提高性能。在常规操作中,每次客户端向Redis发送一个命令,都需要等待服务器的响应,这种模式在网络延迟较大的情况下效率较低...

    详解redis大幅性能提升之使用管道(PipeLine)和批量(Batch)操作

    本文将深入探讨如何利用Redis的管道(PipeLine)和批量(Batch)操作来显著提高数据处理速度。 首先,让我们回顾一下问题的来源。在示例代码中,为了记录商品购买用户,使用了`SADD`命令向Redis的Set中添加元素。...

    Redis基础学习之管道机制详析

    Redis管道(Pipeline)机制是Redis为了优化客户端与服务器之间的通信效率而设计的一种技术。传统的请求-响应模式下,客户端每发送一个命令,都需要等待服务器的响应,这种方式在处理大量连续命令时会导致显著的延迟...

    如何高效地向Redis插入大量的数据(推荐)

    测试结果显示,Redis管道模式通常比单独的Shell脚本方式更快,因为它避免了网络往返的开销,实现了批量处理。 总结来说,当需要向Redis插入大量数据时,应优先考虑使用管道模式,它能显著提高数据导入速度。如果...

    python使用pipeline批量读写redis的方法

    正好最近有个需求(需要在秒级取值1000+的数据),如果对于传统的单词取值,循环取值,消耗实在是大,有小伙伴可能考虑到多线程,但这并不是最好的解决方案,这里考虑到了redis特有的功能pipeline管道功能。...

    redis2-nginx-module-0.15

    - **管道**:使用 Redis 的 Pipeline 技术,批量发送命令,减少网络延迟。 3. **配置使用** 在 NGINX 的配置文件中,通过 `set $redis_key "your_key"` 设置键名,然后使用 `redis2_query` 指令执行 Redis 命令。...

    redisUtils工具类的使用

    RedisUtils工具类是Java开发中常见的一种封装了Redis...在处理大量数据时,考虑使用管道(pipeline)或者事务(transaction)来提高性能。最后,为了防止内存泄漏,应该及时清理不再使用的键,或者设定合理的过期时间。

    java 对Redis的导入和导出

    为了提高数据导入导出的效率,可以使用批量操作,如`mset()`和`hmset()`,或者在处理大量数据时开启管道(Pipeline)模式。 5. **安全考虑**: 在实际操作中,应避免在生产环境中直接使用`keys(*)`命令,因为它可能...

    Redis有win和linux版本

    Jedis还支持更复杂的操作,如批量操作、管道(Pipeline)、脚本执行(Lua)等,可以根据具体需求进行使用。 在使用Redis时,需要注意以下几个关键知识点: 1. **持久化**:Redis可以通过RDB或AOF两种方式实现数据持久化...

    hiredis_example.zip

    本篇文章将围绕Redis管道的原理、优势以及如何通过"hiredis_example.zip"中的代码实现进行深入探讨。 一、Redis管道技术介绍 Redis管道是一种批量处理命令的技术,允许客户端一次性发送多个命令到服务器,服务器则...

    redis 读写性能测试代码

    2. **Pipeline与Transaction**:为了提高批量操作的性能,Redis支持Pipeline(管道)和Transaction(事务)。Pipeline允许一次性发送多个命令,减少网络往返时间;Transaction则确保一组命令的原子性执行。测试时,...

    java开发环境使用redisjar包

    同时,Jedis也支持事务、管道(Pipeline)和脚本(Lua Scripting),这些特性可以帮助优化批量操作的性能。 总的来说,通过Jedis这个Java客户端,开发者可以方便地在Java应用中集成和利用Redis的强大功能,提升应用...

    java中使用redis需要的jar包

    例如,可以使用`multi()`开始一个事务,`exec()`提交事务,`subscribe()`订阅频道,`pipeline()`创建管道以批量执行命令。 在实际项目中,我们可能还需要处理异常,确保代码健壮性,例如处理ConnectionException、...

    redis缓存安装包和教案

    以及在处理大量数据时,考虑使用管道(Pipeline)批量操作以减少网络通信开销。 综上所述,Redis是一个功能强大的键值存储系统,其持久化、缓存、数据结构和高级特性使其在各种应用场景中都有出色表现。通过深入...

    Spring mvc整合redis实例(redis连接池)

    为了支持事务,可以使用`RedisTemplate`的`executePipelined`方法,它可以批量执行命令并确保原子性。 ```java @Autowired private RedisTemplate, Object&gt; redisTemplate; @Transactional public void ...

    redis实操代码 发布/订阅、Lua、PipeLine等

    Redis是一种高性能的键值对数据存储系统,常用于缓存、数据库和消息中间件等场景。在本主题中,我们将深入探讨Redis...Pipeline则优化了批量操作的效率。熟练掌握这些特性,能让你在实际开发中更好地利用Redis的优势。

Global site tag (gtag.js) - Google Analytics