全域性ID之redis解決方案
阿新 • • 發佈:2018-12-06
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; } }