您的位置:首页 > 数据库 > Redis

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

2017-11-10 17:07 966 查看
    多个线程同时去操作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();
}
}
}
});
}
}


    产生的数据如下:

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息