C51怎么同时设置多个CAN ID

该资源内容由用户上传如若侵權请选择举报

一个资源只可评论一次,评论内容不能少于5个字

您会向同学/朋友/同事推荐我们的CSDN下载吗

谢谢参与!您的真实评价是我们改进的动力~

}

UUID是一个字符串而且没有顺序所鉯不适合做主键,可以 做 token 使用

利用全球唯一UUID生成订单号 UUID基本概念: UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的

UUID组成部分:当前日期和时间+时钟序列+随机数+全局唯一的IEEE机器识别号 全局唯一的IEEE机器识别号:如果有网卡,从网卡MAC地址获得没有网卡鉯其他方式获得。

优点: 简单代码方便 生成ID性能非常好,基本不会有性能问题 全球唯一在遇见数据迁移,系统数据合并或者数据库变哽等情况下,可以从容应对

缺点: 没有排序无法保证趋势递增 UUID往往是使用字符串存储,查询的效率比较低 存储空间比较大如果是海量数據库,就需要考虑存储量的问题 传输数据量大

一般UUID在生成Token领域使用比较多

2.基于数据库自增或者序列生成全局id

如果使用数据库id自增生成订單号的话,如果数据库是集群的话 则有可能生成相同的订单号

所以如果我们使用数据库id 自增做为全局 id 的话我们需要设置步长,步长表示烸次自动增长的数量

设置mysql1数据库id初始值为0,mysql数据库id初始值为1mysql3数据库id初始值为2。我们这时候需要设置步长为3

这就是最后产生自增的结果,但是这种方法还有一个缺点就是如果后期增加数据库服务器集群数量的话,mysql 步长无法扩展所以使用这种方法生成全局id,需要前期確定好mysql数据库集群的数量不然那到后期扩展集群数量会导致生成步长规则发生改变,可能会产生重复的id

在数据库集群环境下,默认自增方式存在问题因为都是从1开始自增,可能会存在重复应该设置每台节点自增步长不同。

因为Redis是单线的天生保证原子性,可以使用Redis嘚原子操作 INCR和INCRBY来实现

优点: 不依赖于数据库灵活方便,且性能优于数据库 数字ID天然排序,对分页或者需要排序的结果很有帮助

缺点: 如果系统中没有Redis,还需要引入新的组件增加系统复杂度。 需要编码和配置的工作量比较大

注意:在Redis集群情况下,同样和Redis一样需要设置不同嘚增长步长同时key一定要设置有效期 可以使用Redis集群来获取更高的吞吐量。

假如一个集群中有5台Redis可以初始化每台Redis的值分别是1,2,3,4,5,然后步长都昰5

比较适合使用Redis来生成每天从0开始的流水号。

比如订单号=日期+当日自增长号可以每天在Redis中生成一个Key,使用INCR进行累加 如果生成的订单號超过自增增长的话,可以采用前缀+自增+并且设置有效期

使用 redis 实现全局id生成,使用自动填充的方法实现

31 * 提前生成号订单号码存放在redis中 34 * 栲虑失效时间问题 24小时 66 // 最后的aa表示“上午”或“下午” HH表示24小时制 如果换成hh表示12小时制
8 * 1位标识,由于long基本类型在Java中是带符号的最高位是苻号位,正数是0负数是1,所以id一般是正数最高位是0<br> 9 * 41位时间截(毫秒级),注意41位时间截不是存储当前时间的时间截,而是存储时间截的差值(当前时间截 - 开始时间截) 10 * 得到的值)这里的的开始时间截,一般是我们的id生成器开始使用的时间由我们程序来指定的(如下下面程序IdWorker类的startTime属性)。 13 * 12位序列毫秒内的计数,12位的计数顺序号支持每个节点每毫秒(同一机器同一时间截)产生4096个ID序号<br> 15 * SnowFlake的优点是,整体上按照時间自增排序并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作区分),并且效率较高经测试, 30 /** 支持的最大机器id结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数) */ 87 * 获得下一个ID (该方法是线程安全的) 94 // 如果当前时间小于上一次ID生成的时间戳,說明系统时钟回退过这个时候应当抛出异常 100 // 如果是同一时间生成的则进行毫秒内序列 105 // 阻塞到下一个毫秒,获得新的时间戳 109 // 时间戳改变,毫秒内序列重置 117 // 移位并通过或运算拼到一起组成64位的ID 125 * 阻塞到下一个毫秒直到获得新的时间戳 140 * 返回以毫秒为单位的当前时间
}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信