文章目录

  • 题记
  • 利用Watch实现Redis乐观锁

题记

在线思维导图总结:redis大纲

利用Watch实现Redis乐观锁

乐观锁基于CAS(Compare And Swap)思想(比较并替换),是不具有互斥性,不会产生锁等待而消
耗资源,但是需要反复的重试,但也是因为重试的机制,能比较快的响应。因此我们可以利用redis来实
现乐观锁。具体思路如下:

  1. 利用redis的watch功能,监控这个redisKey的状态值
  2. 获取redisKey的值
  3. 创建redis事务
  4. 给这个key的值+1
  5. 然后去执行这个事务,如果key的值被修改过则回滚,key不加1

场景:开启20个线程,模拟100个用户秒杀商品,商品只有三个名额

package com.learn.cache;import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;import java.util.List;
import java.util.UUID;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;/*** @author weijie* @date 2020/7/30 13:05*/
public class Demo {public static void main(String[] args) {String rediskey = "lock";ExecutorService executorService = Executors.newFixedThreadPool(20);Jedis jedis = new Jedis("127.0.0.1", 6379);jedis.auth("123456");jedis.set(rediskey, "0");jedis.close();for (int i = 0; i < 100; i++) {executorService.execute(() -> {Jedis jedis2 = new Jedis("127.0.0.1", 6379);jedis2.auth("123456");//监听keyjedis2.watch(rediskey);String redisValue = jedis2.get(rediskey);int v = Integer.parseInt(redisValue);String userInfo = UUID.randomUUID().toString();if (v < 3){//开启redis事务Transaction tx = jedis2.multi();//自增长tx.incr(rediskey);//事务提交List<Object> list = tx.exec();if (list != null && list.size() > 0){System.out.println("用户:" + userInfo + "秒杀成功!当前人数: " + (v + 1));}//版本变化else{System.out.println("用户:" + userInfo + "秒杀失败!");}}else {System.out.println("商品已售空!");}});jedis.close();}executorService.shutdown();}
}

如何利用redis实现秒杀系统相关推荐

  1. Redis优化秒杀系统

    Redis优化秒杀系统 使用背景: 普通的基于mss框架的系统在并发量不是很高的情况下,对redis的需求不是很高.redis在系统中的角色相当于一个对象缓存器,在高并发的系统中(比如秒杀系统),在某 ...

  2. 基于Redis实现秒杀系统

    系统架构 客户端发起秒杀请求,请求经网关处理转发到对应的服务节点上,进行业务层处理,最后数据入库. 业务处理: 验证秒杀活动是否已经开启: 对流量进行限制: 验证订单信息(验证重复秒杀.验证库存是否足 ...

  3. 秒杀系统架构设计与实现

    一.难点及解决方案总结 作为一个秒杀系统,常常面临以下问题: 秒杀还未开始,就有用户模拟数据提前发送请求进行秒杀或者抢购开始瞬间有人直接利用脚本大量发送请求 秒杀前用户不停刷新页面 秒杀开始瞬间请求数 ...

  4. 【高并发】Redis如何助力高并发秒杀系统?看完这篇我彻底懂了!!

    秒杀业务 在电商领域,存在着典型的秒杀业务场景,那何谓秒杀场景呢.简单的来说就是一件商品的购买人数远远大于这件商品的库存,而且这件商品在很短的时间内就会被抢购一空.比如每年的618.双11大促,小米新 ...

  5. 实践出真知:全网最强秒杀系统架构解密!!

    很多小伙伴反馈说,高并发专题学了那么久,但是,在真正做项目时,仍然不知道如何下手处理高并发业务场景!甚至很多小伙伴仍然停留在只是简单的提供接口(CRUD)阶段,不知道学习的并发知识如何运用到实际项目中 ...

  6. java设计前期工作基础和存在的困难_Java秒杀系统实战系列-基于Redisson的分布式锁优化秒杀逻辑...

    本文是"Java秒杀系统实战系列文章"的第十五篇,本文我们将借助综合中间件Redisson优化"秒杀系统中秒杀的核心业务逻辑",解决Redis的原子操作在优化秒 ...

  7. 解密秒杀系统架构:不是所有的秒杀都是秒杀

    摘要:究竟什么样的系统算是高并发系统?今天,我们就一起解密高并发业务场景下典型的秒杀系统的架构. 本文分享自华为云社区<[高并发]秒杀系统架构解密,不是所有的秒杀都是秒杀(升级版)!!>, ...

  8. Java秒杀系统实战系列~基于Redisson的分布式锁优化秒杀逻辑

    摘要: 本篇博文是"Java秒杀系统实战系列文章"的第十五篇,本文我们将借助综合中间件Redisson优化"秒杀系统中秒杀的核心业务逻辑",解决Redis的原子 ...

  9. 关于redis做秒杀库存扣减的生产实践及思考

    前言 近期组员接手了一个领券的业务,涉及到了对券批次库存的扣减操作,在多次尝试优化后压测起来仍有一些性能问题,由于接近deadline,于是自己也尝试上手优化了一下.让我对日常在论坛看到的redis秒 ...

最新文章

  1. 北航与西安交大计算机专业对比,北航和西安交大,谁的工科实力更强,该上哪一所大学呢?...
  2. PHP PDO 连接SQLSErver,PHP 使用 PDO 方式连接 sqlserver ,拼接 的 sql 命令总是报错
  3. SQLServer2008安装失败的解决办法
  4. 07.十分钟学会tomcat数据源
  5. 【译】Using Objects to Organize Your Code
  6. 悟透JavaScript(美绘本)
  7. 【51Nod - 1103】N的倍数 (思维,鸽巢原理也叫抽屉定理,求倍数问题取模)
  8. 牛客19115 选择颜色
  9. Tri_integral Summer Training 9 总结
  10. 这位顶会领域主席的论文被自己的AI审稿系统拒绝了
  11. zTree节点增删改
  12. 美团点评点餐 Nuxt.js 实战
  13. Win 10 深度隐藏文件夹命令
  14. android power 按键,android 添加按(power键)电源键结束通话(挂断电话)
  15. python将html转成pdf,python将html转成PDF的示例
  16. android 日语输入法,Android日语输入法Simeji使用示例
  17. 怎么判断两个多项式互素_关于两个多元多项式互素问题
  18. SSM之spring事务管理
  19. 病毒、蠕虫和木马的区别
  20. Vscode+phpstudy配置PHP环境,并在服务器中运行。

热门文章

  1. Objective-C复制解析
  2. AI应用开发实战系列之四 - 定制化视觉服务的使用
  3. 常用的python脚本_五个python常用运维脚本面试题实例
  4. linux卸载openjdk_Linux系列(七)——linux其他指令【rpm、yum、sudo】
  5. a8处理器相当于骁龙几_天玑700处理器怎么样 天玑700相当于骁龙多少_CPU_硬件教程...
  6. python为什么closed_为什么Python无法解析此JSON数据? [关闭] - Why can't Python parse this JSON data? [closed]...
  7. Linux上的JAVA的IDE,在linux上运行的基于文本的强大java IDE
  8. mysql登陆 慢_mysql登陆慢问题解决
  9. 升级bios_华硕400系主板升级BIOS:静待11代酷睿CPU
  10. python numpy和pandas库的区别_python – 来自熊猫和numpy的意思不同