当前位置: 首页 > news >正文

长沙网站制作价格哈尔滨网站提升排名

长沙网站制作价格,哈尔滨网站提升排名,建企业网站一般多少钱,简约wordpress模板全局ID生成方式 目录 1. 全局唯一id介绍 1.1 特点 2. 常见的全局唯一id生成策略 2.1 利用数据库自增字段生成id2.2 UUID2.3 Redis生成id2.4 zookeeper生成ID2.5 Twitter的snowflake算法 3. 面试题目#xff1a;实现一个全局的ID生成器#xff0c;注意线程安全 3.1 单例模式…全局ID生成方式 目录 1. 全局唯一id介绍 1.1 特点 2. 常见的全局唯一id生成策略 2.1 利用数据库自增字段生成id2.2 UUID2.3 Redis生成id2.4 zookeeper生成ID2.5 Twitter的snowflake算法 3. 面试题目实现一个全局的ID生成器注意线程安全 3.1 单例模式分类3.2 普通懒汉模式单例线程不安全3.3 线程安全懒汉模式单例3.4 饿汉模式单例 本文章中前面两个章节转载自 https://cloud.tencent.com/developer/article/1884037 1. 全局唯一id介绍 在复杂的分布式系统中需要对大量的数据和消息进行唯一标识在设计的初期就要考虑到日后的数据量的级别如果需要对数据库进行分库分表就需要有一个全局唯一id来标识一条数据或记录。 1.1 特点 全局唯一id主要有以下几个特点 全局唯一性趋势递增MySQL InnoDB默认使用的是聚簇索引底层使用B tree的数据结构来存储索引数据在主键选择上尽量使用有序的主键保证写入性能单调递增保证下一个ID一定大于上一个ID例如事务版本号、**IM**增量消息、排序等特殊需求信息安全如果ID是连续的恶意用户的爬取工作就非常容易做了在一些应用场景下需要ID无规则、不规则。高可用性同时除了对ID号码自身的要求业务还对ID号生成系统的可用性要求极高如果ID系统瘫痪会带来一场灾难所以不能有单点故障。分片支持长度适中 2. 常见的全局唯一id生成策略 2.1 利用数据库自增字段生成id 优点 简单成本小代码简单性能可以接收ID号单调递增可以实现一些对ID有特殊要求的业务比如分页或排序等 缺点 强依赖DB。数据库迁移、多数据库版本支持、或分库分表时需要处理比较麻烦单点故障。单个数据库或读写分离或一主多从的情况下只有一个主库可以生成有单点故障的风险数据一致性问题。配置主从复制可以尽可能的增加可用性但是数据一致性在特殊情况下难以保证。难于扩展。在新能达不到要求的情况下难以扩展 部分优化方案 对于主库单点如果有多个Master库则每个Master库设置的起始数字不一样步长一样可以是Master的个数。例如:Master 1生成的是14710Master 2生成的是25811Master 3生成的是36912。这样就可以有效生成集群的唯一ID也可以大大降低ID生成数据库操作的负载 2.2 UUID 常见的id生成方式利用程序生成 UUID的目的是让分布式系统中的所有元素都能有唯一的辨识咨询而不需要透过中央控制端来做辨识资讯的指定。 UUID的标准形式包含32个16进制数字以‘-’分为5段示例550e8400-e29b-41d4-a716-446655440000 C中使用boost生成uuid的示例 #include boost/uuid/uuid.hpp #include boost/uuid/uuid_io.hpp #include boost/uuid/uuid_generators.hppint main() {boost::uuids::uuid a_uuid boost:uuids::random_generator();string uuid_string boost::uuids::to_string(a_uuid);return 0; }优点 非常简单本地生成可以调用API性能很高没有网络消耗基本不会有性能问题全球唯一在数据迁移、系统数据合并等情况下可以从容应对 缺点 存储成本高。16字节128位通常用36长度的字符串表示海量数据场景下需要考虑存储量的问题信息不安全。基于MAC地址生成UUID的算法可能造成MAC地址泄漏不适用作为主键UUID是无序的传输数据量大不可读 部分优化方案 为了解决UUID不可读可以使用UUID to Int64方法为了解决UUID无序的问题 NHibernate在其主键生成方式中提供了Comb算法combined guid/timestamp。保留GUID的10个字节用另6个字节表示GUID生成的时间DateTime。 2.3 Redis生成id 当使用数据库生成ID性能不够要求的时候可以尝试使用Redis来生成ID这主要依赖于Redis是单线程的所以也可以用于生成全局唯一的ID。可以使用Redis的原子操作**INCR和INCRBY**来实现。 可以使用Redis集群来获取更高的吞吐量。假如一个集群中有5台Redis。可以初始化每台Redis的值分别是1,2,3,4,5然后步长都是5。 优点 不依赖数据库灵活方便且性能优于数据库数字ID天然排序对分页或需要排序的结果很有帮助 缺点 如果系统中没有Redis还需要引入新的组件增加系统的复杂度需要编码和配置的工作量比较大Redis单点故障影响序列服务的可用性 2.4 zookeeper生成ID zookeeper主要通过其中znode数据版本来生成序列号可以生成32位和64位的数据版本号客户端可以使用这个版本号来作为唯一的序列号。 很少会使用zookeeper来生成唯一ID。主要是由于需要依赖zookeeper并且是多步调用API如果在竞争较大的情况下需要考虑分布式锁。因此性能在高并发的分布式环境下也不是很理想。 2.5 Twitter的snowflake算法 snowflake雪花算法是Twitter开源的分布式ID生成算法结果是一个long型的ID。这种方案把64-bit分别划分成多段分开来标识机器、时间等。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sI2XDQmC-1692772460124)(image/image_OUDNHYGCkP.png)] 其核心思想是使用41bit作为毫秒数10bit作为机器的ID5个bit是数据中心5个bit的机器ID12bit作为毫秒内的流水号意味着每个节点在每毫秒可以产生 4096 个 ID最后还有一个符号位永远是0。具体实现的代码可以参看github。 snowflake算法可以根据自身项目的需要进行一定的修改。比如估算未来的数据中心个数每个数据中心的机器数以及统一毫秒可以能的并发数来调整在算法中所需要的bit数。 优点 稳定性高不依赖于数据库等第三方系统以服务的方式部署稳定性更高生成ID的性能也是非常高的。灵活方便可以根据自身业务特性分配bit位。单机上ID单调自增毫秒数在高位自增序列在低位整个ID都是趋势递增的。 缺点 强依赖机器时钟如果机器上时钟回拨会导致发号重复或者服务会处于不可用状态。ID可能不是全局递增。在单机上是递增的但是由于涉及到分布式环境每台机器上的时钟不可能完全同步也许有时候也会出现不是全局递增的情况。 3. 面试题目实现一个全局的ID生成器注意线程安全 这是我在最近面试过程中遇到的一道代码题目个人思路是考察设计模式中的单例模式考虑线程安全的话需要使用饿汉模式或者双重检查锁的懒汉模式。 3.1 单例模式分类 单例模式可以分为懒汉和饿汉两者之间的区别在于创建实例的时间不同 懒汉系统运行时实例并不存在只有当需要使用该实例时才会去创建并使用实例这种方式需要考虑线程安全饿汉指系统一运行就初始化创建实例当需要时直接调用即可本身就线程安全没有多线程的问题 3.2 普通懒汉模式单例线程不安全 #include iostream #include mutex #include pthread.husing namespace std;class IdGenerator { public:// 获取单例对象 static IdGenerator* getInstance();// 释放单例进程退出时调用static void deleteInstance();// 获取唯一IDint getID(); private:IdGenerator();~IdGenerator();// 将拷贝构造函数设为私有禁止外部拷贝IdGenerator(const IdGenerator rhs);const IdGenerator operator(const IdGenerator rhs);// 唯一单例对象指针static IdGenerator* m_IdGenerator;// 全局唯一IDint id; };// 初始化静态成员变量 IdGenerator* IdGenerator::m_IdGenerator NULL;int IdGenerator::getID() {return id ; }IdGenerator* IdGenerator::getInstance() {if (m_IdGenerator nullptr) {m_IdGenerator new IdGenerator();}return m_IdGenerator; }void IdGenerator::deleteInstance() {if (m_IdGenerator) {delete m_IdGenerator;m_IdGenerator nullptr;} }IdGenerator::IdGenerator() : id(0) {} IdGenerator::~IdGenerator() {}3.3 线程安全懒汉模式单例 双重检查锁 #include iostream #include mutex #include pthread.husing namespace std;// 锁对象 std::mutex g_lock;class IdGenerator { public:// 获取单例对象 static IdGenerator* getInstance();// 释放单例进程退出时调用static void deleteInstance();// 获取唯一IDint getID(); private:IdGenerator();~IdGenerator();// 将拷贝构造函数设为私有禁止外部拷贝IdGenerator(const IdGenerator rhs);const IdGenerator operator(const IdGenerator rhs);// 唯一单例对象指针static IdGenerator* m_IdGenerator;// 全局唯一IDint id; };// 初始化静态成员变量 IdGenerator* IdGenerator::m_IdGenerator NULL;int IdGenerator::getID() {return id ; }IdGenerator* IdGenerator::getInstance() {if (m_IdGenerator nullptr) { // 第一重检查std::lock_guardstd::mutex lock(g_lock);if (m_IdGenerator nullptr) { // 第二重检查m_IdGenerator new IdGenerator(); }}return m_IdGenerator; }void IdGenerator::deleteInstance() {if (m_IdGenerator) {delete m_IdGenerator;m_IdGenerator nullptr;} }IdGenerator::IdGenerator() : id(0) {} IdGenerator::~IdGenerator() {}3.4 饿汉模式单例 #include iostream #include pthread.husing namespace std;class IdGenerator { public:// 获取单例对象 static IdGenerator* getInstance();// 释放单例进程退出时调用static void deleteInstance();// 获取唯一IDint getID(); private:IdGenerator();~IdGenerator();// 将拷贝构造函数设为私有禁止外部拷贝IdGenerator(const IdGenerator rhs);const IdGenerator operator(const IdGenerator rhs);// 唯一单例对象指针static IdGenerator* m_IdGenerator;// 全局唯一IDint id; };// 初始化静态成员变量 IdGenerator* IdGenerator::m_IdGenerator new IdGenerator();int IdGenerator::getID() {return id ; }IdGenerator* IdGenerator::getInstance() {return m_IdGenerator; }void IdGenerator::deleteInstance() {if (m_IdGenerator) {delete m_IdGenerator;m_IdGenerator nullptr;} }IdGenerator::IdGenerator() : id(0) {} IdGenerator::~IdGenerator() {}参考 https://blog.csdn.net/fly910905/article/details/79286680
http://www.tj-hxxt.cn/news/233801.html

相关文章:

  • 黄山网站设计网站建设制作汕头
  • 网站建设设计制作培训做标识的网站 知乎
  • 南京做网站的客户电话建设网站实训心得
  • cms网站开发框架ps软件入门教程
  • 成品网站短视频源码搭建平面设计做兼职网站
  • 响应式网站 谷歌 移动网站全国最大招商网
  • 自助建站推广如何推广外贸型网站
  • 域名做违法网站长春网站建设团队
  • 班级网站 建设模板wordpress本地访问满
  • 网站模板下载百度云链接怎么做的计算机应用技术与php网站开发
  • 网站建设保障措施视频网站开发需要什么语言
  • 海口手机建站模板论坛网站怎么做跳转
  • 买了虚拟主机怎么做网站微官网免费制作平台
  • 广州移动 网站设计wordpress后台安全
  • tk网站的dns修改站群 wordpress
  • 书荒小说阅读器是哪个网站做的温州网站建设大全
  • 做网站的服务器排名唐山注册公司需要多少钱
  • 做漫画视频在线观看网站wordpress登陆后可见
  • 漂亮的网站改版中 html代码做网站搜索推广点击率太低怎么办
  • 网页制作教程网站阿里云电影网站建设教程
  • 搜索引擎网站开发商贸有限公司门头照片
  • 为什么企业需要建设网站甘肃住房和城乡建设局网站
  • 石家庄网站建设行业公司电商网名
  • 免费商城系统网站建设个人网站开发技术要求
  • 成都市做网站的公司做网站建设费用预算
  • 文明网站建设情况百度网站权重查询
  • 深圳市建设银行网站首页长春做网站哪家公司好
  • 网站技术解决方案wordpress国外主题破解
  • 广元市建设局网站工作英语
  • 私人设计网站推荐h5页面制作软件thinkphp