JedisPool踩坑记录

时间:2025-04-04 14:53:56
  • package ;
  • import ;
  • import ;
  • import ;
  • import ;
  • import ;
  • import ;
  • import ;
  • import ;
  • /**
  • * @author wzq
  • * date: 2019/12/23 11:28
  • * description:
  • */
  • public class OrderService implements Runnable {
  • private static CyclicBarrier cb = new CyclicBarrier(60);
  • // 订单号生成类
  • // 将orderNumGenerator或者count任意一处加上static,getNumber()加上同步锁,依然是线程安全的,因为使用的是同一个generator,而且加了锁是线程安全的
  • // 效果等同于静态锁,很多OrderService实例共用一把锁
  • private OrderNumGenerator orderNumGenerator = new OrderNumGenerator();
  • // 实现方式1
  • //private DistributeLock lock = new ZookeeperDistributeLock();
  • // 实现方式2
  • //private DistributeLock lock = new ZookeeperDistributeLock2();
  • /**
  • * 这么多OrderService实例共用一把锁,可以保证线程安全,但在集群部署多机模式下,
  • * 即便每台机器一次有一个请求获得锁,机器足够多依然会导致并发问题
  • */
  • private static Lock rtLock = new ReentrantLock();
  • //实现方式3,redis分布式锁
  • //private Jedis jedis = ();
  • private Jedis jedis = ();
  • public void run() {
  • try {
  • ();
  • } catch (InterruptedException | BrokenBarrierException e) {
  • ();
  • }
  • getNumber();
  • }
  • public void getNumber() {
  • String requestId = ().toString();
  • try {
  • //();
  • //();
  • // Redis服务端单机部署,需要回调
  • // redis锁使用此段生成订单代码
  • /*if ((jedis, "lock", requestId, 2000)) {
  • String number = ();
  • (().getName() + "-" + () + ",产生了订单:" + number);
  • } else {
  • ();
  • }*/
  • // zookeeper锁或者不加锁使用此段生成代码订单
  • String number = ();
  • (().getName() + "-" + () + ",产生了订单:" + number);
  • } catch (Exception e) {
  • ();
  • } finally {
  • //();
  • //();
  • //Redis服务端单机部署,需要回调
  • //(jedis, "lock", requestId);
  • }
  • }
  • public static void main(String[] args) {
  • ("####生成了订单####");
  • for (int i = 0; i < 60; i++) {
  • new Thread(new OrderService()).start();
  • }
  • }
  • }