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管道(Pipeline)机制是Redis为了优化客户端与服务器之间的通信效率而设计的一种技术。传统的请求-响应模式下,客户端每发送一个命令,都需要等待服务器的响应,这种方式在处理大量连续命令时会导致显著的延迟...
《Redis管道技术详解与应用实例》 Redis,作为一款高性能的键值数据库,因其高效的读写性能和丰富的数据结构而广泛应用于缓存、消息队列等场景。在高并发的环境中,为了进一步提升数据处理效率,Redis提供了管道...
发布/订阅是Redis提供的一种实时消息通信机制。通过这个模式,客户端可以作为发布者(Publisher)发送消息到指定的频道(Channel),而其他客户端则作为订阅者(Subscriber)监听并接收这些频道上的消息。 1. 发布...
以及在处理大量数据时,考虑使用管道(Pipeline)批量操作以减少网络通信开销。 综上所述,Redis是一个功能强大的键值存储系统,其持久化、缓存、数据结构和高级特性使其在各种应用场景中都有出色表现。通过深入...
3. **批量操作**:Redis支持管道(Pipeline)机制,允许一次性发送多条命令,减少网络通信的开销。这在需要连续执行多条命令时非常有效。 4. **过期时间设置**:为了实现缓存功能,Redis允许为键设置过期时间,如`...
**管道(Pipeline)**:在 Redis 中,管道允许一次性发送多条命令,减少了网络延迟,提高了效率。`ioredis` 支持管道操作,用户可以通过创建一个管道对象,然后向其中添加多个命令,最后一次性发送这些命令,实现...
此外,StackExchange.Redis还提供了事务(Transaction)、管道(Pipeline)和订阅/发布(Pub/Sub)等功能,以实现更高效和复杂的操作。例如,你可以使用`Transaction`进行原子操作,确保一组操作的完整性: ```...
RedisUtils工具类是Java开发中常见的一种封装了Redis...在处理大量数据时,考虑使用管道(pipeline)或者事务(transaction)来提高性能。最后,为了防止内存泄漏,应该及时清理不再使用的键,或者设定合理的过期时间。
- **多模式操作**:支持单个命令、管道(pipeline)和事务(transaction)模式,允许一次性执行多个命令,提高效率。 - **异步编程支持**:提供异步API,适应.NET平台的异步编程模型,便于构建高并发的应用。 - *...
3. 数据操作:可以使用事务(Transaction)、管道(Pipeline)和Lua脚本进行批量操作。 4. 监控与性能:Redis提供`INFO`命令查看服务器状态,`MONITOR`实时监控命令执行,`slowlog`记录慢查询。 总结,Redis 6.2.4...
4. 使用适当的命令优化读写性能,如批量操作和管道(Pipeline)。 5. 对于敏感数据,应加密后再存储到Redis。 通过这个"redis代码示例",你可以学习如何在实际项目中应用Redis,并掌握基本的Redis操作。在实践中,...
理解这些基础操作后,可以进一步探索高级特性,如管道(Pipeline)提高批量操作效率,Lua脚本实现原子操作,以及Keyspace通知来监控数据库变化。 在持久化方面,RDB定期保存数据库的全量快照,而AOF记录所有写操作...
对于复杂操作,如管道(Pipeline)和事务(Transaction),redis库也提供了方便的封装。 此外,Redis的持久化机制包括RDB(快照)和AOF(Append Only File),确保数据安全。RDB定期保存内存快照,AOF记录每次写...
Scrapy的核心组件包括Spider(爬虫)、Item(数据模型)、Item Pipeline(数据处理管道)和Downloader Middleware(下载器中间件)等,这些组件共同协作,使得开发复杂的爬虫项目变得简单。 Redis,另一方面,是一...
- **消息队列**:通过列表或管道(Pipeline)实现简单的消息队列功能。 - **主从复制**:通过复制机制,可以创建多个副本以提高可用性和容错性。 - **哨兵系统**:监控主从节点的状态,当主节点故障时,自动进行...
4. **Pipeline and Multiplexing**: 通过管道和复用连接,提高了批量命令发送的效率,减少了网络延迟。 5. **Connection Pooling**: 提供连接池管理,便于在多线程环境中高效地重用连接,减少资源消耗。 6. **...
《Redis in Action》是一本深入介绍Redis的书籍,它涵盖了Redis的基本概念、数据结构以及如何在实际项目中高效地使用Redis。这本书通过丰富的实例和Java代码来解释Redis的各种功能,帮助开发者更好地理解和应用Redis...
- **pipeline**:为了优化网络通信,Jedis引入了管道(pipelining)机制,允许一次性发送多个命令,减少网络往返次数。 **Apache Commons Pool 2.2** Apache Commons Pool是Java的一个对象池库,它提供了一种通用的...
Redis的管道技术(Pipeline)允许客户端将一系列命令一次性发送到Redis服务器,然后一次性读回所有命令的执行结果,从而减少了网络往返延时时间,提高了性能。事务(Transaction)则保证了一组命令的原子性执行,...