java jedis multi_Jedis实现多种功能总结

Jedis实现多种功能总结

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

一、 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

二、 分布式的锁实现

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

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

public boolean lock(longtimeout) {long nano =System.nanoTime();

timeout*=ONE_MILLI_NANOS;try{while ((System.nanoTime() - nano)

jedis.expire(key, EXPIRE);

locked= true;returnlocked;

}//短暂休眠,nano避免出现活锁

Thread.sleep(3, r.nextInt(500));

}

}catch(Exception e) {

}return false;

}

2. 通过事务(multi)实现

public boolean lock_2(longtimeout) {long nano =System.nanoTime();

timeout*=ONE_MILLI_NANOS;try{while ((System.nanoTime() - nano)

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(longtimeout) {long nano =System.nanoTime();

timeout*=ONE_MILLI_NANOS;try{while ((System.nanoTime() - nano)

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服务端的分片技术。

--------------------------------------------------------------------------慢慢了解!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Jedis实现分布式公平锁的思路如下: 1. 使用Redis的有序集合(Sorted Set)来存储锁,每一个锁对应一个成员(member)。 2. 每个成员的分值(score)代表这个锁的到期时间,也就是说分值越小,越早到期。 3. 当需要获得锁时,将当前时间作为分值插入有序集合中,并返回这个成员的排名(rank)。 4. 判断排名是否为0,如果是,则表示当前客户端获得了锁;否则,表示有其他客户端已经获得了锁,需要等待。 5. 释放锁时,根据成员的值(value)和排名(rank)判断是否为当前客户端持有的锁,如果是,则删除该成员,释放锁。 具体的实现代码如下: ```java import redis.clients.jedis.Jedis; import redis.clients.jedis.Transaction; import java.util.List; public class DistributedLock { private Jedis jedis; private String lockKey; public DistributedLock(Jedis jedis, String lockKey) { this.jedis = jedis; this.lockKey = lockKey; } public String acquire(long timeout) { long start = System.currentTimeMillis(); String identifier = Long.toString(Thread.currentThread().getId()); while (System.currentTimeMillis() - start < timeout) { jedis.watch(lockKey); double score = System.currentTimeMillis() / 1000.0; long rank = jedis.zrank(lockKey, identifier); if (rank == null) { Transaction tx = jedis.multi(); tx.zadd(lockKey, score, identifier); List<Object> result = tx.exec(); if (result != null) { return identifier; } } try { Thread.sleep(10); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } return null; } public boolean release(String identifier) { jedis.watch(lockKey); long rank = jedis.zrank(lockKey, identifier); if (rank != null) { Transaction tx = jedis.multi(); tx.zrem(lockKey, identifier); List<Object> result = tx.exec(); return result != null; } return false; } } ``` 使用示例: ```java Jedis jedis = new Jedis("localhost"); DistributedLock lock = new DistributedLock(jedis, "lockKey"); String identifier = lock.acquire(10000); if (identifier != null) { try { // do something } finally { lock.release(identifier); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值