redis 加锁
来源:互联网 发布:淘宝评论专业配图 编辑:程序博客网 时间:2024/05/19 23:27
package com.fuwo.b3d.order.service;import com.fuwo.b3d.common.RestResult;import com.fuwo.b3d.enums.StatusEnum;import com.fuwo.b3d.model.model.Model;import com.fuwo.b3d.model.model.ModelPack;import com.fuwo.b3d.model.service.repository.ModelPackRepository;import com.fuwo.b3d.model.service.repository.ModelRepository;import com.fuwo.b3d.order.model.Order;import com.fuwo.b3d.order.service.repository.OrderRepository;import com.fuwo.b3d.user.model.UserInfo;import com.fuwo.b3d.user.model.UserModel;import com.fuwo.b3d.user.service.repository.UserInfoRepository;import com.fuwo.b3d.user.service.repository.UserModelRepository;import net.sf.json.JSONObject;import org.apache.commons.lang.StringUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.config.RuntimeBeanNameReference;import org.springframework.cache.annotation.CacheConfig;import org.springframework.data.domain.Example;import org.springframework.data.domain.Page;import org.springframework.data.domain.Pageable;import org.springframework.data.redis.connection.RedisConnection;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.http.HttpEntity;import org.springframework.http.HttpHeaders;import org.springframework.http.MediaType;import org.springframework.http.client.ClientHttpRequestFactory;import org.springframework.stereotype.Service;import org.springframework.util.Assert;import org.springframework.util.LinkedMultiValueMap;import org.springframework.util.MultiValueMap;import org.springframework.web.client.RestTemplate;import sun.rmi.transport.ObjectTable;import javax.transaction.Transactional;import java.util.ArrayList;import java.util.List;import java.util.UUID;import java.util.concurrent.TimeUnit;@CacheConfig(cacheNames = "com.fuwo.b3d.orders")@Transactional@Servicepublic class OrderServiceImpl implements OrderService { @Autowired private OrderRepository orderRepository; @Autowired private UserModelRepository userModelRepository; @Autowired private UserInfoRepository userInfoRepository; @Autowired private ClientHttpRequestFactory clientHttpRequestFactory; @Autowired private RedisTemplate redisTemplate; @Autowired private ModelPackRepository modelPackRepository; @Autowired private ModelRepository modelRepository; private static final String PAY_URL = "http://192.168.2.221/fcoin/trade/"; private static String LOCK_KEY = "redis_lock_%s_%s"; @Override public Page<Order> pageQuery(Example<Order> example, Pageable pageable) { Assert.notNull(example); Assert.notNull(pageable); return orderRepository.findAll(example, pageable); } @Override public Order save(Order order) { Assert.notNull(order); return orderRepository.save(order); } @Override public Order findByNo(String no) { Assert.notNull(no); return orderRepository.findByNo(no); } @Override public RestResult pay(Order order) { Assert.notNull(order); RestResult restResult = new RestResult(); String no = order.getNo(); String type = StringUtils.substring(no, 24, 26); String pk = StringUtils.substring(no, 26, 36); if (order.getState() == Order.OrderStatusEnum.SUCCESS) { restResult.setCode(RestResult.ResultCodeEnum.ORDER_PAYED.getCode()); restResult.setMsg(RestResult.ResultCodeEnum.ORDER_PAYED.getDesc()); return restResult; } String key = String.format(LOCK_KEY, order.getUserInfo().getId(), type + pk); String value = String.valueOf(System.currentTimeMillis()); JSONObject json = null; boolean lock = false; String createTime = redisTemplate.opsForValue().get(key).toString(); if (StringUtils.isNotBlank(createTime)) { //查看锁是否过期 long currentTime = System.currentTimeMillis(); //存活时间 long existTime = currentTime - Long.valueOf(createTime); if (existTime > 3 * 60 * 1000) { //超过三分钟,删除 redisTemplate.delete(key); } } RedisConnection redisConnection = redisTemplate.getConnectionFactory().getConnection(); try { lock = redisConnection.setNX(key.getBytes(), value.getBytes()); if (!lock) { restResult.setCode(RestResult.ResultCodeEnum.DUPLICATE_REQUEST.getCode()); restResult.setMsg(RestResult.ResultCodeEnum.DUPLICATE_REQUEST.getDesc()); return restResult; } RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory); MultiValueMap<String, Object> params = new LinkedMultiValueMap<String, Object>(); params.set("uid", order.getUserInfo().getId()); params.set("amount", order.getAmount() * (-1));//扣减 params.set("deal_type", "8"); params.set("remark", order.getDealType().getDesc()); json = restTemplate.postForEntity(PAY_URL, params, JSONObject.class).getBody(); if (json == null) { restResult.setCode(RestResult.ResultCodeEnum.ERROR.getCode()); restResult.setMsg(RestResult.ResultCodeEnum.ERROR.getDesc()); } else { String code = json.getString("code"); String msg = json.getString("msg"); if (StringUtils.equals(RestResult.ResultCodeEnum.SUCC.getCode(), code)) { //扣款成功,处理业务数据 dealOrder(restResult, order); if (!StringUtils.equals(RestResult.ResultCodeEnum.SUCC.getCode(), restResult.getCode())) { throw new RuntimeException("付款成功 ,购买失败:" + restResult.getMsg()); } } else { restResult.setCode(code); restResult.setMsg(msg); } } } catch (Exception e) { restResult.setCode(RestResult.ResultCodeEnum.ERROR.getCode()); restResult.setMsg(RestResult.ResultCodeEnum.ERROR.getDesc() + e.getMessage()); } finally { if (StringUtils.equals(redisTemplate.opsForValue().get(key).toString(), value)) { redisTemplate.delete(key); } } return restResult; } private void dealOrder(RestResult restResult, Order order) { String id = StringUtils.substring(order.getNo(), 26, 36); UserInfo userInfo = null; switch (order.getDealType()) { case MODELPACK: ModelPack modelPack = modelPackRepository.findOne(Long.valueOf(id)); if (modelPack == null) { restResult.setCode(RestResult.ResultCodeEnum.GOODS_NOT_EXISTS.getCode()); restResult.setMsg(RestResult.ResultCodeEnum.GOODS_NOT_EXISTS.getDesc()); return; } List<ModelPack> modelPacks = order.getUserInfo().getModelPacks(); if (modelPacks == null) { modelPacks = new ArrayList<>(); } modelPacks.add(modelPack); userInfo = order.getUserInfo(); userInfo.setModelPacks(modelPacks); //获取模型下的模型包 List<Model> packModels = modelPack.getModels(); List<Model> userModels = userInfo.getModels(); userModels.addAll(packModels); userInfo.setModels(userModels); userInfoRepository.save(userInfo); break; case MODEL: Model model = modelRepository.findOne(Integer.valueOf(id)); if (model == null) { restResult.setCode(RestResult.ResultCodeEnum.GOODS_NOT_EXISTS.getCode()); restResult.setMsg(RestResult.ResultCodeEnum.GOODS_NOT_EXISTS.getDesc()); return; } /* UserModel userModel = new UserModel(); userModel.setModelId(model.getId()); userModel.setStatus(StatusEnum.ENABLE); userModel.setUid(order.getUid()); userModelRepository.save(userModel);*/ userInfo = order.getUserInfo(); List<Model> current = userInfo.getModels(); if (current == null) { current = new ArrayList<>(); } current.add(model); userInfo.setModels(current); userInfoRepository.save(userInfo); break; } order.setState(Order.OrderStatusEnum.SUCCESS); orderRepository.save(order); restResult.setCode(RestResult.ResultCodeEnum.SUCC.getCode()); restResult.setMsg(RestResult.ResultCodeEnum.SUCC.getDesc()); } @Override public Page<Order> findAll(Example<Order> example, Pageable pageable) { Assert.notNull(example); Assert.notNull(pageable); return orderRepository.findAll(example, pageable); }}
阅读全文
0 0
- redis 加锁
- Redis 并发加锁
- redis 批量加锁
- redis要怎么加锁啊
- 用redis SETNX进行加锁
- Redis系列-远程连接redis并给redis加锁
- Redis系列-远程连接redis并给redis加锁
- Redis系列-远程连接redis并给redis加锁
- Redis系列-远程连接redis并给redis加锁
- Redis系列-远程连接redis并给redis加锁
- php tp 框架下 redis 队列&&加锁
- redis事务加锁之java操作
- redis加锁的几种实现
- 加锁
- 加锁
- 加锁
- 加锁
- 加锁
- php 文件锁的应用
- Elasticsearch同步mysql(logstash-input-jdbc)和一些查询问题
- Android手机屏幕投影到电脑工具
- ADS1115操作步骤
- XlistView的上拉刷新下拉加载 和Fragment 和无限轮播
- redis 加锁
- CSS相关
- spring boot 中redis的使用
- 程序自动重启脚本
- Dict字典
- wireshark分析ARP协议
- 技术书籍推荐(C++方向)
- win10下安装ubuntu(微星GE62VR
- 超级简单的底部导航按钮