全局ID生成器
当用户抢购时,就会生成服务器托管网订单并保存到订单这张表中,而订单表如果使用数据库自增ID就存在一些问题 :
●id的规律性太明显,用户可以进行猜测
●受单表数据量的限制
全局ID生成器,是一种在分布式系统下用来生成全局唯一ID的工具,一般要满足下列特性:
●唯一性
●高可用
●高性能
●递增性
●安全性
public long nextId(String keyPrefix) {
// 1.生成时间戳
LocalDateTime now = LocalDateTime.now();
long nowSecond = now.toEpochSecond(ZoneOffset.UTC);
long timestamp = nowSecond - BEGIN_TIMESTAMP;
// 2.生成序列号
// 2.1.获取当前日期,精确到天
String date = now.format(DateTimeFormatter.ofPattern("yyyy:MM:dd"));
// 2.2.自增长
long count = stringRedisTemplate.opsForValue().increment("icr:" + keyPrefix + ":" + date);
/服务器托管网/ 3.拼接并返回
return timestamp
全局唯一ID生成策略:
●UUID
●Redis自增
●snowflake算法
●数据库自增
Redis全局ID生成策略
●每天一个key,方便统计订单量
●ID构造是时间戳+计数器
实现优惠券秒杀的下单功能
下单时需要判断两点:
●秒杀是否开始或结束,如果尚未开始或已经结束则无法下单
●库存是否充足,不足则无法下单
乐观锁解决超卖问题
乐观锁的关键是判断之前查询得到的数据是否有被修改过
乐观锁SQL(更新数据时用)
update goods set set stock = stock - 1 where voucher_id = 1 and stock > 0
超卖这样的线程安全问题,解决方案有哪些?
1.悲观锁:添加同步锁,让线程串行执行
优点:简单粗暴
缺点:性能一般
2.乐观锁: 不加锁,在更新时判断是否有其它线程在修改
优点:性能好
缺点:存在成功率低的问题
一人一单(分布式锁)
需求:修改秒杀业务,要求同一个优惠券,一个用户只能下一单
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
相关推荐: [SpringSecurity5.6.2源码分析十]:HeaderWriterFilter
前言 •为了安全考虑,添加启用浏览器保护的某些头是很有用的,比如X-Frame-Options, X-XSS-Protection和X-Content-Type-Options •而HeaderWriterFilter就支持往响应头写入各种响应头 1、Head…