id生成的方法有很多:
1、微软的uuid,uuid使用机器网卡和时间戳,数据过长,不利于保存和操作。
2、twitter 的snowflake。
3、数据库自增id,也可以保证唯一性,但是并发太大扛不住。
4、通数据库差不多的redis,自增命令,天然支持高并发。
snowflake的格式为:1位保留位置,41位时间戳,10位机器序列号,12位序列号。
1、问:机器偶尔会有时间小于当前时间的情况,此时需要回拨,如果要保证id递增的情况,该怎么设计?比如调后了x s。
曰:1、禁用生成id的接口。不行,这个要改代码。
2、停服务。先停服务,再调时间,等待x s之后重启服务。这个代价太大。
3、时间使用第三方,如zk时间。这个可以,不可能所有的机器都时间滞后。如果真有发生,那就凉凉了。
4、使用一个字段记录上一次的时间。如果新的时间小于上一次时间,就不生成id。
5、项目启动的时候,查询一次数据库,获得已有的最大id,写入4的字段。防止机器重启缓存为null。
2、布隆过滤器
guava中就有现成的可以拿来用。不得不说,guava是个好类库。