Browse Source

Merge remote-tracking branch 'origin/dev-mysql' into dev-mysql

liusw 8 years ago
parent
commit
ff5cb68acf

+ 77 - 24
src/main/java/com/uas/platform/b2c/prod/product/common/service/impl/CreateNumberServiceImpl.java

@@ -5,18 +5,31 @@ import com.uas.platform.b2c.prod.product.common.model.CreateNumber;
 import com.uas.platform.b2c.prod.product.common.service.CreateNumberService;
 import com.uas.platform.b2c.core.utils.DateFormatUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.DataAccessException;
+import org.springframework.data.redis.connection.RedisConnection;
+import org.springframework.data.redis.core.RedisCallback;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 
+import java.io.Serializable;
 import java.util.Date;
 
 @Service
 public class CreateNumberServiceImpl implements CreateNumberService {
 
+	/**
+	 * 获取redis锁时间
+	 */
+	private final static long expireTime = 300L;
+
 	private final CreateNumberDao createNumberDao;
 
+	private final RedisTemplate<Serializable,Serializable> redisTemplate;
+
 	@Autowired
-	public CreateNumberServiceImpl(CreateNumberDao createNumberDao) {
+	public CreateNumberServiceImpl(CreateNumberDao createNumberDao, RedisTemplate redisTemplate) {
 		this.createNumberDao = createNumberDao;
+		this.redisTemplate = redisTemplate;
 	}
 
 	@Override
@@ -28,31 +41,36 @@ public class CreateNumberServiceImpl implements CreateNumberService {
 	public String getTimeNumber(String tbname, int digit, Integer... addNums) {
 		synchronized (tbname) {
 			// 1、找有没有用存这个表的
-			String time = getTime();
-			int num;
-			String timeNumber;
-			CreateNumber createNumber = createNumberDao.findByTbname(tbname);
-			if (createNumber == null) {
-				createNumber = new CreateNumber();
-				createNumber.setTbname(tbname);
-				createNumber.setTime(time);
-				num = 1;
-			} else {
-				// 2、检查时间是不是今天
-				if (time.equals(createNumber.getTime())) {
-					num = createNumber.getNumber() + 1;
-				} else {
-					num = 1;
+			String timeNumber = "";
+			while (getDataFromRedis(tbname) == null) {
+				setDataToRedis(tbname);
+				String time = getTime();
+				int num;
+				CreateNumber createNumber = createNumberDao.findByTbname(tbname);
+				if (createNumber == null) {
+					createNumber = new CreateNumber();
+					createNumber.setTbname(tbname);
 					createNumber.setTime(time);
+					num = 1;
+				} else {
+					// 2、检查时间是不是今天
+					if (time.equals(createNumber.getTime())) {
+						num = createNumber.getNumber() + 1;
+					} else {
+						num = 1;
+						createNumber.setTime(time);
+					}
 				}
+				if (addNums.length > 0) {
+					createNumber.setNumber(num + addNums[0] - 1);
+				} else {
+					createNumber.setNumber(num);
+				}
+				createNumberDao.save(createNumber);
+				redisTemplate.delete(tbname);
+				timeNumber = createNumber.getTime() + formatIntToStr(num, digit);
 			}
-			if (addNums.length > 0) {
-				createNumber.setNumber(num + addNums[0] - 1);
-			} else {
-				createNumber.setNumber(num);
-			}
-			createNumberDao.save(createNumber);
-			timeNumber = createNumber.getTime() + formatIntToStr(num, digit);
+
 			return timeNumber;
 		}
 	}
@@ -76,7 +94,7 @@ public class CreateNumberServiceImpl implements CreateNumberService {
 		return String.format(format, number);
 	}
 	
-	
+	@Override
 	public String generateOrderNumber(String orderType, String table, int number) {
 		return orderType.replaceAll("_TIMESTAP_NUMBER", getTimeNumber(table, number));
 	}
@@ -87,4 +105,39 @@ public class CreateNumberServiceImpl implements CreateNumberService {
 		return voucherType.replace("_TIMESTAP_NUMBER", timeNumber);
 	}
 
+	/**
+	 * redis获取key的值
+	 * @param keyVale
+	 * @return
+	 */
+	private Object getDataFromRedis(final String keyVale) {
+		Object result = redisTemplate.execute(new RedisCallback<Object>() {
+			@Override
+			public Object doInRedis(RedisConnection connection) throws DataAccessException {
+				byte[] key = redisTemplate.getStringSerializer().serialize(keyVale);
+				if (connection.exists(key)) {
+					return redisTemplate.getStringSerializer().deserialize(connection.get(key));
+				} else {
+					return null;
+				}
+			}
+		});
+		return result;
+	}
+
+	private void setDataToRedis(final String keyVale) {
+		redisTemplate.execute(new RedisCallback<Object>() {
+			@Override
+			public Object doInRedis(RedisConnection connection) throws DataAccessException {
+				byte[] key = redisTemplate.getStringSerializer().serialize(keyVale);
+				if (!connection.exists(key)) {
+					byte[] value = "1".getBytes();
+					connection.set(key, value);
+					connection.expire(key, expireTime);
+					return redisTemplate.getStringSerializer().deserialize(connection.get(key));
+				}
+				return null;
+			}
+		});
+	}
 }