场景

短链接系统实现 如何保证生成短链接不重复 如何存储短链接 用302(临时)还是301(永久)重定向 https://cloud.tencent.com/developer/article/1858351 https://blog.csdn.net/codejas/article/details/106102452 https://juejin.cn/post/7312353213348741132 秒杀 使用redis(保证秒杀效率)的lua脚本(保证原子性)进行库存扣减,使用分布式事务的二阶段消息解决事务数据一致性。二阶段消息适用于无需回滚的这一类数据一致性问题,主要是为了保证第一阶段操作执行成功后,后续阶段一定能感知并执行。 二阶段消息的回查操作,主要还是依赖事务中第一阶段使用的数据库,来保证第一阶段整体操作的原子性以及幂等。 无论是请求执行lua脚本的服务端宕机,还是redis服务本身宕机,lua脚本都保证原子性,即写操作均无效 库存扣减lua脚本: -- KEYS[1] 库存 -- KEYS[2] 事务当前操作 -- KEYS[3] 如果事务当前操作是回滚操作,则为回滚所对应的操作 local v = redis.call('GET', KEYS[1]) -- 库存 local e1 = redis.call('GET', KEYS[2]) -- 事务当前操作的状态 if v == false or v + ARGV[1] < 0 then -- 库存不足 return 'FAILURE' end if e1 ~= false then -- 当前状态不为空,幂等退出 return 'DUPLICATE' end -- 设置当前操作为已完成 redis.call('SET', KEYS[2], 'op', 'EX', ARGV[3]) if ARGV[2] ~= '' then local e2 = redis.call('GET', KEYS[3]) if e2 == false then -- 如果是回滚操作,将回滚对应操作的状态设置为已回滚 redis.call('SET', KEYS[3], 'rollback', 'EX', ARGV[3]) return end end -- 库存扣减 redis.call('INCRBY', KEYS[1], ARGV[1]) 回查lua脚本: local v = redis.call('GET', KEYS[1]) -- 扣减库存操作的状态 if v == false then -- 为空则直接回滚 redis.call('SET', KEYS[1], 'rollback', 'EX', ARGV[1]) v = 'rollback' end -- 如果阶段1是回滚,直接返回事务失败 if v == 'rollback' then return 'FAILURE' end -- 如果不是回滚,说明事务成功 以下是可能出现的各个场景。 ...

十一月 6, 2024 · by NOSAE

clickhouse ClickHouse 的高性能主要来自以下几个方面的设计特点: ​ 1. 列式存储:ClickHouse采用列式存储(Columnar Storage),在查询时可以只读所需的列,而不是整个行。这极大减少了磁盘I/O,尤其适合分析型查询。 ​ 2. 数据压缩:列式存储便于数据压缩,ClickHouse内置了多种压缩算法(如LZ4、ZSTD等),根据数据特征选择最佳压缩方式,减少了存储空间和I/O开销。 ​ 3. 向量化引擎:ClickHouse的数据处理是基于向量化引擎的。向量化处理数据意味着每次处理一个数据块,而不是单条数据,充分利用了CPU的指令集,极大提升了数据处理速度。 ​ 4. 多线程并行查询:ClickHouse支持多线程并行处理,分区并行化查询,充分利用多核CPU的性能。在一个查询中可以调度多个线程同时工作,使得复杂查询能高效完成。 ​ 5. 内存管理:ClickHouse对内存管理进行了优化,尽可能减少内存分配和释放操作。比如查询时,通常不会频繁分配和释放内存,而是通过重用内存块来降低内存碎片。 ​ 6. 数据分区和分片:ClickHouse支持对数据进行水平分区和分片,能够处理海量数据。它可以将不同分片的数据分布到不同节点上,并行处理分片数据,提高了系统的扩展性和查询性能。 ​ 7. 基于MergeTree的表引擎:MergeTree 是ClickHouse的核心存储引擎。它支持数据的自动排序和索引,查询时可以快速定位目标数据块,避免了全表扫描。 ​ 8. 向量化索引:ClickHouse会为列数据创建稀疏索引,通过向量化索引来过滤数据块,进一步加速查询。辅助索引的存在能够快速定位相关数据块,尤其适用于高基数的列。 ​ 9. 数据延迟写入和异步物化视图:ClickHouse的写入延迟较低,因为它将数据先写入内存中的“insert buffer”缓冲区,之后才会批量写入磁盘。异步物化视图会在后台进行处理,不影响查询性能。 以上技术特性使ClickHouse在处理大数据量的复杂分析查询时,性能极为优越,能够快速响应实时查询需求。 建表时order by的作用: 确定数据存储顺序:ORDER BY字段决定了表内数据的存储顺序,ClickHouse会按照该字段对数据块进行排序。 自动生成稀疏索引:ORDER BY字段会自动创建稀疏索引,帮助ClickHouse跳过不满足查询条件的数据块,从而加速查询。 提高查询效率:尤其对于范围查询、过滤、分组等,选择合适的ORDER BY字段能够减少扫描量并加快响应速度。 名词解释 稀疏索引:在ClickHouse中,数据组织为:分区(partition)->数据块(parts)->数据段(granules)。稀疏索引记录每个数据段的特征(比如最大值、最小值),查询的时候用来快速跳过某些不需要加载的数据段。 辅助索引:稀疏索引不适用于加速高基数列的查询。辅助索引有bloom filter、minmax等

十一月 1, 2024 · by NOSAE

go GC

基础知识 Tip go的垃圾回收是没有分代,不整理,并发的三色标记清扫算法 go1.3标记清除 从gc root出发,标记所有可达对象。最后扫描整个head,将没有标记的对象(不可达对象)清除。但缺点是STW、需要扫描整个heap、清除后会产生大量碎片。 为了缓解STW来带的停止长时间用户程序执行,标记之后马上停止STW,清除阶段与用户程序并行执行。 ...

九月 25, 2024 · by NOSAE

golang GMP调度器

Note 本文基于go1.21.2,不同版本的go可能会有差异。文中部分代码会由于不是知识点强相关而省略,但被忽略的每行代码或多或少都有它们实际的用处,甚至可能不宜删除,欢迎指出 Tip 分析底层的相关的代码时,往往会由于平台架构而带来代码上的差异,比如我机器是darwin/arm64,使用vscode查看代码,而且我希望基于linux/amd64来看代码,可以在.vscode/settings.json中设置GOOS和GOARCH: ...

九月 24, 2024 · by NOSAE

golang底层知识汇总

Note 本文基于go1.21.2,不同版本的go可能会有差异。文中部分代码会由于不是知识点强相关而省略,但被忽略的每行代码或多或少都有它们实际的用处,甚至可能不宜删除,欢迎指出 Tip 分析底层的相关的代码时,往往会由于平台架构而带来代码上的差异,比如我机器是darwin/arm64,使用vscode查看代码,而且我希望基于linux/amd64来看代码,可以在.vscode/settings.json中设置GOOS和GOARCH: ...

九月 3, 2024 · by NOSAE