场景分析:奖品、数量、概率;
1.应用redis做一个奖池,即存储好码(实际应该过程中应该落在数据库中);
2.用户进入抽取号码;
模拟实现:
1.依赖配置:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.4.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.8.0</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>5.1.8.RELEASE</version> <scope>compile</scope> </dependency> <dependency> <groupId>net.minidev</groupId> <artifactId>json-smart</artifactId> <version>2.3</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.1.8.RELEASE</version> </dependency> </dependencies>
-----------------------------------application.properties----------------------
server.port=9001 spring.redis.database=0 # server host1 单机使用,对应服务器ip spring.redis.host=192.168.1.11 # server password 密码,如果没有设置可不配 #spring.redis.password= #connection port 单机使用,对应端口号 spring.redis.port=10179 # pool settings ...池配置 spring.redis.pool.max-idle=8 spring.redis.pool.min-idle=0 spring.redis.pool.max-active=8 spring.redis.pool.max-wait=-1
2.创建Conreoller
package com.cc.springbootredislottery; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; @RestController @RequestMapping("lottery") public class LotteryController { @Resource private LotteryService lotteryService; //创建奖池 @GetMapping("init/{count}") public void init(@PathVariable int count){ lotteryService.initLottery(count); } //获取抽奖号码 @GetMapping("get") public String get(){ return lotteryService.getLottery(); } }
3.创建service实现
package com.cc.springbootredislottery; import io.netty.util.internal.StringUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.util.ArrayList; import java.util.Collections; import java.util.List; @Service @Slf4j public class LotteryService { //定义redis KEY名 static final String LOTTERY_POOL = "LOTTERY_POOL"; @Resource private RedisTemplate redisTemplate; //初始化奖池 public void initLottery(int count){ //创建一个List存放0-count,随机打乱存入redis list中 List<String> numList = new ArrayList<>(count); for(int i = 1;i < count; i++){ //将号码出入奖池,并做号码补位处理,"%04d"不是固定,可以做追加,所以取count的字符串长度 numList.add(String.format("%0"+String.valueOf(count)+"d",i)); } //随机打乱顺序 Collections.shuffle(numList); //存入redis Long result = redisTemplate.opsForList().leftPushAll(LOTTERY_POOL,numList); log.info("add result:{}",result); } //获取抽奖号码 public String getLottery() { String num = String.valueOf(redisTemplate.opsForList().rightPop(LOTTERY_POOL)); if (num.equals("")){ throw new RuntimeException("抽奖结束了!"); } return num; } }