vip网站怎么做,百度搜索风云榜手机版,郑州轻工业大学教务网络管理系统,中国建设银行信用卡网站文章目录 #x1f354;生成全局唯一ID#x1f339;为什么要生成全局唯一id#x1f33a;生成全局id的方法✨代码实现 #x1f354;生成全局唯一ID
是一种在分布式系统下用来生成全局唯一id的工具
在项目中生成全局唯一ID有很多好处#xff0c;其中包括#xff1a;
数据… 文章目录 生成全局唯一ID为什么要生成全局唯一id生成全局id的方法✨代码实现 生成全局唯一ID
是一种在分布式系统下用来生成全局唯一id的工具
在项目中生成全局唯一ID有很多好处其中包括
数据库主键在数据库中唯一ID可以作为主键确保每条记录的唯一性便于快速检索和更新数据。分布式系统在分布式系统中生成全局唯一ID可以避免不同节点生成相同的ID确保整个系统的数据一致性。日志追踪在日志系统中给每条日志分配唯一ID可以方便进行日志的追踪和分析。安全性某些场景下需要对数据进行加密或者数据权限控制唯一ID可以作为安全机制的一部分。缓存键值在缓存系统中使用唯一ID作为键值可以避免不同数据之间的冲突。数据分片在分布式存储系统中唯一ID可以作为数据分片的标识便于数据的存储和查询。
总之生成全局唯一ID有助于提高系统的可用性、数据的完整性和安全性同时也方便数据的管理和分析。因此在许多项目中都会需要生成全局唯一ID来满足系统的需求。
为什么要生成全局唯一id
生成全局唯一ID的主要目的是确保系统中的实体如对象、记录、消息等具有唯一性标识。以下是一些常见的原因
数据唯一性全局唯一ID可以确保在系统中每个实体都有一个独一无二的标识符避免数据冲突和重复。数据库索引全局唯一ID通常用作数据库表的主键或索引以提高数据查询和检索的效率。分布式系统在分布式系统中各个节点可能同时生成ID为了避免ID的冲突需要使用全局唯一ID算法确保整个系统中的ID唯一性。数据跟踪与关联通过给实体分配唯一ID可以轻松追踪和关联数据例如日志记录、事务管理、审计等。安全性和权限控制全局唯一ID可以用于确保数据的安全性和权限控制限制对特定实体的访问和操作。缓存与缓存失效在缓存系统中使用全局唯一ID作为缓存键可以确保不同实体之间的键不会冲突并且在缓存失效时能够正确地重新加载数据。
总结来说生成全局唯一ID有助于确保数据的唯一性、提高系统的可用性和性能并支持数据跟踪、安全性和权限控制等功能。这在许多系统和应用中都是一个重要的需求。
生成全局id的方法 ✨代码实现 ID生成器的算法如下 我们要先生成时间戳在生成序列号然后进行拼接
package com.hmdp.utils;import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;Component
public class RedisIdWorker {/*** 开始时间戳*/private static final long BEGIN_TIMESTAMP 1640995200L;/*** 序列号的位数*/private static final int COUNT_BITS 32;private StringRedisTemplate stringRedisTemplate;public RedisIdWorker(StringRedisTemplate stringRedisTemplate) {this.stringRedisTemplate stringRedisTemplate;}public long nextId(String keyPrefix) {// 1.生成时间戳LocalDateTime now LocalDateTime.now();long nowSecond now.toEpochSecond(ZoneOffset.UTC);long timestamp nowSecond - BEGIN_TIMESTAMP;// 2.生成序列号// 2.1.获取当前日期精确到天String date now.format(DateTimeFormatter.ofPattern(yyyy:MM:dd));// 2.2.自增长long count stringRedisTemplate.opsForValue().increment(icr: keyPrefix : date);// 3.拼接并返回return timestamp COUNT_BITS | count;}
} 这段代码的 timestamp COUNT_BITS | count;是怎么算出序列号的 在这段代码中timestamp COUNT_BITS | count 是通过位运算来生成最终的ID值。
首先timestamp 是时间戳代表了从开始时间戳到当前时间的秒数差。COUNT_BITS 是序列号的位数这里是32位。
位运算符 是左移操作符将 timestamp 的二进制表示向左移动 COUNT_BITS 位就是将时间戳占据高位。这样做是为了给序列号腾出足够的空间。
然后使用位运算符 | 进行按位或操作将左移后的时间戳与序列号 count 进行按位或操作合并它们的二进制表示。
最终得到的结果就是一个64位的ID其中高位是时间戳部分低位是序列号部分。 编写代码进行测试 package com.hmdp;import com.hmdp.entity.Shop;
import com.hmdp.service.impl.ShopServiceImpl;
import com.hmdp.utils.CacheClient;
import com.hmdp.utils.RedisIdWorker;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.geo.Point;
import org.springframework.data.redis.connection.RedisGeoCommands;
import org.springframework.data.redis.core.StringRedisTemplate;import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;import static com.hmdp.utils.RedisConstants.CACHE_SHOP_KEY;
import static com.hmdp.utils.RedisConstants.SHOP_GEO_KEY;SpringBootTest
class HmDianPingApplicationTests {Resourceprivate CacheClient cacheClient;Resourceprivate ShopServiceImpl shopService;Resourceprivate RedisIdWorker redisIdWorker;private ExecutorService es Executors.newFixedThreadPool(500);Testvoid testIdWorker() throws InterruptedException {CountDownLatch latch new CountDownLatch(300);Runnable task () - {for (int i 0; i 100; i) {long id redisIdWorker.nextId(order);System.out.println(id id);}latch.countDown();};long begin System.currentTimeMillis();for (int i 0; i 300; i) {es.submit(task);}latch.await(); //等待上面的结束long end System.currentTimeMillis();System.out.println(time (end - begin));}Testvoid testSaveShop() throws InterruptedException {Shop shop shopService.getById(1L);cacheClient.setWithLogicalExpire(CACHE_SHOP_KEY 1L, shop, 10L, TimeUnit.SECONDS);}
}在技术的道路上我们不断探索、不断前行不断面对挑战、不断突破自我。科技的发展改变着世界而我们作为技术人员也在这个过程中书写着自己的篇章。让我们携手并进共同努力开创美好的未来愿我们在科技的征途上不断奋进创造出更加美好、更加智能的明天