做的网站需要什么技术支持中山网站建设文化咨询
news/
2025/10/1 10:04:47/
文章来源:
做的网站需要什么技术支持,中山网站建设文化咨询,第一次跑业务怎么找客户,优化大师班级jedis是一个著名的key-value存储系统#xff0c;而作为其官方推荐的java版客户端jedis也非常强大和稳定#xff0c;支持事务、管道及有jedis自身实现的分布式。在这里对jedis关于事务、管道和分布式的调用方式做一个简单的介绍和对比#xff1a;一、普通同步方式最简单和基础…jedis是一个著名的key-value存储系统而作为其官方推荐的java版客户端jedis也非常强大和稳定支持事务、管道及有jedis自身实现的分布式。在这里对jedis关于事务、管道和分布式的调用方式做一个简单的介绍和对比一、普通同步方式最简单和基础的调用方式Testpublic void test1Normal() {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之后都可以返回结果标记是否成功。二、事务方式(Transactions)redis的事务很简单他主要目的是保障一个client发起的事务中的命令可以连续的执行而中间不会插入其他client的命令。看下面例子Testpublic void test2Trans() {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()方法来取消事务。三、管道(Pipelining)有时我们需要采用异步方式一次发送多个指令不同步等待其返回结果。这样可以取得非常好的执行效率。这就是管道调用方法如下Testpublic void test3Pipelined() {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();}四、管道中调用事务就Jedis提供的方法而言是可以做到在管道中使用事务其代码如下Testpublic void test4combPipelineTrans() {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();}但是经测试(见本文后续部分)发现其效率和单独使用事务差不多甚至还略微差点。五、分布式直连同步调用Testpublic void test5shardNormal() {List shards Arrays.asList(new JedisShardInfo(localhost,6379),new JedisShardInfo(localhost,6380));ShardedJedis sharding new ShardedJedis(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([email protected] SET: ((end - start)/1000.0) seconds);sharding.disconnect();}这个是分布式直接连接并且是同步调用每步执行都返回执行结果。类似地还有异步管道调用。六、分布式直连异步调用Testpublic void test6shardpipelined() {List shards Arrays.asList(new JedisShardInfo(localhost,6379),new JedisShardInfo(localhost,6380));ShardedJedis sharding new ShardedJedis(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([email protected] SET: ((end - start)/1000.0) seconds);sharding.disconnect();}七、分布式连接池同步调用如果你的分布式调用代码是运行在线程中那么上面两个直连调用方式就不合适了因为直连方式是非线程安全的这个时候你就必须选择连接池调用。Testpublic void test7shardSimplePool() {List shards Arrays.asList(new JedisShardInfo(localhost,6379),new JedisShardInfo(localhost,6380));ShardedJedisPool pool new ShardedJedisPool(new JedisPoolConfig(), 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([email protected] SET: ((end - start)/1000.0) seconds);pool.destroy();}上面是同步方式当然还有异步方式。八、分布式连接池异步调用Testpublic void test8shardPipelinedPool() {List shards Arrays.asList(new JedisShardInfo(localhost,6379),new JedisShardInfo(localhost,6380));ShardedJedisPool pool new ShardedJedisPool(new JedisPoolConfig(), 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([email protected] SET: ((end - start)/1000.0) seconds);pool.destroy();}九、需要注意的地方事务和管道都是异步模式。在事务和管道中不能同步查询结果。比如下面两个调用都是不允许的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();事务和管道都是异步的个人感觉在管道中再进行事务调用没有必要不如直接进行事务模式。分布式中连接池的性能比直连的性能略好(见后续测试部分)。分布式调用中不支持事务。因为事务是在服务器端实现而在分布式中每批次的调用对象都可能访问不同的机器所以没法进行事务。十、测试运行上面的代码进行测试其结果如下Simple SET: 5.227 secondsTransaction SET: 0.5 secondsPipelined SET: 0.353 secondsPipelined transaction: 0.509 seconds[email protected] SET: 5.289 seconds[email protected] SET: 0.348 seconds[email protected] SET: 5.039 seconds[email protected] SET: 0.401 seconds另外经测试分布式中用到的机器越多调用会越慢。上面是2片下面是5片[email protected] SET: 5.494 seconds[email protected] SET: 0.51 seconds[email protected] SET: 5.223 seconds[email protected] SET: 0.518 seconds下面是10片[email protected] SET: 5.9 seconds[email protected] SET: 0.794 seconds[email protected] SET: 5.624 seconds[email protected] SET: 0.762 seconds下面是100片[email protected] SET: 14.055 seconds[email protected] SET: 8.185 seconds[email protected] SET: 13.29 seconds[email protected] SET: 7.767 seconds分布式中连接池方式调用不但线程安全外根据上面的测试数据也可以看出连接池比直连的效率更好。十一、完整的测试代码import java.util.Arrays;import java.util.List;import org.junit.AfterClass;import org.junit.BeforeClass;import org.junit.Test;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPoolConfig;import redis.clients.jedis.JedisShardInfo;import redis.clients.jedis.Pipeline;import redis.clients.jedis.ShardedJedis;import redis.clients.jedis.ShardedJedisPipeline;import redis.clients.jedis.ShardedJedisPool;import redis.clients.jedis.Transaction;import org.junit.FixMethodOrder;import org.junit.runners.MethodSorters;FixMethodOrder(MethodSorters.NAME_ASCENDING)public class TestJedis {private static Jedis jedis;private static ShardedJedis sharding;private static ShardedJedisPool pool;BeforeClasspublic static void setUpBeforeClass() throws Exception {List shards Arrays.asList(new JedisShardInfo(localhost,6379),new JedisShardInfo(localhost,6379)); //使用相同的ip:port,仅作测试jedis new Jedis(localhost);sharding new ShardedJedis(shards);pool new ShardedJedisPool(new JedisPoolConfig(), shards);}AfterClasspublic static void tearDownAfterClass() throws Exception {jedis.disconnect();sharding.disconnect();pool.destroy();}Testpublic void test1Normal() {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);}Testpublic void test2Trans() {long start System.currentTimeMillis();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();long end System.currentTimeMillis();System.out.println(Transaction SET: ((end - start)/1000.0) seconds);}Testpublic void test3Pipelined() {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();long end System.currentTimeMillis();System.out.println(Pipelined SET: ((end - start)/1000.0) seconds);}Testpublic void test4combPipelineTrans() {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);}Testpublic void test5shardNormal() {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([email protected] SET: ((end - start)/1000.0) seconds);}Testpublic void test6shardpipelined() {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([email protected] SET: ((end - start)/1000.0) seconds);}Testpublic void test7shardSimplePool() {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([email protected] SET: ((end - start)/1000.0) seconds);}Testpublic void test8shardPipelinedPool() {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([email protected] SET: ((end - start)/1000.0) seconds);}}转载请注明来源网站:www.itxm.cn谢谢分享到
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/923732.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!