java吧 关注:1,293,276贴子:12,824,937
  • 17回复贴,共1

关于id生成

只看楼主收藏回复

现在要生成一个12位id由注册天数和次序组成,例如今天第一个个注册就是 20221027-0001 第二个就是20221027-0002 第二天第一个注册就是20221028-0001 这样改怎么实现,要用redis吗


IP属地:海南来自Android客户端1楼2022-10-27 12:25回复
    不需要什么其他信息,用redis。如果需要保存一些其他信息,就用数据库,可以多保存点东西,例如用户的注册时间(这个可以追溯到几点几分几秒),IP(这个可以知道软件使用者地区分布,哪里人多,,方便以后可以针对性的做营销)。最简单就是redis,取出来用完加一放回,记得给注册加锁,避免多线程问题。


    IP属地:广东来自Android客户端3楼2022-10-27 12:51
    收起回复
      2026-01-02 05:17:29
      广告
      不感兴趣
      开通SVIP免广告
      没啥别的要求也可以用触发器


      IP属地:辽宁4楼2022-10-27 15:26
      回复
        用redis最简单


        IP属地:浙江5楼2022-10-27 15:56
        回复
          直接以日期为key,进行递增,设置1天的过期时间


          IP属地:浙江6楼2022-10-27 15:57
          回复
            直接写一个static 的lock返回的方法不就行了
            只要你保证调用这个方法返回当前值,并将值+1不就行了


            IP属地:湖南来自Android客户端7楼2022-10-27 15:57
            收起回复
              用数据库还要考虑并发,更麻烦,用原子类递增的那个还要考虑怎么归零,也麻烦


              IP属地:浙江8楼2022-10-27 15:59
              回复
                服务器是单体服务还是集群服务对计数影响不大, 主要是实现思路.
                就比方说: 如果你在内存中做计数器, 程序重启后计数不会持久保存, 就没有意义, 所以你需要有存储媒介.
                存储媒介可选择, 数据库或redis. 都可以, 它只为帮助你计数并持久存储一段时间数据. 所以选择哪种都无所谓, 相对而言 redis 会简单点.
                线程安全和数据安全的问题无论是单服务还是多服务都会有这类问题所以一次性解决即可.
                redis实现 命令可以使用:
                比如 incrkey:20221027 是key, 在这个key上面做自增.
                incrby "incrkey:20221027" 1
                java 中使用 Jedis客户端(示范)
                Jedis jedis = new Jedis("localhost", 6379);
                // 每次会在这个KEY上自增1. 可以用这个数, 原子操作所以不用考虑数据安全.
                long count = jedis.incrBy("incrkey:20221027", 1);
                数据库就用sql可以解决, 你需要建立一张表.
                比如只有两个词段, day_key varchar(30) 主键, count_value BIGINT(20)
                数据库的key最开始是不存在的所以需要先insert初始化一个0数据. 然后下面的操作即可.
                下面语句请在一个事务中去执行操作, 因为会有key的行锁存在所以也是安全的.
                -- update 会在 day_key = ? 上面增加行锁, 查询的时候会是新的.
                update table_name set count_value = count_value + 1 where day_key = 'incrkey:20221027';
                -- 直接查询即可. 因为上面update已经在day_key=?加锁了
                select count_value from table_name where day_key = 'incrkey:20221027';
                -- 最后在提交, 结束这个事务, 释放锁.
                commit;
                用count_value返回的值计数即可.


                IP属地:河北11楼2022-10-27 16:45
                收起回复