Jedis实现多种功能总结

xiaoxiao2021-02-28  179

Jedis实现多种功能总结 Jedis是Redis的java版本的客户端,利用Jedis可以简单的实现许多功能。

pipeline分布式id生成器分布式锁 Redis分布式

一、 Pipeline 官方的说明: starts a pipeline,which is a very efficient way to send lots of command and read all the responses when you finish sending them。 简单点说pipeline适用于批处理。当有大量的操作需要一次性执行的时候,可以用管道。 示例:

Jedis jedis = new Jedis(String, int); Pipeline p = jedis.pipelined(); p.set(key,value);//每个操作都发送请求给redis-server p.get(key,value); p.sync();//这段代码获取所有的response

耗时比较: 进行20w次连续操作(10w读,10w写),不用pipeline耗时:187242ms,用pipeline耗时:1188ms,可见使用管道后的性能上了一个台阶。 通过代码了解到,管道通过一次性写入请求,然后一次性读取响应。jedis是:request response,request response,…;pipeline则是:request request… response response的方式。这样无需每次请求都等待server端的响应。

二、 跨jvm的id生成器 我们都知道redis-server端是单线程来处理client端的请求的。 这样来实现一个id生成器就非常简单了,只要简单的调用jdeis.incr(key);就搞定了。 incr是原子操作,能保证不会出现并发问题。

三、 分布式的锁实现 使用场景,随着访问量和数据量的增加,程序都开始实现集群、分布式部署,即同样的程序在不同的机器上部署多份。那么如何保证数据的同步呢?如何实现统一控制呢?基于redis我们可以实现一个分布式锁来处理以上问题。

最常用的是第一种,具体理论了解和实现逻辑请看其他两个博客: 基于Redis实现分布式锁(上) 基于Redis实现分布式锁(下)

1. 通过jedis.setnx(key,value)实现

public boolean lock(long timeout) { long nano = System.nanoTime(); timeout *= ONE_MILLI_NANOS; try { while ((System.nanoTime() - nano) < timeout) { if (jedis.setnx(key, LOCKED) == 1) { jedis.expire(key, EXPIRE); locked = true; return locked; } // 短暂休眠,nano避免出现活锁 Thread.sleep(3, r.nextInt(500)); } } catch (Exception e) { } return false; }

2. 通过事务(multi)实现

public boolean lock_2(long timeout) { long nano = System.nanoTime(); timeout *= ONE_MILLI_NANOS; try { while ((System.nanoTime() - nano) < timeout) { Transaction t = jedis.multi(); // 开启事务,当server端收到multi指令 // 会将该client的命令放入一个队列,然后依次执行,知道收到exec指令 t.getSet(key, LOCKED); t.expire(key, EXPIRE); String ret = (String) t.exec().get(0); if (ret == null || ret.equals("UNLOCK")) { return true; } // 短暂休眠,nano避免出现活锁 Thread.sleep(3, r.nextInt(500)); } } catch (Exception e) { } return false; }

3. 通过事务+监听实现

public boolean lock_3(long timeout) { long nano = System.nanoTime(); timeout *= ONE_MILLI_NANOS; try { while ((System.nanoTime() - nano) < timeout) { jedis.watch(key); // 开启watch之后,如果key的值被修改,则事务失败,exec方法返回null String value = jedis.get(key); if (value == null || value.equals("UNLOCK")) { Transaction t = jedis.multi(); t.setex(key, EXPIRE, LOCKED); if (t.exec() != null) { return true; } } jedis.unwatch(); // 短暂休眠,nano避免出现活锁 Thread.sleep(3, r.nextInt(500)); } } catch (Exception e) { } return false; }

四、 Redis分布式 当数据量或访问压力达到单台机器极限时,我们必须考虑集群部署,使用分片技术,将数据分散到多个机器上去。 Jedis实现了客户端的分片技术,同时也可以操作Redis-cluster服务端的分片技术,详细使用方式请查看另外博客:Jedis的多种实用方式

转载请注明原文地址: https://www.6miu.com/read-17478.html

最新回复(0)