多线程,高并发的情况下操作redis当中的数据,如何加锁?

来源:互联网 发布:java多线程是什么 编辑:程序博客网 时间:2024/04/29 02:15

    多个线程同时去操作Redis当中的数据,假如不加锁的情况下,会出现数据重复的问题。假如需要每次都只有一条线程去操作Redis当中的数据,需要给操作加上锁。

    但是去网上一搜,网上给Redis加锁的机制都是利用Redis的setnx自身的方法去加锁,但是这样加锁首先麻烦,得手动防止死锁等问题,速度还不快。

    下面是我自己测试通过的如何给redis加锁的代码,仅供自己参考和有需要的人参考。

 @Scheduled(initialDelay = 1000, fixedDelay = 60000)    public void redisTest(){        Jedis jedis = jedisPool.getResource();        try{            jedis.set("red_packet_num","5000");        }catch (Exception e)        {            e.printStackTrace();            if (jedis != null) {                jedis.close();            }        }        finally {            if (jedis != null) {                jedis.close();            }        }        Lock lock=new ReentrantLock();        for(int i=0;i<2000;i++){            fixedThreadPool.execute(new Runnable() {                @Override                public void run() {                    Jedis jedis = jedisPool.getResource();                    try {                        lock.lock();                        String red_packet_num = jedis.get("red_packet_num");                        int a = Integer.parseInt(red_packet_num) - 1;                        jedis.set("red_packet_num", String.valueOf(a));                        lock.unlock();                        System.out.println("数据是:" + a+"当前线程是:"+Thread.currentThread().getName()+"当前时间"+ CommonUtil.getCurrentTimeFormatForHMS());                    }                    catch (Exception e){                        e.printStackTrace();                        if (jedis != null) {                            jedis.close();                        }                    }                    finally {                        if (jedis != null) {                            jedis.close();                        }                    }                }            });        }    }

    产生的数据如下:

  




原创粉丝点击