`

Redis在java中批量操作数据的更新

 
阅读更多

背景:同事说Redis在插入数据时,同样存在插入速度慢,只是get获取时快,通过做实验,完全不是那么回事,同事说的话也根本没有找到有关官方的说法,仅仅是凭几个简单的操作,应该是不能作为依据的。

今天贴出几个批量操作数据的方法(测试的环境是局域网-单机, Linux要快过Windows):

windows:

redis_version:2.8.12
redis_mode:standalone
os:Windows
arch_bits:64
multiplexing_api:winsock_IOCP 

 

 Linux:

redis_version:2.6.17
redis_mode:standalone
os:Linux 3.10.42-52.145.amzn1.x86_64 x86_64
arch_bits:64

(redis_version:2.8.17
redis_mode:standalone
os:Linux 2.6.32-33-server x86_64
arch_bits:64)

这里使用redis的数据类型:hashs 和 lists

一次性插入100000条数据消耗时间,windows在3秒以内,linux在2秒以内。

 

 lists数据类型的操作:

/**
	 * 从尾部开始插入数据(删除并插入新的数据) 队列, 先进先出
	 * @param db
	 * @param key
	 * @param arr
	 * @return
	 */
	public static boolean rpush(RedisAPIDao.Db db, String key, String[] arr){
		JedisPool pool = null;
		Jedis jedis = null;
		boolean ret = false;
		try {
			pool = getPool(key);
			jedis = pool.getResource();
			jedis.select(db.toIntValue());
			if (null != arr && arr.length > 0) {
				jedis.del(key);
				long value = jedis.rpush(key, arr);
				if (value > 0 ) {
					ret = true;
				}
			}

		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			logger.error(e.getMessage(), e);
			ret = false;
		} finally {
			returnResource(pool, jedis);
		}

		return ret;
	}

 hashs数据操作:

/**
	 * 使用通常的方法,hmset hash
	 * @param db
	 * @param key
	 * @param map
	 * @return
	 */
	public static boolean hsetMap(RedisAPIDao.Db db, String key, Map<String, String> map) {

		JedisPool pool = null;
		Jedis jedis = null;
		try {
			pool = getPool(key);
			jedis = pool.getResource();
			jedis.select(db.toIntValue());
			jedis.hmset(key, map);

		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			logger.error(e.getMessage(), e);
		} finally {
			returnResource(pool, jedis);
		}

		return true;
	}
	
	/**
	 * 使用批量方式操作Pipeline  hash
	 * @param db
	 * @param key
	 * @param map
	 * @return
	 */
	public static boolean hmset(RedisAPIDao.Db db, String key, Map<String, String> map) {
		JedisPool pool = null;
		Jedis jedis = null;
		try {
			pool = getPool(key);
			jedis = pool.getResource();
			jedis.select(db.toIntValue());
			Pipeline pipeline = jedis.pipelined();
			pipeline.hmset(key, map);
			pipeline.sync();

		} catch (Exception e) {
			pool.returnBrokenResource(jedis);
			logger.error(e.getMessage(), e);
		} finally {
			returnResource(pool, jedis);
		}

		return true;
	}

 

 hash的两种方式效果差不多(Pipeline批量操作方式稍快)。

 

需要jar: jedis-2.4.2.jar

<dependency>
	<groupId>redis.clients</groupId>
	<artifactId>jedis</artifactId>
	<version>2.4.2</version>
</dependency>

 

 

分享到:
评论

相关推荐

    redis集群批量插入

    java连接redis集群批量String类型插入

    spring-data-redis支持批量操作

    1、基于1.8.0的基础上提供批量的数据操作包括get set del hmget hmset方法 2、使用方法如下: public List&lt;V&gt; pipelineGet(Set&lt;K&gt; keys){ return rt.opsForPipeline().get(keys); } public void pipelineSet...

    Java 读取写Redis里的数据

    启动时,现将自己电脑内的Redis运行起来。里面有测试类,可选择性进行测试不同数据类型的读写方式。

    redis批量删除以指定内容开头的key

    用java写了个redis批量删除以指定内容开头的key,使用时只需要修改config.json中的配置(host,port,database,delKey:指定的key值开头),然后java -jar demo.jar运行即可

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

    本篇文章主要介绍了如何高效地向Redis插入大量的数据,现在分享给大家,感兴趣的小伙伴们可以参考一下。

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

    本篇文章主要介绍了Java使用Pipeline对Redis批量读写(hmset&hgetall),具有一定的参考价值,有兴趣的可以了解一下。

    Java - Redis操作的工具类RedisUtil

    内容概要:主要把一些常用的redis操作使用redisTemplate包装为redis命令名的方式,包括redis的各种数据类型的操作方法,如,批量删除key;序列化key;查找匹配的key;将当前数据库的 key 移动到给定的数据库 db 当中...

    Redis如何优雅的删除特定前缀key

    Redis中没有批量删除特定前缀key的指令,但我们往往需要根据前缀来删除,那么究竟该怎么做呢?可能你一通搜索后会得到下边的答案 redis-cli --raw keys "ops-coffee-*" | xargs redis-cli del 直接在linux下通过...

    JAVA上百实例源码以及开源项目源代码

    像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 内容...

    JAVA上百实例源码以及开源项目

    像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 内容...

    2019年 Redis从入门到高可用 分布式实战教程

    10-20 批量操作优化.mp4 10-2 集群伸缩原理.mp4 10-19 多节点操作命令.mp4 10-18 整合spring-2.mp4 10-17 整合spring-1.mp4 10-16 JedisCluster基本使用.mp4 10-15 smart客户端JedisCluster-目录.mp4 10-14 ...

    Excel_To_DB:一款将Excel表格中的数据导入至数据库中的小工具,SpringBoot+EasyPoi+Redis消息队列实现Excel批量异步导入数据库

    Excel_To_DB 一款将Excel表格中的数据导入至数据库中的小工具,SpringBoot+EasyPoi+Redis消息队列实现Excel批量异步导入数据库 详细介绍:

    java开源包4

    Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP...

    java开源包11

    Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP...

    java开源包6

    Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP...

    java开源包101

    Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP...

    java开源包9

    Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP...

    java开源包5

    Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP...

    java开源包8

    Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP...

    java开源包10

    Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP...

Global site tag (gtag.js) - Google Analytics