`
youyu4
  • 浏览: 442088 次
社区版块
存档分类
最新评论

Redis管道机制(pipeline)

 
阅读更多

Redis管道机制(pipeline)

 

    Redis的管道机制,其实是为了批量读写而设计的,如果进行多次的读和写数据到redis,每次都建立一个链接,这样是比较消耗资源的,而且也比较忙,于是想到了管道机制(pipeline),只建立一个连接,然后批量执行读或写。

 

 

 

 

插入数据效果

 

      非管道: 数据量 = 2W, 执行时间 = 1分多钟

      管道:     数据量 = 2W, 执行时间 = 1~2秒

 

 

 

 

代码讲解

 

 

    public boolean add(final List<T> list) {
        final boolean result = stringRedisTemplate.execute(new RedisCallback<Boolean>() {
            @Override
            public Boolean doInRedis(final RedisConnection connection)
                    throws DataAccessException {
                for (final T object : list) {
                    final Map<String, String> hash = RedisMapUtil.toMap(object);
                    final Map<byte[], byte[]> hashes = new LinkedHashMap<byte[], byte[]>(hash.size());
                    for (final Map.Entry<String, String> entry : hash.entrySet()) {
                        hashes.put(rawHashKey(entry.getKey()), rawHashValue(entry.getValue()));
                    }
                    final byte[] key = stringRedisTemplate.getStringSerializer().serialize(getDefaultKey(object.getId()));
                    connection.hMSet(key, hashes);
                }
                return true;
            }
        }, false, true);
        return result;
    }

    public boolean addString(final Map<String, String> map) {
        final boolean result = stringRedisTemplate.execute(new RedisCallback<Boolean>() {
            @Override
            public Boolean doInRedis(final RedisConnection connection)
                    throws DataAccessException {
                for (final Map.Entry<String, String> entry : map.entrySet()) {
                    final byte[] key = stringRedisTemplate.getStringSerializer().serialize(entry.getKey());
                    final byte[] value = stringRedisTemplate.getStringSerializer().serialize(entry.getValue());
                    connection.set(key, value);
                }
                return true;
            }
        }, false, true);
        return result;
    }

    @SuppressWarnings("unchecked")
    private <HK> byte[] rawHashKey(final HK hashKey) {
        Assert.notNull(hashKey, "non null hash key required");
        if (stringRedisTemplate.getHashKeySerializer() == null && hashKey instanceof byte[]) {
            return (byte[]) hashKey;
        }

        final RedisSerializer<HK> serializer = (RedisSerializer<HK>) stringRedisTemplate.getHashKeySerializer();
        return serializer.serialize(hashKey);
    }

    @SuppressWarnings("unchecked")
    private <HV> byte[] rawHashValue(final HV value) {
        if (stringRedisTemplate.getHashValueSerializer() == null & value instanceof byte[]) {
            return (byte[]) value;
        }

        final RedisSerializer<HV> serializer = (RedisSerializer<HV>) stringRedisTemplate.getHashValueSerializer();
        return serializer.serialize(value);
    }

 

 

上面是自己写的方法

  • 首先是调用redisTemplate.execute(RedisCallback<T> action, boolean exposeConnection, boolean pipeline),这里注意的是 exposeConnection = false,pipeline = true
  • 然后,第一参数中new了一个内部类,里面的方法接收一个connection,就是我们要批量执行的一个连接
  • 如果要保存的是对象,还是要先将对象转成Map<String, String>,然后在转成byte[],而key是String转byte[]就简单好多
  • 最后,如果是对象就调用connection.hMSet(key, hashes);,如果不是就调用connection.set(key, value);
  • 有一个很特别的地方就是,一直往connection中set内容,最后才一次过执行。

 

 

 

参考

http://xinklabi.iteye.com/blog/2195547

 

分享到:
评论

相关推荐

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

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

    hiredis_example.zip

    《Redis管道技术详解与应用实例》 Redis,作为一款高性能的键值数据库,因其高效的读写性能和丰富的数据结构而广泛应用于缓存、消息队列等场景。在高并发的环境中,为了进一步提升数据处理效率,Redis提供了管道...

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

    发布/订阅是Redis提供的一种实时消息通信机制。通过这个模式,客户端可以作为发布者(Publisher)发送消息到指定的频道(Channel),而其他客户端则作为订阅者(Subscriber)监听并接收这些频道上的消息。 1. 发布...

    StackExchange.Redis-1.2.6

    - **多模式操作**:支持单个命令、管道(pipeline)和事务(transaction)模式,允许一次性执行多个命令,提高效率。 - **异步编程支持**:提供异步API,适应.NET平台的异步编程模型,便于构建高并发的应用。 - *...

    最新版linux redis-6.2.4.tar.gz

    3. 数据操作:可以使用事务(Transaction)、管道(Pipeline)和Lua脚本进行批量操作。 4. 监控与性能:Redis提供`INFO`命令查看服务器状态,`MONITOR`实时监控命令执行,`slowlog`记录慢查询。 总结,Redis 6.2.4...

    redis缓存安装包和教案

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

    Redis测试Demo

    3. **批量操作**:Redis支持管道(Pipeline)机制,允许一次性发送多条命令,减少网络通信的开销。这在需要连续执行多条命令时非常有效。 4. **过期时间设置**:为了实现缓存功能,Redis允许为键设置过期时间,如`...

    Redis 客户端:它提供了丰富的功能,如管道、集群、Lua 脚本支持等,可以方便地与 Redis 数据库进行交互

    **管道(Pipeline)**:在 Redis 中,管道允许一次性发送多条命令,减少了网络延迟,提高了效率。`ioredis` 支持管道操作,用户可以通过创建一个管道对象,然后向其中添加多个命令,最后一次性发送这些命令,实现...

    使用.Net 技术操作Redis缓存技术,对Redis缓存进行存储增删改查等相关操作

    此外,StackExchange.Redis还提供了事务(Transaction)、管道(Pipeline)和订阅/发布(Pub/Sub)等功能,以实现更高效和复杂的操作。例如,你可以使用`Transaction`进行原子操作,确保一组操作的完整性: ```...

    redisUtils工具类的使用

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

    redis代码示例

    4. 使用适当的命令优化读写性能,如批量操作和管道(Pipeline)。 5. 对于敏感数据,应加密后再存储到Redis。 通过这个"redis代码示例",你可以学习如何在实际项目中应用Redis,并掌握基本的Redis操作。在实践中,...

    Redis6视频课程配套资料.zip

    理解这些基础操作后,可以进一步探索高级特性,如管道(Pipeline)提高批量操作效率,Lua脚本实现原子操作,以及Keyspace通知来监控数据库变化。 在持久化方面,RDB定期保存数据库的全量快照,而AOF记录所有写操作...

    redis入门指南第二版

    对于复杂操作,如管道(Pipeline)和事务(Transaction),redis库也提供了方便的封装。 此外,Redis的持久化机制包括RDB(快照)和AOF(Append Only File),确保数据安全。RDB定期保存内存快照,AOF记录每次写...

    定向爬虫:Scrapy与Redis入门

    Scrapy的核心组件包括Spider(爬虫)、Item(数据模型)、Item Pipeline(数据处理管道)和Downloader Middleware(下载器中间件)等,这些组件共同协作,使得开发复杂的爬虫项目变得简单。 Redis,另一方面,是一...

    redis-3.2.1.tar.gz

    - **消息队列**:通过列表或管道(Pipeline)实现简单的消息队列功能。 - **主从复制**:通过复制机制,可以创建多个副本以提高可用性和容错性。 - **哨兵系统**:监控主从节点的状态,当主节点故障时,自动进行...

    redis3.0+jedis

    4. **Pipeline and Multiplexing**: 通过管道和复用连接,提高了批量命令发送的效率,减少了网络延迟。 5. **Connection Pooling**: 提供连接池管理,便于在多线程环境中高效地重用连接,减少资源消耗。 6. **...

    redis in action java代码

    《Redis in Action》是一本深入介绍Redis的书籍,它涵盖了Redis的基本概念、数据结构以及如何在实际项目中高效地使用Redis。这本书通过丰富的实例和Java代码来解释Redis的各种功能,帮助开发者更好地理解和应用Redis...

    redis2.9.0+pool2.2

    - **pipeline**:为了优化网络通信,Jedis引入了管道(pipelining)机制,允许一次性发送多个命令,减少网络往返次数。 **Apache Commons Pool 2.2** Apache Commons Pool是Java的一个对象池库,它提供了一种通用的...

    高性能内存数据库Redis(基础篇).pdf

    Redis的管道技术(Pipeline)允许客户端将一系列命令一次性发送到Redis服务器,然后一次性读回所有命令的执行结果,从而减少了网络往返延时时间,提高了性能。事务(Transaction)则保证了一组命令的原子性执行,...

Global site tag (gtag.js) - Google Analytics