1. 程式人生 > >全域性ID之redis解決方案

全域性ID之redis解決方案



import java.text.SimpleDateFormat;
import java.util.Date;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.support.atomic.RedisAtomicLong;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

// 基於Redis 實現分散式全域性id
@RestController
public class OrderController {
	@Autowired
	private RedisTemplate redisTemplate;

	// 基於Redis 實現分散式全域性id原理
	/**
	 * 15 18位 字首=當前日期=2018112921303030-5位自增id(高併發請下 先天性安全) 00001<br>
	 * 00010<br>
	 * 00100<br>
	 * 01000<br>
	 * 11000<br>
	 * 在相同毫秒情況下,最多隻能生成10萬-1=99999訂單號<br>
	 * 假設:雙11每毫秒99萬筆 <br>
	 * 提前生成號訂單號碼存放在redis中
	 * 
	 * 9.9萬*1000=900萬<br>
	 * 考慮失效時間問題 24小時
	 * 
	 * 
	 * @return
	 */
	@RequestMapping("/order")
	public String order(String key) {
		RedisAtomicLong redisAtomicLong = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
		for (int i = 0; i < 100; i++) {
			long incrementAndGet = redisAtomicLong.incrementAndGet();
			// 5位
			String orderId = prefix() + "-" + String.format("%1$05d", incrementAndGet);
			String orderSQL = "insert into orderNumber value('" + orderId + "');";
			System.out.println(orderSQL);
		}

		return "success";
	}

	@RequestMapping("/order1")
	public String order1(String key) {
		RedisAtomicLong redisAtomicLong = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
		// // 起始值
		// redisAtomicLong.set(10);
		// 設定步長加10
		redisAtomicLong.addAndGet(9);
		return redisAtomicLong.incrementAndGet() + "";
	}

	public static String prefix() {
		String temp_str = "";
		Date dt = new Date();
		// 最後的aa表示“上午”或“下午” HH表示24小時制 如果換成hh表示12小時制
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
		temp_str = sdf.format(dt);
		return temp_str;
	}

}