设计数据密集型
存储和检索OLTP 索引一个简单的思想就是使用一张哈希表来保存每个数据的 offset,但是这样存在着更新困难的问题: 如果不更新已经删除的 key,那么就会持续占用磁盘 如果更新已经删除的 key,那么就会占用大量时间重新扫描文件系统,来重新构建哈希表 此外,还需要占用额外的空间来保存这张哈希表,否则如果掉电等意外发生,那么也必须扫描整个文件系统来重新构建这张哈希表。同时,这样不会能支持范围检索,如果数据量过大,还必须解决哈希冲突。 SSTable(sorted string table) The Google SSTable file format is used internally to store Bigtable data. An SSTable provides a persistent, ordered immutable map from keys to values, where both keys and values are arbitrary byte strings. Operations are provided to look up the...
站内信
概述站内信相较于 IM 通信系统而言,实现是比较简单。具体而言就是一个单向的通信系统,由服务端向客户端进行推送,而没有客服端向服务端推送的功能。 1234IM: client <-----> serverSite Message: client <------ server 站内信的核心内容是:消息内容,消息和发送人之间的关系,是否已读 实现起来的技术点也是和 IM 几乎没有区别,也存在群发和私发的消息,因此也需要考虑群发消息和私发消息的储存和可靠性。私发消息相对而言实现比较简单,只需要保证有序性和可靠性即可群发消息就实现起来相对复杂,正常来说需要使用单独的一张表来保存这部分消息,是常见的 IM 系统中的读扩散问题,还有已读状态,都需要进行考虑。 由于工期比较赶,因此实现起来也比较潦草,整体实现思路为: 某个 Pod 起来的时候都会订阅某个特定的 channel,并且注册自己独特的 channel,借助 Redis 的 Pub/Sub 机制完成消息的转发。 这种实现方法并不完美,因为 Pub/Sub...
本科毕业设计
之前做过一点知识图谱相关的工作,了解过一些图相关的知识,可惜之前没有做好记录,只是做了相关内容,具体细节已经忘掉了。 正好毕业设计也是这方面相关的,涉及图神经网络和数据处理方面的,不过嘛,毕业设计的水分还是很足的,大部分是工程相关的,因此也是主要来写怎么处理工程问题,而不是相关算法问题,算法主要是通过复现老师的代码。 神经网络相关数据集一共有两类数据集,分别是基础数据集和 reddit 数据集。下面分别介绍这两种数据集。 基础数据集所谓基础数据集指的是 torch_geometric 中自带的数据集,本次只使用了两种类别,其他内置数据集就没有认真调查了,这两类分别是 Planetoid 和 Amazon。 Planetoid 的名称是来自论文 Revisiting Semi-Supervised Learning with Graph Embeddings. Zhilin Yang, William W. Cohen, Ruslan Salakhutdinov. ICML 2016. Amazon Amazon Co-purchase...
redis 底层数据结构
SDS
腾讯开悟
参赛链接:https://aiarena.tencent.com/aiarena/zh 2024 智能体博弈赛道2024 年,是我第一次接触到强化学习,对于一些概念都比较陌生,今年的比赛本质上是进行调参。(2025 年会狠狠的怀念的)。 2024 年,我们改进方向主要是进行奖励函数的改进,在此基础上加入了很多的奖励函数,想要让模型变的更加的聪明,但是事与愿违,增多奖励函数非常容易让模型变的十分抽象,并且新加的奖励函数容易让模型退化,并且由于训练是 self-play,及其容易出现 lazy-agent 的现象,具体表现就是两边都躲在草丛里面,清完兵线就没有任何的动作了。此外,还导致训练过程中梯度爆炸的限制,主要原因就是没有对奖励值得大小进行约束,导致一个值变的非常的大。 因此,奖励函数设计也变得十分的烧脑,并且尽可能得保证零和博弈。同时,样本的丰富性和多样性就很重要了,之前有选手就写了 ELO 机制,另外,腾讯开悟框架也提供了 random...
MyChat
项目来源:https://learnku.com/articles/74274 我对这个项目进行了一些二次开发,完成了一些作者没有做的,或者没有做完的内容,作者写的内容我就不多写了,下面主要是我的学习笔记。主要是相关技术栈入门,以及部分开发的知识。 目前技术栈没有多大变化,也就是原文中的技术栈,只是多了个 docker 部署。 TODO:框架改造:微服务 总体结构12345678910111213MyChat.├── asset // 放置上传的图片├── cache // redis├── common // 放置公共文件├── config // 配置文件├── dao // MySQL├── global // 放置各种连接池,配置等├── initialize // 项目初始化├── middlewear // 中间件(拦截器)├── models // 数据库表设计├── router // 路由├── service // 对外...
golang 中的 singleflight
背景一般情况下我们在写一写对外的服务的时候都会有一层 cache 作为缓存,用来减少底层数据库的压力,但是在遇到例如 redis 抖动或者其他情况可能会导致大量的 cache miss 出现。 假如我们要访问一个文件,但是由于各种问题,这个请求发送了 1000 次,如果不做处理,让他直接访问缓存或者直接访问数据库,那么就会显著增大后端压力,降低并发性能。 这个时候我们就可以使用 singleflight 库文件,直译过来叫做单飞,主要作用就是把一组相同的请求合并为一个请求,实际上只会请求一次,这样会显著减少数据库和缓存的压力。 原理singleflight 一共提供了三种接口,具体的说明在这里 singleflight: func (g *Group) Do(key string, fn func() (interface{}, error)) (v interface{}, err error, shared...
Golang Slice、String and Arrary
之前面腾讯的时候问到 Slice 把我问懵了,还是太菜了,只是简单的了解了一下 Slice 的底层结构,但是经不起深挖,基础有点太弱了。 String底层结构一个字符串是一个不可改变的字节序列,字符串通常是用来包含人类可读的文本数据。和数组不同的是,字符串的元素不可修改,是一个只读的字节数组。每个字符串的长度虽然也是固定的,但是字符串的长度并不是字符串类型的一部分。由于 Go 语言的源代码要求是 UTF8 编码,导致 Go 源代码中出现的字符串面值常量一般也是 UTF8 编码的。 源代码中的文本字符串通常被解释为采用 UTF8 编码的 Unicode 码点(rune)序列。因为字节序列对应的是只读的字节序列,因此字符串可以包含任意的数据,包括 byte 值 0。我们也可以用字符串表示 GBK 等非 UTF8 编码的数据,不过这种时候将字符串看作是一个只读的二进制数组更准确,因为 for range 等语法并不能支持非 UTF8 编码的字符串的遍历。 Golang 中 String 的定义如下(reflect.StringHeader)在 Go 1.20 之后就被废弃了,因为...
Lock
Golang 锁的机制在说锁的时候主要是有两种锁,一类是乐观锁,还有一类是悲观锁。 悲观锁:默认 数据冲突时常发生 ,所以在操作之前就加锁,阻止其他线程同时访问该资源。常见场景是写多读少的情况,对数据一致性要求比较高的情况。 乐观锁:默认 数据冲突不常发生 ,所有直接操作,最后再通过版本号 / CAS 验证是否冲突,如果冲突了再重试。一般是适用于写少读少的情况,在线文档就是一种很好的案例。 我之前背八股文的时候认为 CAS 和 版本号机制是一种东西,但是好像不是那么一样。本质上,版本号机制是对于 CAS 机制的补充,是为了解决 ABA 问题。 CAS(compare and swap)CAS(比较并交换)是一种原子操作,在这个机制中有三个参数: 1. 主内存中存放的共享变量的值:V(一般来说都是内存的地址,通过这个地址可以获得对应的值) 2. 工作内存中共享变量的副本值,也叫做预期值:A 3....
hexo 图片无法正常显示解决办法
由于之前的文章都是写在 obsidian 的,虽然 obsidian 好用,但是还是想传到博客上面去,但是迁移的过程有点麻烦了。主要的问题就是 hexo 的图片问题。 图片可以在我的 cursor 里面正常预览,但是呢,我进行 hexo clean & hexo g & hexo s...
