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服务是一种C/S模型,提供请求-响应式协议的TCP服务,所以当客户端...以下是对 Redis管道机制的一个学习记录 Pipeline简介 Redis客户端执行一条命令: 发送命令 命令排队 执行命令 返回结果 其中发
redis订阅机制,一方面推送消息,另一方面同时接收消息。
基于Redis Cluster打造的缓存系统。...本文尝试分享在运维过程中踩过的Redis Rehash机制的一些坑以及我们的解决方案,其中在高负载情况下物理机发生丢包的现象和解决方案已经写成博客。感兴趣的同学可以参考:
Redis-PipeLine批量导入.docx
本篇文章主要介绍了Java使用Pipeline对Redis批量读写(hmset&hgetall),具有一定的参考价值,有兴趣的可以了解一下。
Redis介绍与实现机制.PPT
主要给大家介绍了关于Redis利用Pipeline加速查询速度的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Redis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
redis pipleLine
简单介绍 redis pipeline 的机制,结合一段实例说明pipeline 在提升吞吐量方面发生的效用。 案例背景 应用系统在数据推送或事件处理过程中,往往出现数据流经过多个网元; 然而在某些服务中,数据操作对redis 是强...
Redis中的管道(PipeLine)特性:简述一下就是,Redis如何从客户端一次发送多个命令,服务端到客户端如何一次性响应多个命令。 Redis使用的是客户端-服务器模型和请求/响应协议的TCP服务器,这就意味着一个请求要有...
秒杀是电商系统非常常见的...本教程采用:redis中list类型达到令牌机制完成秒杀。用户抢redis中的令牌,抢到 令牌的用户才能进行支付,支付成功之后可以生成订单,如果一定时间之内没有支 付那么就由定时任务来归还令牌
由于项目中需要使用批量插入功能, 所以在网上查找到了Redis 批量插入可以使用pipeline来高效的插入, 示例代码如下: String key = "key"; Jedis jedis = new Jedis("xx.xx.xx.xx"); Pipeline p = jedis.pipelined();...
主要介绍了详解redis大幅性能提升之使用管道(PipeLine)和批量(Batch)操作 ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
redis 安装 主从配置 redis 选举机制说明,
kettle如何3秒内写入100万条数据到Redis https://blog.csdn.net/huryer/article/details/106889792
Redis支持跨进程发布订阅机制。代码实现了key过期的notification.
今天小编就为大家分享一篇关于redis锁机制介绍与实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
RedisRemotePipelinedProvider:在管道(独立线程池)中发送命令可以大大提高吞吐量。 RedisCachedProvider:将查询结果存储在本地缓存中,因此普通访问已在本地存储,无需获取。 RedisSentinelPool:Redis哨兵的高...