demo1
public ErrorCode initDemo1(@RequestParam("orderNo") String orderNo) throws IOException {
String lockKey = KEY + orderNo;
Boolean hasKey = null;
try {
//锁判断
hasKey = redisTemplate.hasKey(lockKey); int index = 0;
while (hasKey && index < 3) {
log.info(">>>>>>>>>>>>>刷新,wait>>>>>>>>>>>>>");
index++;
Thread.sleep(1500L * index);
hasKey = redisTemplate.hasKey(lockKey);
}
if (index > 0) {
log.info(">>>>>>>>>>>>>wait index:{} hasKey: {}", index, hasKey);
} //加锁
redisTemplate.opsForValue().set(lockKey, "1", 5, TimeUnit.SECONDS); //业务操作-刷新es todo 业务逻辑 //去锁
redisTemplate.delete(lockKey);
return ErrorCode.SUCCESS;
} catch (Exception e) {
//去锁
redisTemplate.delete(lockKey);
return ErrorCode.SYS_ERROR;
}
} demo2
public ErrorCode initDemo2(@RequestParam("orderNo") String orderNo) throws IOException {
String lockKey = KEY + orderNo;
Boolean hasKey = null;
try {
hasKey = lock(lockKey, orderNo, 5);
if(hasKey != null && hasKey) {
//业务操作-刷新es todo 业务逻辑
}else {
return ErrorCode.LOCK_FAILED;
}
return ErrorCode.SUCCESS;
} catch (Exception e) {
return ErrorCode.SYS_ERROR;
} finally{
if(hasKey != null && hasKey) {
redisTemplate.delete(lockKey);
}
}
} public boolean lock(String key, String value, long releaseTime) {
// 尝试获取锁 spring-data-redis 2.1版本以上 //implementation group: 'org.springframework.data', name: 'spring-data-redis', version: '2.1.0.RELEASE'
// Boolean boo = redisTemplate.opsForValue().setIfAbsent(key, value, releaseTime, TimeUnit.SECONDS); //.setIfAbsent(key, value, releaseTime, TimeUnit.SECONDS);
// 判断结果
// return boo != null && boo; redisTemplate.setEnableTransactionSupport(true);
redisTemplate.multi();
redisTemplate.opsForValue().setIfAbsent(key,value);
redisTemplate.expire(key,releaseTime, TimeUnit.SECONDS);
List result = redisTemplate.exec(); // 这里result会返回事务内每一个操作的结果,如果setIfAbsent操作失败后,result[0]会为false。
if(result != null && true == (Boolean)result.get(0)){
return true;
}else {
return false;
}
}

redis 锁的更多相关文章

  1. (实例篇)php 使用redis锁限制并发访问类示例

    1.并发访问限制问题 对于一些需要限制同一个用户并发访问的场景,如果用户并发请求多次,而服务器处理没有加锁限制,用户则可以多次请求成功. 例如换领优惠券,如果用户同一时间并发提交换领码,在没有加锁限制 ...

  2. php 使用redis锁限制并发访问类

    1.并发访问限制问题 对于一些需要限制同一个用户并发访问的场景,如果用户并发请求多次,而服务器处理没有加锁限制,用户则可以多次请求成功. 例如换领优惠券,如果用户同一时间并发提交换领码,在没有加锁限制 ...

  3. 解锁redis锁的正确姿势

    解锁redis锁的正确姿势 redis是php的好朋友,在php写业务过程中,有时候会使用到锁的概念,同时只能有一个人可以操作某个行为.这个时候我们就要用到锁.锁的方式有好几种,php不能在内存中用锁 ...

  4. redis锁处理并发问题

    redis锁处理并发问题 redis锁处理高并发问题十分常见,使用的时候常见有几种错误,和对应的解决办法. set方式 setnx方式 setnx+getset方式 set方式 加锁:redis中se ...

  5. redis 初步认识四(redis锁,防并发)

    using System; namespace ConsoleAppRedis { class Program { static void Main(string[] args) { //第一种,无登 ...

  6. redis锁机制介绍与实例

    转自:https://m.jb51.net/article/154421.htm 今天小编就为大家分享一篇关于redis锁机制介绍与实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要 ...

  7. 定时任务redis锁+自定义lambda优化提取冗余代码

    功能介绍: 我系统中需要跑三个定时任务,由于是多节点部署,为了防止多个节点的定时任务重复执行.所以在定时任务执行时加个锁,抢到锁的节点才能执行定时任务,没有抢到锁的节点就不执行.从而避免了定时任务重复 ...

  8. 多线程并发问题解决之redis锁

    一 问题背景 我们做的是医疗信息化系统,在系统中一条患者信息对医院中当前科室中的所有诊断医生是可见的,当有一个诊断医生点击按钮处理该数据时,数据的状态发生了变化,其他的医生就不可以再处理此患者的数据了 ...

  9. Redis 锁的实现方案

    开发中不可避免的是碰到并发请求,在数据严谨性的要求不高时,我们也不需要做什么处理,但如果碰到数据严谨性非常高的时候(例如:用户金额,秒杀产品的库存...),我们就需要慎重处理了. 解决方案多种多样,下 ...

  10. PHP Redis锁

    一.什么是 Redis Redis是由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库 二.什么是 Redis 分布式锁 分布式锁其实可以理解为:控 ...

随机推荐

  1. 从 Flink Forward Asia 2021,看Flink未来开启新篇章

    ​简介:本文将对FFA Keynote议题作一些简单的归纳总结,感兴趣的小伙伴们可以在FFA官网[2]找到相关主题视频观看直播回放. ​ 作者 | 梅源(Yuan Mei) 来源 | 阿里技术公众号 ...

  2. [FAQ] Composer, Content-Length mismatch

    1. $ composer config repos.packagist composer https://php.cnpkg.org$ composer config cache-files-max ...

  3. JAVA也能用上Seq啦

    前言 在.NET生态中,Serilog凭借其强大的结构化日志记录功能和与Seq的无缝集成,已经成为许多开发者的首选日志记录工具.Seq作为一个日志检索和仪表板工具,能够将日志中的插值转换为结构化数据, ...

  4. 【Python Web】flask视频流

    这篇文档,完全借鉴miguelgrinberg的博客. https://blog.miguelgrinberg.com/post/flask-video-streaming-revisited 想看具 ...

  5. JavaScript算法---基础排序类

    <html> <script> //正序排序,把大的放到最后,arr[j]>arr[j+1] let fz=(arr)=>{ for(let len=arr.len ...

  6. Web3连接以太网

    1. Infura Infura 是一种托管服务,提供对各种区块链网络的安全可靠访问,消除了管理区块链基础设施的复杂性,使开发者能够专注于构建创新的 Web3 应用程序. Infura 作为连接应用程 ...

  7. Selenium4自动化测试6--控件获取数据--下拉框级联选择、checkbox选择、时间选择器

    4-下拉框级联选择 import time from selenium.webdriver.support.select import Select #pip install selenium fro ...

  8. Linux安装ElastSearch

    Linux安装ES 准备好Linux系统,软件安装前需要对当前系统做一些优化配置 系统配置修改 一.内存优化 在/etc/sysctl.conf添加如下内容: fs.file-max=655360 系 ...

  9. ENVI自动地理配准:GCP地面控制点的自动产生

      本文介绍基于ENVI软件,利用"Image Registration Workflow"工具实现栅格遥感影像自动寻找地面控制点从而实现地理配准的方法.   在ENVI手动地理配 ...

  10. RocketMQ的单节点环境搭建

    1 介绍RocketMQ作为一款纯java.分布式.队列模型的开源消息中间件,支持事务消息.顺序消息.批量消息.定时消息.消息回溯等. 1.1 RocketMQ 特点支持发布/订阅(Pub/Sub)和 ...