iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >怎么在redis中使用watch实现一个秒杀抢购功能
  • 356
分享到

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

2024-04-02 19:04:59 356人浏览 安东尼
摘要

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

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

具体内容如下

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

代码:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import redis.clients.jedis.Jedis;


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<Object> 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实现一个秒杀抢购功能问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网数据库频道了解更多相关知识。

您可能感兴趣的文档:

--结束END--

本文标题: 怎么在redis中使用watch实现一个秒杀抢购功能

本文链接: https://www.lsjlt.com/news/55440.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么在redis中使用watch实现一个秒杀抢购功能
    怎么在redis中使用watch实现一个秒杀抢购功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。具体内容如下1、使用watch,采用乐观...
    99+
    2022-10-18
  • 使用Python怎么实现一个京东抢秒杀效果
    这篇文章将为大家详细讲解有关使用Python怎么实现一个京东抢秒杀效果,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动...
    99+
    2023-06-14
  • thinkphp中怎么利用redis实现秒杀缓存功能
    thinkphp中怎么利用redis实现秒杀缓存功能,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1,安装redis,根据自己的php版本安装对应的redis扩...
    99+
    2023-06-19
  • 使用python怎么实现抢购功能
    本篇文章给大家分享的是有关使用python怎么实现抢购功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。python是什么意思Python是一种跨平台的、具有解释性、编译性、互...
    99+
    2023-06-06
  • 使用redis怎么实现一个排行榜功能
    使用redis怎么实现一个排行榜功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。加入排行榜获取redis实例import redismain_rds...
    99+
    2023-06-15
  • 怎么用ThinkPHP实现一个购物车功能
    这篇文章主要介绍“怎么用ThinkPHP实现一个购物车功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么用ThinkPHP实现一个购物车功能”文章能帮助大家解决问题。首先,我们需要创建一个数据库...
    99+
    2023-07-06
  • Redis中怎么实现一个计数器功能
    这期内容当中小编将会给大家带来有关Redis中怎么实现一个计数器功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。使用字符串键下面代码演示了如何利用 Redis 中的字符...
    99+
    2022-10-18
  • 怎么在Java中利用Redis实现一个高并发计数器功能
    这篇文章主要介绍了怎么在Java中利用Redis实现一个高并发计数器功能,编程网小编觉得不错,现在分享给大家,也给大家做个参考,一起跟随编程网小编来看看吧!Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、...
    99+
    2023-06-06
  • 怎么在java中实现一个sleep功能
    这篇文章给大家介绍怎么在java中实现一个sleep功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. 客户端开发;4. 网页开...
    99+
    2023-06-14
  • 怎么在Java8中使用Collectors实现一个求和功能
    怎么在Java8中使用Collectors实现一个求和功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。自定义工具类public class MyColle...
    99+
    2023-06-06
  • 怎么在python中使用PyQt5实现一个窗口功能
    怎么在python中使用PyQt5实现一个窗口功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。python主要应用领域有哪些1、云计算,典型应用OpenSta...
    99+
    2023-06-14
  • 怎么在html5中使用Geolocation实现一个定位功能
    今天就跟大家聊聊有关怎么在html5中使用Geolocation实现一个定位功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.获取当前位置 我们将使用getCurrentPosi...
    99+
    2023-06-09
  • 怎么在Android中实现一个摇一摇功能
    本篇文章给大家分享的是有关怎么在Android中实现一个摇一摇功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。步骤1:声明一个SensorManager对象步骤2:重写Act...
    99+
    2023-06-14
  • 怎么使用java和redis实现一个简单的热搜功能
    这篇文章主要介绍“怎么使用java和redis实现一个简单的热搜功能”,在日常操作中,相信很多人在怎么使用java和redis实现一个简单的热搜功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用jav...
    99+
    2023-06-29
  • 怎么在html5中实现一个时钟功能
    这期内容当中小编将会给大家带来有关怎么在html5中实现一个时钟功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。<!DOCTYPE HTML><html><hea...
    99+
    2023-06-09
  • 使用canvas怎么实现一个在线签名功能
    这期内容当中小编将会给大家带来有关使用canvas怎么实现一个在线签名功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。什么是 Canvas?Canvas 是 HTML5 新增的元素,用于在网页上绘制图形...
    99+
    2023-06-09
  • 怎么在C#中使用MJPEG实现一个客户端功能
    怎么在C#中使用MJPEG实现一个客户端功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。环境:服务端MJPEG服务器使用的是手机的DroidCam,很方便的一个MJPEG服务...
    99+
    2023-06-06
  • 怎么在Android 应用中实现一个换肤功能
    今天就跟大家聊聊有关怎么在Android 应用中实现一个换肤功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Android换肤技术总结背景纵观现在各种Android app,其换肤...
    99+
    2023-05-31
    android roi
  • 使用java怎么实现一个ATM功能
    使用java怎么实现一个ATM功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言...
    99+
    2023-06-14
  • 怎么在Android中实现一个倒计时功能
    本篇文章给大家分享的是有关怎么在Android中实现一个倒计时功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。以30分钟为例写的一个倒计时:public class Main...
    99+
    2023-05-31
    android roi %d
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作