springboot集成redis实现简单秒杀系统

本文实例为大家分享了springboot集成redis实现简单秒杀系统的具体代码,供大家参考,具体内容如下

项目是有地址的,我会放到文章的最后面

1. 直接service,我们会介绍两种秒杀模式

public interface GoodsService {

 /**
  * 通过lua脚本实现的秒杀
  * @param skuCode 商品编码
  * @param buyNum 购买数量
  * @return 购买数量
  */
 Long flashSellByLuaScript(String skuCode,int buyNum);
 /**
  * 通过redis 事务 实现的秒杀
  * @param skuCode 商品编码
  * @param buyNum 购买数量
  * @return 购买数量
  */
 Long flashSellByRedisWatch(String skuCode,int buyNum);

}

2. service实现类

import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.SessionCallback;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Collections;
import java.util.List;

@Service
public class GoodsServiceImpl implements GoodsService {

 @Resource
 private StringRedisTemplate stringRedisTemplate;

 @Override
 public Long flashSellByLuaScript(String skuCode,int num) {
  //下面是lua脚本
  String luaScript ="local buyNum = ARGV[1]\n" +
    "local goodsKey = KEYS[1] \n" +
    "local goodsNum = redis.call('get',goodsKey) \n" +
    "if goodsNum >= buyNum \n" +
    "then redis.call('decrby',goodsKey,buyNum) \n" +
    "return buyNum \n" +
    "else \n" +
    "return '0'\n" +
    "end\n" +
    "\n" ;

  DefaultRedisScript<String> re = new DefaultRedisScript<String>();
  //设置脚本
  re.setScriptText(luaScript);
  //定义返回值类型,注意,如果没有这个定义,Spring不会返回结果
  re.setResultType(String.class);
  RedisSerializer<String> stringRedisSerializer = stringRedisTemplate.getStringSerializer();
  //执行LUA脚本
  String result = (String) stringRedisTemplate.execute(re, stringRedisSerializer, stringRedisSerializer, null);
  return Long.valueOf(result);
 }

 @Override
 public Long flashSellByRedisWatch(String skuCode,int num){

  SessionCallback<Long> sessionCallback = new SessionCallback<Long>() {
   @Override
   public Long execute(RedisOperations operations) throws DataAccessException {
    int result = num;
    //redis 乐观锁
    //我们观察商品编码是否发生改变
    operations.watch(skuCode);
    ValueOperations<String, String> valueOperations = operations.opsForValue();
    String goodsNumStr = valueOperations.get(skuCode);
    Integer goodsNum = Integer.valueOf(goodsNumStr);
    //标记一个事务块的开始。
    //事务块内的多条命令会按照先后顺序被放进一个队列当中,
    //最后由 EXEC 命令原子性(atomic)地执行。
    operations.multi();
    if (goodsNum >= num) {
     valueOperations.increment(skuCode, 0 - num);
    } else {
     result = 0;
    }
    //多条命令执行的结果集合
    List exec = operations.exec();
    if(exec.size()>0){
     System.out.println(exec);
    }
    return (long) result;
   }
  };
  return stringRedisTemplate.execute(sessionCallback);
 }
//省略 其他的方法

}

3. controller

但是首先要向你的redis里面仍一个数据,key='xiaomi',value='100'

@ApiOperation(value = "用事务秒杀测试接口", notes = "用事务秒杀测试接口")
@RequestMapping(value = "/miaoTransaction", method = RequestMethod.GET)
@ResponseBody
 public Long miaoTransaction() {

  Long res = goodsService.flashSellByRedisWatch("xiaomi", 1);
  return res;
 }

 @ApiOperation(value = " 秒杀Lua测试接口", notes = "秒杀Lua测试接口")
 @RequestMapping(value = "/miaoLua", method = RequestMethod.GET)
 @ResponseBody
 public Long miaoLua() {

  Long res = goodsService.flashSellByRedisWatch("xiaomi", 1);
  System.out.println(res.toString());
  return res;
 }

然后就可以用jemeter并发访问了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • springboot集成开发实现商场秒杀功能

    springboot集成开发实现商场秒杀 加入主要依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <!-- alibaba的druid数据库连接池 --> <dependency> <groupId

  • 如何通过SpringBoot实现商城秒杀系统

    这篇文章主要介绍了如何通过SpringBoot实现商城秒杀系统,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 学习自:地址 1.主要流程 1.1数据库: 1.2 环境 window下:Zookeeper,Redis,rabbitmq-server.jdk1.8以上. 1.3 介绍 这里只做秒杀部分功能,其他功能不会涉及.项目运行后可访问秒杀商品页面 当用户没登陆,点击详情会跳转到登陆页面. 用户登陆后可以查看商品的详情并进行抢购. 注意,用户对

  • SpringBoot使用Redisson实现分布式锁(秒杀系统)

    前面讲完了Redis的分布式锁的实现,接下来讲Redisson的分布式锁的实现,一般提及到Redis的分布式锁我们更多的使用的是Redisson的分布式锁,Redis的官方也是建议我们这样去做的.Redisson点我可以直接跳转到Redisson的官方文档. 1.1.引入Maven依赖 <dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter&l

  • springboot集成redis实现简单秒杀系统

    本文实例为大家分享了springboot集成redis实现简单秒杀系统的具体代码,供大家参考,具体内容如下 项目是有地址的,我会放到文章的最后面 1. 直接service,我们会介绍两种秒杀模式 public interface GoodsService { /** * 通过lua脚本实现的秒杀 * @param skuCode 商品编码 * @param buyNum 购买数量 * @return 购买数量 */ Long flashSellByLuaScript(String skuCode

  • SpringBoot集成Redis实现验证码的简单案例

    目录 一.下载安装Redis 二.代码部分 总结 前言 一次学习过程中简单的记录 一.下载安装Redis 这里就不多说了,下载安装好Redis,最好是把Redis Desktop Manager一起安装了,可视化看的舒服一点. 二.代码部分 1.引入库,配置yml 引入Redis依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter

  • 使用SpringBoot集成redis的方法

    今天,日月在这里教大家如何使用springBoot集成redis,说实话比较简单,网上也有大把的教程.先套用一下网上的简介. 定义 REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统. Redis是一个开源的使用ANSI C语言编写.遵守BSD协议.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. 它通常被称为数据结构服务器,因为值(value)可以是 字符串(S

  • SpringBoot集成Redis并实现主从架构的实践

    目录 一.Windows环境下安装Redis 设置键值对 根据key获取value 二.SpringBoot连接Redis (1)使用Jedis类直接连接Redis服务器 (2)通过配置文件进行连接 三.使用连接池操作Redis 今天这篇文章来和大家分享一下在springboot中如何集成redis,并实现主从架构,进行数据的简单存储. 我的Redis是部署在Windows系统下面的,所以在这里附上Redis在Windows环境下的安装地址和安装说明. 一.Windows环境下安装Redis 首

  • SpringBoot集成Redis数据库,实现缓存管理

    目录 一.Redis简介 二.Spring2.0集成Redis 1.核心依赖 2.配置文件 3.简单测试案例 4.自定义序列化配置 5.序列化测试 三.源代码地址 一.Redis简介 Spring Boot中除了对常用的关系型数据库提供了优秀的自动化支持之外,对于很多NoSQL数据库一样提供了自动化配置的支持,包括:Redis, MongoDB, Elasticsearch.这些案例整理好后,陆续都会上传Git. SpringBoot2 版本,支持的组件越来越丰富,对Redis的支持不仅仅是扩展

  • SpringBoot集成Redis的思路详解

    目录 SpringBoot集成Redis 1.概述 2.测试Redis 3.自定义redisTemplate SpringBoot集成Redis 1.概述 Redis是什么? Redis(Remote Dictionary Server ),即远程字典服务. 是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. 与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数据写入磁盘

  • Java SpringBoot 集成 Redis详解

    目录 1.概述 Redis是什么? Redis能该干什么? 特性 2.测试Redis 3.自定义redisTemplate 1.概述 Redis是什么? Redis(Remote Dictionary Server ),即远程字典服务. 是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. 与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加

  • SpringBoot+RabbitMQ+Redis实现商品秒杀的示例代码

    目录 业务分析 创建表 功能实现 1.用户校验 2.下单 3.减少库存 4.支付 总结 业务分析 一般而言,商品秒杀大概可以拆分成以下几步: 用户校验 校验是否多次抢单,保证每个商品每个用户只能秒杀一次 下单 订单信息进入消息队列,等待消费 减少库存 消费订单消息,减少商品库存,增加订单记录 付款 十五分钟内完成支付,修改支付状态 创建表 goods_info 商品库存表 列 说明 id 主键(uuid) goods_name 商品名称 goods_stock 商品库存 package com.

  • SpringBoot集成Redis—使用RedisRepositories详解

    目录 SpringBoot集成Redis 1.添加redis依赖 2.在application.properties中添加redis配置信息 3.SpringBoot启动类中添加注解配置 4.创建实体类Entity 5.创建Dao层——数据操作层 6.创建Service层——服务层 7.创建Controller层——控制层 8.redis配置类 Redis中的结构为 redis封装工具类 SpringBoot集成Redis 1.添加redis依赖 <dependency>   <grou

随机推荐