多线程,高并发的情况下操作redis当中的数据,如何加锁?
2017-11-10 17:07
966 查看
多个线程同时去操作Redis当中的数据,假如不加锁的情况下,会出现数据重复的问题。假如需要每次都只有一条线程去操作Redis当中的数据,需要给操作加上锁。
但是去网上一搜,网上给Redis加锁的机制都是利用Redis的setnx自身的方法去加锁,但是这样加锁首先麻烦,得手动防止死锁等问题,速度还不快。
下面是我自己测试通过的如何给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(); } } } }); } }
产生的数据如下:
相关文章推荐
- 如何处理大量数据高并发大流量并发操作方案
- 并发下,使用redis防止数据重复插入(数据库未对表字段设置唯一情况下)
- Redis修改数据多线程并发—Redis并发锁
- 大量数据情况下单线程插入和多线程(高并发)insert数据库的性能测试
- 如何处理大量数据并发操作?
- 如何处理大量数据并发操作
- 关于网站大并发情况下的数据的初始化如何处理。
- 如何处理大量数据并发操作(数据库锁机制详解)
- 如何处理大量数据并发操作
- 既然redis是单线程模型,,怎么会出现并发访问操作同一份数据呢?
- 在Java中使用Jedis操作Redis,在高并发的情况下,应用卡死、报无法获取连接错误的处理方式
- 11.38 CastleActiveRecord中如何保证多线程并发操作的安全与成功?
- 更高效地提高redis client多线程操作的并发吞吐设计
- 如何处理大量数据并发操作
- Sql Server 如何解决多并发情况下,出现的多个相同ID数据
- 如何处理大量数据并发操作
- 如何处理大量数据并发操作
- 如何处理大量数据并发操作(数据库锁机制详解)
- 如何处理大量数据并发操作(数据库锁机制详解)
- 操作XmlDocument时,出现"System.OutOfMemoryException"异常,如何解决加载大数据的情况?