杭州网站建设时,哪些免费PSD素材网站值得推荐?

摘要:杭州网站建设前三,免费psd素材网,网站制作网页版,青岛房产网房天下先看基本的业务流程 那么我们可以看到整个流程都是一个线程来完成的,这样的话耗时还是很长的,那么可不可以采用多线程
杭州网站建设前三,免费psd素材网,网站制作网页版,青岛房产网房天下先看基本的业务流程 那么我们可以看到整个流程都是一个线程来完成的#xff0c;这样的话耗时还是很长的#xff0c;那么可不可以采用多线程去实现呢#xff1f; 首先我们要思考怎么对业务进行拆分#xff0c;可以想象一个我们去饭店点餐#xff0c;会有前台接待#xff…先看基本的业务流程 那么我们可以看到整个流程都是一个线程来完成的这样的话耗时还是很长的那么可不可以采用多线程去实现呢 首先我们要思考怎么对业务进行拆分可以想象一个我们去饭店点餐会有前台接待询问订单之后将小票传给后厨去做饭这样就会快很多也可以接待更多的客人 也就是说 一个线程负责去读数据库做准备工作另一个线程去实现写操作如下图中所示 确定了我们可以将判断库存和检验一人一单业务抽取出来之后我们在想一下 还能不能优化这个时候我们会发现这两个操作还是在数据库进行的那么mysql的并发本身也是不高的现在我们就要通过另一个性能更好的数据库进行实现就是redis 这样只需要业务进行到校验完成就可以给用户返回下单完成的信息之后在通过另一个线程异步进行扣减库存操作 redis中实现上面两个操作的业务流程如下 由于操作流程较长应该使用lua脚本来保证原子性 将上面的逻辑采用lua脚本进行编写之后程序运行首先判断返回值如果是0就说明用户有下单资格如果是1或者2就说明用户没有资格下单 如果有下单资格就可以将用户id优惠券id和订单id存入一个阻塞队列里面之后异步进行写入数据库操作 整体流程 提供lua脚本代码 -- 1.参数列表 -- 1.1.优惠券id local voucherId ARGV[1] -- 1.2.用户id local userId ARGV[2] -- 1.3.订单id local orderId ARGV[3]-- 2.数据key -- 2.1.库存key local stockKey seckill:stock: .. voucherId -- 2.2.订单key local orderKey seckill:order: .. voucherId-- 3.脚本业务 -- 3.1.判断库存是否充足 get stockKey if(tonumber(redis.call(get, stockKey)) 0) then-- 3.2.库存不足返回1return 1 end -- 3.2.判断用户是否下单 SISMEMBER orderKey userId if(redis.call(sismember, orderKey, userId) 1) then-- 3.3.存在说明是重复下单返回2return 2 end -- 3.4.扣库存 incrby stockKey -1 redis.call(incrby, stockKey, -1) -- 3.5.下单保存用户sadd orderKey userId redis.call(sadd, orderKey, userId) -- 3.6.发送消息到队列中 XADD stream.orders * k1 v1 k2 v2 ... redis.call(xadd, stream.orders, *, userId, userId, voucherId, voucherId, id, orderId) return 0 使用方式 private static final DefaultRedisScriptLong SECKILL_SCRIPT;static {SECKILL_SCRIPT new DefaultRedisScript();SECKILL_SCRIPT.setLocation(new ClassPathResource(seckill.lua));SECKILL_SCRIPT.setResultType(Long.class);}Overridepublic Result seckillVoucher(Long voucherId) {Long userId UserHolder.getUser().getId();long orderId redisIdWorker.nextId(order);// 1.执行lua脚本Long result stringRedisTemplate.execute(SECKILL_SCRIPT,Collections.emptyList(),voucherId.toString(), userId.toString(), String.valueOf(orderId));int r result.intValue();// 2.判断结果是否为0if (r ! 0) {
阅读全文