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

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

雪花算法:

public class SnowflakeIdGenerator {private final long epoch = 1626804000000L; // 定义起始时间戳,这里设置为2021-07-21 00:00:00 UTCprivate 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; // 机器IDprivate 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); // 设置机器IDfor (int i = 0; i < 10; i++) {long id = idGenerator.nextId(); // 生成新的IDSystem.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);}}

http://www.lryc.cn/news/404116.html

相关文章:

  • 前瞻断言与后瞻断言:JavaScript 正则表达式的秘密武器
  • 昇思MindSpore学习总结十六 —— 基于MindSpore的GPT2文本摘要
  • React Router 6笔记
  • Android init 中的wait_for_property指令
  • 智能合约语言(eDSL)—— 并行化方案——调度算法
  • vue2.0中如何实现数据监听
  • kafka开启kerberos和ACL
  • QT+winodow 代码适配调试总结(三)
  • Linux之旅:常用的指令,热键和权限管理
  • 简单实用的企业舆情安全解决方案
  • 【中项】系统集成项目管理工程师-第2章 信息技术发展-2.1信息技术及其发展-2.1.1计算机软硬件与2.1.2计算机网络
  • SpringBoot集成Sharding-JDBC-5.3.0实现按月动态建表分表
  • ubuntu 上安装中文输入法
  • Postman导出excel文件
  • 你还在手动构建Python项目吗?PyBuilder让一切自动化!
  • WebRTC音视频-前言介绍
  • centos/rocky容器中安装xfce、xrdp记录
  • 实战:Eureka的概念作用以及用法详解
  • jupyter_contrib_nbextensions安装失败问题
  • 设计模式-Git-其他
  • 【C#】计算两条直线的交点坐标
  • 在项目服务器部署git 并实现自动提交
  • 前缀匹配工具之IP-Prefix
  • 等级保护测评案例分享及合规建议
  • GOLLIE : ANNOTATION GUIDELINES IMPROVE ZERO-SHOT INFORMATION-EXTRACTION
  • 2024-07-19 Unity插件 Odin Inspector9 —— Validation Attributes
  • 跨平台WPF音乐商店应用程序
  • 设计模式简述(一)
  • OSI参考模型:解析网络通信的七层框架
  • QT通用配置文件库(QPreferences)