千家信息网

怎么在redis中使用watch实现一个秒杀抢购功能

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,怎么在redis中使用watch实现一个秒杀抢购功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。具体内容如下1、使用watch,采
千家信息网最后更新 2026年11月03日怎么在redis中使用watch实现一个秒杀抢购功能

怎么在redis中使用watch实现一个秒杀抢购功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

具体内容如下

1、使用watch,采用乐观锁
2、不使用悲观锁,因为等待时间非常长,响应慢
3、不使用队列,因为并发量会让队列内存瞬间升高

代码:

import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import redis.clients.jedis.Jedis;/** * redis测试抢购 *  * @author 10255_000 *  */public class RedisTest { public static void main(String[] args) {  final String watchkeys = "watchkeys";  ExecutorService executor = Executors.newFixedThreadPool(20);  final Jedis jedis = new Jedis("192.168.3.202", 6379);  jedis.set(watchkeys, "0");// 重置watchkeys为0  jedis.del("setsucc", "setfail");// 清空抢成功的,与没有成功的  jedis.close();  for (int i = 0; i < 10000; i++) {// 测试一万人同时访问   executor.execute(new MyRunnable());  }  executor.shutdown(); }}import java.util.List;import java.util.UUID;import redis.clients.jedis.Jedis;import redis.clients.jedis.Transaction;public class MyRunnable implements Runnable { String watchkeys = "watchkeys";// 监视keys Jedis jedis = new Jedis("192.168.3.202", 6379); public MyRunnable() { } @Override public void run() {  try {   jedis.watch(watchkeys);// watchkeys   String val = jedis.get(watchkeys);   int valint = Integer.valueOf(val);   String userifo = UUID.randomUUID().toString();   if (valint < 10) {    Transaction tx = jedis.multi();// 开启事务    tx.incr("watchkeys");    List list = tx.exec();// 提交事务,如果此时watchkeys被改动了,则返回null    if (list != null) {     System.out.println("用户:" + userifo + "抢购成功,当前抢购成功人数:"       + (valint + 1));     /* 抢购成功业务逻辑 */     jedis.sadd("setsucc", userifo);    } else {     System.out.println("用户:" + userifo + "抢购失败");     /* 抢购失败业务逻辑 */     jedis.sadd("setfail", userifo);    }   } else {    System.out.println("用户:" + userifo + "抢购失败");    jedis.sadd("setfail", userifo);    // Thread.sleep(500);    return;   }  } catch (Exception e) {   e.printStackTrace();  } finally {   jedis.close();  } }}

Redis对事物的支持目前比较简单。Redis只能保证一个client发起的事务中的命令可以连续的执行,但后面命令出错前面不会回滚。而中间不会插入其他client的命令。当一个client在找一个连续中发出multi命令时,这个链接会进入一个事务上下文,该链接后续的命令不会立即执行,而是先放到队列中,当执行exec命令是,redis会顺序的执行队列中的所有命令。当如果队列中有命令错误,不会回滚。

乐观锁:大多数是基于数据版本(version)的记录机制实现的。即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表添加一个"version"字段来实现读取出数据时,将此版本号一同读出,之后更新时,对此版本号+1。此时,将提交数据的版本号与数据库表对应记录版本号进行比对,如果提交的数据版本号大于数据当前版本号,则予以更新,否则认为是过去数据。

在Redis中,使用watch命令实现乐观锁(watch key):
watch命令会监视给定的key,当exec时,如果监视的key从调用watch后发生过变化,则事务会失败,也可以调用wathc多长监视多个key。这样就可以对指定key加乐观锁了。注意watch的可以是对整个连接有效的。事务也一样。如果连接断开,监视和事务都会被自动清除。当然exec,discard,unwatch命令都会清除连接中的所有监视。

关于怎么在redis中使用watch实现一个秒杀抢购功能问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

命令 数据 版本 事务 监视 成功 队列 乐观 数据库 用户 问题 功能 业务 内容 更多 逻辑 链接 帮助 更新 测试 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 新华互联网科技学校 科技创新与互联网经济 科技互联网政务服务 互联网科技公司电话 互联网科技缩写 伴你行互联网科技有限公司 互联网高科技股票 蓝色互联网科技 湖南洣水互联网科技有限公司扣款 阿里巴巴算科技企业还是互联网 世界互联网科技公司市值排名 荆州市昕露互联网络科技有限公司 千方科技属于互联网企业吗 河南住房之家互联网科技 用友工业互联网科技发展 浙南科技城互联网大厦招聘 2021世界互联网领先科技成果发布 珠海东科互联网科技有限公司 唯美互联网科技 互联网科技创业计划的风险分析 华宇互联网科技 米客互联网科技 广州紫鲸互联网科技 互联网科技革命什么开始 玉溪新华互联网科技好不好 华中科技大学互联网的牛人 深圳互联网科技的发展 信承诺互联网科技有限公司 长沙渺峰互联网科技有限公司 东风日产互联网科技公司叫什么
0