开发者学堂课程【使用 Redis 消息队列完成秒杀过期订单处理 :失效问题处理:模拟获取优惠券】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/729/detail/13021
失效问题处理:模拟获取优惠券
内容介绍
一.编写测试类
上章介绍了优惠券失效问题的业务流程处理规则,本章在获取优惠券的代码中 java 中编写测试代码,以此来模拟用户来获取优惠券。
一.编写测试类
1.过程
首先在 java 包下新建一 个 CouponTest 优惠劵测试类,将其放置到 cn.itcast.coupon.test 包下。在其中进行获取优惠券,以及将其保存到数据库和 redis 服务器中的过程。
由于所有的内容都交给 spirng 容器来进行配置,所以采用 spring 相关的单元测试环境,同时再添加一个加载配置文件 locations,在 resources 下都已经准备完成,其中配置了数据库的基本信息,以及引入了 redis 的其他配置文件。
- CouponTest.java 代码如下:
package cn.itcast.coupon.test;
import org.junit.runner.Runwith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.Spring]Unit4ClassRunner;
//采用 spring 相关的单元测试环境
@Runwith(SpringJUnit4ClassRunner.class)
//引入配置文件路径
@ContextConfiguration(locations="classpath:applicationContext.xml")
Public class CouponTest{
//因为在其中涉及到了数据库和 Redis 服务器的操作,所以需要依赖注入以下内容
//@Autowired 为注入,在此使用的是 mybits 框架,定义一个 CouponMapper,注入增删改查操作
@Autowired
private CouponMapper coupoMapper;
//注入定义的 RedisTemplate,参数皆为 String 类型
@Autowired
private RedisTemplate<String,String> redisTemplate
/**
*1.模拟一个优惠券,即创建一个优惠券
*2.保存到数据库中
*3.保存到 redis 服务器中,设置超时时间
*/
//编写测试,获取优惠券,出现报错后导包即可
@Test
Public void testGetCoupon(){
//流程1.手动 new 一个优惠券,设置参数2.保存到数据库中3.最后在放在 redis 服务器中,去设置它的超时时间
//获取优惠券的时间
Data now =new Date();
//优惠券的超时时间:1分钟
int timeOut =1;
//自定义一个优惠券,相当于 new 一个新对象
Coupon coupon=new Coupon();
//逐个设置属性,通过对象名+.的形式挨个设置,其中id在数据库中设置的为逐个自增,不需要设置
//设置名称,为测试优惠券
coupon.setName("测试优惠券");
//设置金额
coupon.setMoney(BigDecimal.ONE);
//设置购物券描述
coupon.setCouponDesc("全品类优惠券1元");
//设置购物券获取时间,为 now
coupon. setCreateTime(now);
//设置购物券过期时间,通过调用工具类 DataUtils.addTime 方法,将 now(当前时间)和 timeout(需要增加的分钟)两个参数传入。因为设置的优惠券失效时间为1分钟,所以过期时间应为当前时间+1即可。
//设置优惠券的失效时间
Coupon.setExpireTime(DataUtils.addTime(now,timeOut));
//设置刚获取优惠券的状态,0表示有效
Coupon.setState(0);
//使用 mybits 将优惠券保存到数据库中
couponMapper.saveCoupon(coupon);
//将优惠券设置到 redis 缓存中,并且设置超时时间,在此需要使用 redisTemplate 操作,同时注意 String 类型需要使用 opsForValue()方法,同时 Set 方法采用 set(key,value,timeout,unit)帮助将优惠券信息存入缓存中。
要采用 key 来做失效通知功能,所以 key 只是采用之前固定的规则,coupon:+ 优惠券 id,value 属性并没有真正使用,和 key 值一致即可。timeout 为失效时间,unit 为时间的单位,因为设置到服务器后可能是1小时/一天失效,所以需要指定时间单位,在此设置为一分钟
redisTemplate.opsForValue().set(“coupon:”+coupon.getId(),coupon.getId()+””,timeOut,TimeUnit.MINUTES);
}
}
到此已经成功保存了一条优惠券的记录到数据库中,同时也将其放到了 redis 缓存中,同时还设置了它的失效时间,为一分钟。
2.验证测试类
右键 Run As 执行编写完的测试程序,会看到数据库中出现一条 id 为9,state 状态为0的记录,同时显示的时间也对应着当前时间。则说明成功。
最后再打开 redis 客户端,输入命令:keys *,就可以看到与数据库一致的 coupon:9 优惠券数据信息。
再输入命令:ttl coupon:9 查看其的超时时间,就会显示当前剩余的时间。就说明整个过程没有问题。