20 条够不够?SSH-Chat 消息历史的完整机制

20 条够不够?SSH-Chat 消息历史的完整机制 20 条够不够SSH-Chat 消息历史的完整机制【免费下载链接】ssh-chatChat over SSH.项目地址: https://gitcode.com/gh_mirrors/ss/ssh-chat当你 SSH 进房间时屏幕上会立刻刷出最近 20 条聊天记录——这就是 SSH-Chat 消息历史机制。SSH-Chat 是一款基于 SSH 协议的实时聊天工具它的消息持久化与消息检索靠内存里的定容环形缓冲区完成连入即推送最近 20 条不依赖任何数据库。 一个使用场景连上房间先看到最近 20 条以新面孔的身份 ssh 进房间你不会对着空白屏幕发呆。服务器推给你的第一批内容就是这个房间最近的 20 条消息谁在里面、大家在聊什么扫一眼就能接上话题直接开聊。中途断线、过一会儿重连同样的待遇再来一遍历史重新推送你不需要问别人刚才说到哪了。没有这个机制每次重连都像进了一间没有记忆的屋子。 一句话原理环形缓冲区就像循环用的便签本一句话概括消息历史是一个环形缓冲区——长度固定为 20 的数组按顺序往里写写到末尾就绕回头覆盖最老的那一格。类似一个便签本新消息贴在上头贴满整本后回到第一页接着写旧内容自然被顶掉。你只需要翻最后几页就能弄清局势不必把每一页旧便签都留一辈子。这里的持久化发生在内存里进程活着记录就在。 关键代码拆解值得看的只有两处第一处是容量定义在 chat/room.go 里const historyLen 20一行就定死了每个房间记得住多少条消息。建房间时NewRoom()把它传给message.NewHistory(historyLen)缓冲区数组按这个容量分配之后终身不变。第二处是连入时的推送同样在 chat/room.gofunc (r *Room) History(u *message.User) { for _, m : range r.history.Get(historyLen) { u.Send(m) } }逐句说r.history.Get(historyLen)是消息检索这一步实现在 chat/message/history.go从头部指针往前倒着遍历缓冲区按时间顺序最多取出 20 条for循环拿到一条就u.Send(m)发一条把历史顺着你的 SSH 会话逐条吐出来。用户加入成功后Join会自动调用History(u)所以这个推送你什么都不用做就会发生。 一条消息的完整旅程从发出去到被新人看到写入路径发送消息进入房间经broadcast通道取出交给HandleMsg分发。加锁History.Add(entry)先h.Lock()所有写操作排队同一时刻只有一个写者。更新 headh.head (h.head 1) % maxhead 指针移到下一格缓冲区已满时这一格正好是最旧消息直接覆盖。存入h.entries[h.head] entry消息落格未满时size自增。可选写日志若已配置输出流消息带 UTC 时间戳写成[时间] 内容落盘没配置就跳过。读取路径新用户加入Join里调用History(u)。Get拿读锁按序取出最多 20 条逐条发给新人。前 5 步与后 2 步走的是同一块缓冲区写与写互相排队但不会卡住读者读者之间也不互卡。⚖️ 为什么是 20 条、为什么放内存一个够用的取舍这里其实是个折中。收益固定不管房间多热闹每个房间只占 20 条消息的内存不随活跃度增长读取也有上限——最多翻 20 格对聊天量而言相当于 O(1)。代价同样固定第 21 条新消息一来最老那条就查不到了进程退出全部归零。想要完整记录环形缓冲区做不到。所以这是够用主义内存历史只服务在线体验并发安全交给读写锁落盘持久化单独留了开关热路径保持快而简单冷路径可开可关。✅ 如何用 3 步验证历史推送和文件日志验证推送同一房间开两个 SSH 会话第一个发几条消息第二个断开再重连你会看到刚才的消息被重新推送。验证容量连发 30 条后重连第二个会话只剩最近 20 条——最早 10 条已被覆盖。验证落盘对 chat/room.go 里的Room.SetLogging(out)传入一个文件句柄之后的消息都会按[UTC时间] 内容写进文件。这是整套机制唯一的落盘出口。边界情况缓冲区没写满时Get只返回实际条数不会取到空位高并发下写被写锁串行化读走RLock互不阻塞断线重连只是重新走一遍History(u)看到的仍是有序历史。这套 SSH-Chat 消息历史机制适合轻量聊天室内存 20 条、读取 O(1)、零外部依赖但不适合需要完整留存记录的审计场景。真要长期留数据先用SetLogging()把消息写盘再基于日志文件做归档、检索和统计这类二次分析。【免费下载链接】ssh-chatChat over SSH.项目地址: https://gitcode.com/gh_mirrors/ss/ssh-chat创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考