当前位置: 首页 > 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);}}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 深入理解Linux网络(二):UDP接收内核探究
  • tg小程序前端-dogs前端源码分析
  • mongodb数据导出与导入
  • 【20】读感 - 架构整洁之道(二)
  • 基于springboot+vue+uniapp的农场管理系统小程序
  • Yum包下载
  • 【python doris】python连接doris数据库,并查询返回数据框
  • <数据集>pcb板缺陷检测数据集<目标检测>
  • Socket、WebSocket 和 MQTT 的区别
  • c++基础(类和对象中)(类的默认成员函数)
  • 使用Event Sourcing模式管理应用状态
  • c++图的基本操作
  • 塔子哥的题解点赞方案-美团2023笔试(codefun2000)
  • 递归遍历树结构,前端传入一整颗树,后端处理这个树,包括生成树的id和pid等信息,
  • WhisperX
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • Cumulo 的 ClojureScript 模块已经成型
  • Docker 笔记(2):Dockerfile
  • HashMap剖析之内部结构
  • Javascripit类型转换比较那点事儿,双等号(==)
  • java小心机(3)| 浅析finalize()
  • Js基础知识(一) - 变量
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • sessionStorage和localStorage
  • Web Storage相关
  • 给初学者:JavaScript 中数组操作注意点
  • 关于extract.autodesk.io的一些说明
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 使用 QuickBI 搭建酷炫可视化分析
  • 系统认识JavaScript正则表达式
  • 想写好前端,先练好内功
  • 小试R空间处理新库sf
  • linux 淘宝开源监控工具tsar
  • 整理一些计算机基础知识!
  • ​Python 3 新特性:类型注解
  • (2)nginx 安装、启停
  • (4.10~4.16)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第6节 (嵌套的Finally代码块)
  • (k8s)Kubernetes本地存储接入
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (笔试题)合法字符串
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • .net core 依赖注入的基本用发
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .net 调用海康SDK以及常见的坑解释
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .net操作Excel出错解决
  • .NET下ASPX编程的几个小问题