jedis watch Java_jedis操作redis的几种常见方式总结

Redis是一个著名的key-value存储系统,也是nosql中的最常见的一种,这篇文章主要给大家总结了关于在java中jedis操作redis的几种常见方式,文中给出了详细的示例代码供大家参考学习,需要的朋友们下面来一起看看吧。

前言

Redis是一个著名的key-value存储系统,也是nosql中的最常见的一种。其实,个人认为,redis最强大的地方不在于其存储,而在于其强大的缓存作用。

我们可以把它想象成一个巨大的(多借点集群,聚合多借点的内存)的Map,也就是Key-Value。

所以,我们可以把它做成缓存组件。

官方推荐的Java版客户端是jedis,非常强大和稳定,支持事务、管道及有jedis自身实现。我们对redis数据的操作,都可以通过jedis来完成。

那我们就来看一看,jedis不同的调用方式:

(1)普通同步方式

public voidjedisNormal() {

Jedis jedis= new Jedis("localhost");long start =System.currentTimeMillis();for (int i = 0; i < 100000; i++) {

String result= jedis.set("n" + i, "n" +i);

}long end =System.currentTimeMillis();

System.out.println("Simple SET:" + ((end - start)/1000.0) + "seconds");

jedis.disconnect();

}//每次set之后都可以返回结果,标记是否成功。

(2)事务方式(Transactions)

所谓事务,即一个连续操作,是否执行是一个事务,要么完成,要么失败,没有中间状态。

而redis的事务很简单,他主要目的是保障,一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令,也就是事务的连贯性。

public voidjedisTrans() {

Jedis jedis= new Jedis("localhost");long start =System.currentTimeMillis();

Transaction tx=jedis.multi();for (int i = 0; i < 100000; i++) {

tx.set("t" + i, "t" +i);

}

List results =tx.exec();long end =System.currentTimeMillis();

System.out.println("Transaction SET:" + ((end - start)/1000.0) + "seconds");

jedis.disconnect();

}//我们调用jedis.watch(…)方法来监控key,如果调用后key值发生变化,则整个事务会执行失败。另外,事务中某个操作失败,并不会回滚其他操作。这一点需要注意。还有,我们可以使用discard()方法来取消事务。

(3)管道(Pipelining)

管道是一种两个进程之间单向通信的机制。

那再redis中,为何要使用管道呢?有时候,我们需要采用异步的方式,一次发送多个指令,并且,不同步等待其返回结果。这样可以取得非常好的执行效率。

public voidjedisPipelined() {

Jedis jedis= new Jedis("localhost");

Pipeline pipeline=jedis.pipelined();long start =System.currentTimeMillis();for (int i = 0; i < 100000; i++) {

pipeline.set("p" + i, "p" +i);

}

List results =pipeline.syncAndReturnAll();long end =System.currentTimeMillis();

System.out.println("Pipelined SET:" + ((end - start)/1000.0) + "seconds");

jedis.disconnect();

}

(4)管道中调用事务

对于,事务以及管道,这两个概念我们都清楚了。

在某种需求下,我们需要异步执行命令,但是,又希望多个命令是有连续的,所以,我们就采用管道加事务的调用方式。jedis是支持在管道中调用事务的。

public voidjedisCombPipelineTrans() {

jedis= new Jedis("localhost");long start =System.currentTimeMillis();

Pipeline pipeline=jedis.pipelined();

pipeline.multi();for (int i = 0; i < 100000; i++) {

pipeline.set("" + i, "" +i);

}

pipeline.exec();

List results =pipeline.syncAndReturnAll();long end =System.currentTimeMillis();

System.out.println("Pipelined transaction:" + ((end - start)/1000.0) + "seconds");

jedis.disconnect();

}//效率上可能会有所欠缺

(5)分布式直连同步调用

这个是分布式直接连接,并且是同步调用,每步执行都返回执行结果。类似地,还有异步管道调用。

其实就是分片。

public voidjedisShardNormal() {

List shards =Arrays.asList(new JedisShardInfo("localhost",6379),new JedisShardInfo("localhost",6380));

ShardedJedis sharding= newShardedJedis(shards);long start =System.currentTimeMillis();for (int i = 0; i < 100000; i++) {

String result= sharding.set("sn" + i, "n" +i);

}long end =System.currentTimeMillis();

System.out.println("Simple@Sharing SET:" + ((end - start)/1000.0) + "seconds");

sharding.disconnect();

}

(6)分布式直连异步调用

public voidjedisShardpipelined() {

List shards =Arrays.asList(new JedisShardInfo("localhost",6379),new JedisShardInfo("localhost",6380));

ShardedJedis sharding= newShardedJedis(shards);

ShardedJedisPipeline pipeline=sharding.pipelined();long start =System.currentTimeMillis();for (int i = 0; i < 100000; i++) {

pipeline.set("sp" + i, "p" +i);

}

List results =pipeline.syncAndReturnAll();long end =System.currentTimeMillis();

System.out.println("Pipelined@Sharing SET:" + ((end - start)/1000.0) + "seconds");

sharding.disconnect();

}

(7)分布式连接池同步调用

如果,你的分布式调用代码是运行在线程中,那么上面两个直连调用方式就不合适了,因为直连方式是非线程安全的,这个时候,你就必须选择连接池调用。

连接池的调用方式,适合大规模的redis集群,并且多客户端的操作。

public voidjedisShardSimplePool() {

List shards =Arrays.asList(new JedisShardInfo("localhost",6379),new JedisShardInfo("localhost",6380));

ShardedJedisPool pool= new ShardedJedisPool(newJedisPoolConfig(), shards);

ShardedJedis one=pool.getResource();long start =System.currentTimeMillis();for (int i = 0; i < 100000; i++) {

String result= one.set("spn" + i, "n" +i);

}long end =System.currentTimeMillis();

pool.returnResource(one);

System.out.println("Simple@Pool SET:" + ((end - start)/1000.0) + "seconds");

pool.destroy();

}

(8)分布式连接池异步调用

public voidjedisShardPipelinedPool() {

List shards =Arrays.asList(new JedisShardInfo("localhost",6379),new JedisShardInfo("localhost",6380));

ShardedJedisPool pool= new ShardedJedisPool(newJedisPoolConfig(), shards);

ShardedJedis one=pool.getResource();

ShardedJedisPipeline pipeline=one.pipelined();long start =System.currentTimeMillis();for (int i = 0; i < 100000; i++) {

pipeline.set("sppn" + i, "n" +i);

}

List results =pipeline.syncAndReturnAll();long end =System.currentTimeMillis();

pool.returnResource(one);

System.out.println("Pipelined@Pool SET:" + ((end - start)/1000.0) + "seconds");

pool.destroy();

}

9)需要注意的地方

事务和管道都是异步模式。在事务和管道中不能同步查询结果。比如下面两个调用,都是不允许的:

Transaction tx =jedis.multi();for (int i = 0; i < 100000; i++) {

tx.set("t" + i, "t" +i);

}

System.out.println(tx.get("t1000").get()); //不允许

List results =tx.exec();

Pipeline pipeline=jedis.pipelined();long start =System.currentTimeMillis();for (int i = 0; i < 100000; i++) {

pipeline.set("p" + i, "p" +i);

}

System.out.println(pipeline.get("p1000").get()); //不允许

List results = pipeline.syncAndReturnAll();

事务和管道都是异步的,个人感觉,在管道中再进行事务调用,没有必要,不如直接进行事务模式。

分布式中,连接池的性能比直连的性能略好(见后续测试部分)。

分布式调用中不支持事务。

因为事务是在服务器端实现,而在分布式中,每批次的调用对象都可能访问不同的机器,所以,没法进行事务。

(10)总结

分布式中,连接池方式调用不但线程安全外,根据上面的测试数据,也可以看出连接池比直连的效率更好。

经测试分布式中用到的机器越多,调用会越慢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339377.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C/C++打造Windows岁月留声机

今晚课题【长按识别图中二维码】

hazelcast入门教程_Hazelcast入门指南第1部分

hazelcast入门教程介绍 我将在Hazelcast上做一个系列。 我从Twitter了解了该产品。 他们决定跟随我&#xff0c;经过对他们所做工作的研究后&#xff0c;我决定跟随他们。 我在推特上说&#xff0c;Hazelcast将是分布式密码破解者的重要Struts。 这引起了一些兴趣&#xff0c;我…

java演出厅选票_高仿猫眼电影选座(选票)模块-b

上图看效果先&#xff1a;1)画座位图其实不是很难一般数据都会给坐标&#xff0c;将坐标对应座位画出来就可以了&#xff0c;主要是开场动画要设置默认大小&#xff0c;还有座位图的数量也不是固定的&#xff0c;所以在初始化座位图的时侯就默认算出了整个座位图的大小-(instan…

input发送a.jax_Java EE 7 / JAX-RS 2.0 – REST上的CORS

input发送a.jaxJava EE REST应用程序在开箱即用的开发机器上通常可以很好地运行&#xff0c;在该机器上&#xff0c;所有服务器端资源和客户端UI都指向“ localhost”或127.0.0.1。 但是&#xff0c;当涉及跨域部署时&#xff08;当REST客户端不再与托管REST API的服务器位于同…

用C/C++开发《Photoshop》图像处理软件

今晚课题【长按识别图中二维码】

javaone_代理的JavaOne 2014观察

javaone我今年无法参加JavaOne&#xff0c;但很高兴看到一些在线资源涵盖了JavaOne 2014的活动。在本文中&#xff0c;我总结了JavaOne 2014的一些观察结果&#xff0c;并提供了指向提供这些观察结果的参考的链接。提供有关这些观察的更多背景细节。 列出的观察结果没有特别的顺…

java怎么兼容switch_java – Switch语句给出了不兼容类型错误

我正在尝试编译,我收到此错误&#xff1a;enigma/Rotor.java:30: incompatible types found : java.lang.String required: int switch(name){1 error为什么我收到此错误&#xff1f;我如何解决它&#xff1f;它在包中,我似乎无法弄明白.这是代码&#xff1a;String label;Roto…

基于java的心理健康_基于SSM的JAVA心理健康网

今天记录的项目是心理健康网的规划与设计&#xff0c;这个项目是这么回事&#xff1a;心理健康是关系到人才质量的重要问题。随着网络时代的发展,传统的大学生心理健康教育教学方式和课程资源远不能解决当代大学生的心理问题。本文通过对学生心理健康网的规划与设计进行研究。首…

C/C++打造《百万级人脸识别系统》

今晚课题【长按识别图中二维码】

rhq监控软件_RHQ指标的WildFly子系统

rhq监控软件对于RHQ-Metrics&#xff0c;我已经开始为WildFly 8编写一个子系统&#xff0c;该子系统能够在WildFly内收集度量&#xff0c;然后以固定的时间间隔&#xff08;当前为每分钟&#xff09;将其发送到RHQ-Metrics服务器。 下一张图是该发件人连续运行1.5天时结果的可…

java中content啥意思_JSTL标签中的body-content标签体内容输出格式的介绍

我们在JSTL标签中看到“JSP”这种类型的定义&#xff0c;但是不知道它是什么意思&#xff0c;其实它的意思就是定义了一个JSTL标签内部是否允许使用JSP表达式&#xff0c;先来了解什么是JSTL标签体&#xff0c;请看代码&#xff1a;//中间即为JSTL标签体再来看看什么是jsp表达式…

打造最强加密工具之《绝密信息传递》

今晚课题【长按识别图中二维码】

jooq sql_用jOOQ用Java编写SQL

jooq sqljOOQ是“数据库优先”类型的安全SQL API&#xff0c;使您可以直观地用Java编写SQL&#xff0c;就像Java编译器本身支持SQL语言一样。 所有数据库模式&#xff0c;表&#xff0c;列&#xff0c;过程和其他对象均作为Java对象提供&#xff0c;可以直接在jOOQ SQL API中使…

C/C++打造经典推箱子小游戏

今晚课题【长按识别图中二维码】

php mysql crud demo_基于php和mysql的简单的dao类实现crud操作功能_PHP教程

代码如下:public function SimpleDao() {if ($this->_con null) {$this->_con mysql_connect("localhost", "root", "123456");if ($this->_con FALSE) {echo("connect to db server failed.");$this->_con null;retu…

di容器_DI容器是代码污染者

di容器尽管依赖项注入 &#xff08;aka&#xff0c;“ DI”&#xff09;是一种在OOP中组成对象的自然技术&#xff08;在Martin Fowler引入该术语之前就已知道&#xff09;&#xff0c;但Spring IoC &#xff0c; Google Guice &#xff0c; Java EE6 CDI &#xff0c; Dagger和…

C/C++高级算法之绘制曼德布洛特集

今晚课题【长按识别图中二维码】

python mysql 连接6_寒假学习进度-6(Python连接MySQL数据库)

Python连接mysql和操作软件&#xff1a;pycharm开始在pycharm下面的Terminal中安装mysql时提醒pip版本不够&#xff0c;所以需要先升级一下pippython -m pip install --upgrade pip升级完pip之后就可以下载mysqlpip install mysql下载完成后在setting中查看进行代码测试#!/usr/…

intellij 快捷键_IntelliJ中的键盘快捷键

intellij 快捷键我上周参加了Hadi Hariri在JavaOne上的演讲。 他介绍了很多我不知道的IntelliJ键盘快捷键。 非常有用的谈话。 我在下面列出了一些最有用的。 Cmd-1&#xff1a;将焦点移到“项目”窗口 在此输入任何类名&#xff08;包括使用Camel Case&#xff0c;例如HW来查…