多线程,高并发的情况下操作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(); } } } }); } }
产生的数据如下:
阅读全文
0 0
- 多线程,高并发的情况下操作redis当中的数据,如何加锁?
- 如何在命令行下操作Django构建的数据对象
- linux下操作redis数据库的常用命令
- 多线程环境下操作HashMap的问题
- 关于数据加锁和高并发的浅谈
- .net下操作Excel数据的几种方法
- vc下操作MYSQL中文数据的参考程序
- 同步在无线网状态下操作的数据
- 命令行下操作redis
- 如何处理高并发情况下的DB插入
- 如何处理高并发情况下的DB插入
- 如何处理高并发情况下的DB插入
- 如何处理高并发情况下的DB插入
- 高并发情况下 如何支撑大量的请求
- 大量数据情况下单线程插入和多线程(高并发)insert数据库的性能测试
- 多线程并发情况的总结
- C#下操作ini文件的封装
- Delphi 下操作Windows 服务的代码
- 前端面试题8
- dialog中的EditText无法弹出输入框解决方法
- 十四 Java 方法
- Python中的LEGB规则
- retrofit2一个key值上传多个文件
- 多线程,高并发的情况下操作redis当中的数据,如何加锁?
- 《汇编语言》(第三版)王爽第十章实验10.3个人方法记录
- MariaDB安装与简单配置
- idea启动项目address localhost:1099 is already in use异常解决
- SnowNLP 简单用法例子
- Runtime获取对象隐藏的属性
- N上预置APK失败提示找不到so文件
- Android 微信支付开发流程
- 前端面试题9