今日总结:雪花算法,拉取在线用户

雪花算法:

public class SnowflakeIdGenerator {

    private final long epoch = 1626804000000L; // 定义起始时间戳,这里设置为2021-07-21 00:00:00 UTC
    private final long workerIdBits = 5L; // 机器ID所占的位数
    private final long sequenceBits = 10L; // 序列号所占的位数

    private final long maxWorkerId = -1L ^ (-1L << workerIdBits); // 最大的机器ID,用于做位运算
    private final long sequenceMask = -1L ^ (-1L << sequenceBits); // 序列号的掩码,用于取低位

    private long workerId; // 机器ID
    private long sequence = 0L; // 序列号
    private long lastTimestamp = -1L; // 上次生成ID的时间戳

    /**
     * 构造函数
     * @param workerId 机器ID
     */
    public SnowflakeIdGenerator(long workerId) {
        if (workerId > maxWorkerId || workerId < 0) {
            throw new IllegalArgumentException(String.format("Worker ID must be between 0 and %d", maxWorkerId));
        }
        this.workerId = workerId;
    }

    /**
     * 生成下一个唯一ID
     * @return long 类型的唯一ID
     */
    public synchronized long nextId() {
        long timestamp = System.currentTimeMillis(); // 获取当前时间戳

        // 如果当前时间小于上次ID生成的时间戳,则说明系统时钟回退过,抛出异常
        if (timestamp < lastTimestamp) {
            throw new RuntimeException("Clock moved backwards. Refusing to generate id");
        }

        // 如果是同一时间生成的,则进行序列号累加
        if (lastTimestamp == timestamp) {
            sequence = (sequence + 1) & sequenceMask; // sequence自增,并通过sequenceMask防止溢出
            if (sequence == 0) {
                timestamp = tilNextMillis(lastTimestamp); // 如果sequence溢出,则阻塞到下一个毫秒,获取新的时间戳
            }
        } else {
            sequence = 0L; // 如果是新的时间戳,则将序列号置为0
        }

        lastTimestamp = timestamp; // 更新上次生成ID的时间戳

        // 使用位运算生成最终的ID,并返回
        return ((timestamp - epoch) << (workerIdBits + sequenceBits))
                | (workerId << sequenceBits)
                | sequence;
    }

    /**
     * 阻塞到下一个毫秒,直到获得新的时间戳
     * @param lastTimestamp 上次生成ID的时间戳
     * @return 当前时间戳
     */
    private long tilNextMillis(long lastTimestamp) {
        long timestamp = System.currentTimeMillis();
        while (timestamp <= lastTimestamp) {
            timestamp = System.currentTimeMillis();
        }
        return timestamp;
    }

    /**
     * 主函数,用于测试生成ID
     * @param args 参数
     */
    public static void main(String[] args) {
        SnowflakeIdGenerator idGenerator = new SnowflakeIdGenerator(1); // 设置机器ID
        for (int i = 0; i < 10; i++) {
            long id = idGenerator.nextId(); // 生成新的ID
            System.out.println("Generated Id: " + id); // 打印生成的ID
        }
    }
}

拉取在线用户的思路:登录过后开启线程这就是在线用户,将其线程放入集合中管理,key为ID,遍历集合则可以获取到所有的在线用户
 

获取在线用户的部分代码:

// 集合遍历,遍历hashmap的key
Iterator<String> iterator = hm.keySet().iterator();
String onlineUserList = "";
while (iterator.hasNext()) {
    onlineUserList += iterator.next() + " ";
}
return onlineUserList;

  1. Iterator<String> iterator = hm.keySet().iterator();:这行代码通过 hm.keySet().iterator() 获取了HashMap hm 的所有键的迭代器(iterator)。hm.keySet() 返回HashMap中所有键的集合,然后 iterator() 方法返回这个集合的迭代器,用于逐个访问集合中的元素。

  2. String onlineUserList = "";:这行代码定义了一个空字符串 onlineUserList,用来存储遍历得到的所有键。

  3. while (iterator.hasNext()) {:这是一个 while 循环,它的条件是 iterator.hasNext(),即迭代器中是否还有下一个元素。如果有,进入循环体。

  4. onlineUserList += iterator.next() + " ";:在循环体内部,iterator.next() 方法返回迭代器的下一个键,并将其添加到 onlineUserList 字符串后面,同时在每个键之间添加一个空格。

  5. return onlineUserList;:最后,当迭代器遍历完所有键后,退出循环,并返回拼接好的 onlineUserList 字符串,其中包含了HashMap中所有键的列表。

查找数据库某个字段的所有数据:

        try {
            // 加载并注册JDBC驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //  Class.forName("com.mysql.jdbc.Driver");

            // 建立数据库连接
            conn = DriverManager.getConnection(URL, USER, PASSWORD);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }


        //遍历数据库
        // 创建Statement对象
        //这个也是个接口,用于执行不带参的,PreparedStatement pstmt是其子接口,执行带参的语句
        Statement stmt = null;
        try {
            stmt = conn.createStatement();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        try {

            // 执行查询
            String sql = "SELECT userId FROM account";
            ResultSet rs = stmt.executeQuery(sql);

            String onlineUserList="";
            // 处理查询结果
            while (rs.next()) {
                // 假设userId是整型,根据实际情况调整
                String userId = rs.getString("userId");
                onlineUserList+=userId+" ";
            }
            return onlineUserList;

        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                if(rs!=null){
                    rs.close();
                }
               if(stmt!=null){
                   stmt.close();
               }
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }

相关推荐

  1. 今日总结雪花算法在线用户

    2024-07-22 03:08:02       19 阅读
  2. PHP雪花算法

    2024-07-22 03:08:02       49 阅读
  3. svn

    2024-07-22 03:08:02       51 阅读
  4. gerrit 失败

    2024-07-22 03:08:02       25 阅读
  5. 今日总结2024/5/9

    2024-07-22 03:08:02       26 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-22 03:08:02       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-22 03:08:02       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-22 03:08:02       45 阅读
  4. Python语言-面向对象

    2024-07-22 03:08:02       55 阅读

热门阅读

  1. qt QScrollArea 可滚动区域控件简单举例

    2024-07-22 03:08:02       19 阅读
  2. JDK 内置的基本注解类型

    2024-07-22 03:08:02       16 阅读
  3. Xcode代码静态分析:构建无缺陷代码的秘诀

    2024-07-22 03:08:02       18 阅读
  4. 半监督学习 原理与代码实例讲解

    2024-07-22 03:08:02       19 阅读
  5. 初学Mybatis之 CRUD 增删改查

    2024-07-22 03:08:02       13 阅读
  6. TensorFlow 的基本概念和使用场景

    2024-07-22 03:08:02       16 阅读
  7. Windows图形界面(GUI)-DLG-C/C++ - 列表视图(ListView)

    2024-07-22 03:08:02       19 阅读
  8. 大规模语言模型从理论到实践 高效模型微调

    2024-07-22 03:08:02       17 阅读