使用redis作为延迟队列方案对比背景项目中经常需要做某个操作, 然后一定时间之后看这个操作的执行结果。 要么使用定时任务扫描, 要么使用延时队列(任务)来实现。在主流的 MQ 中支持延时消息的有 RabbitMQ 和 RocketMQ, 如果没有使用这个两个 MQ, 譬如使用了 Kafka, 又想使用延时消息的功能可以使用 Redis来实现。 Redis 实现延时队列有三种方案: 基于 Zset(Sorted Set) 来实现 2024-11-12 中间件 #redis
go内存分配与垃圾回收go 内存管理基本概念go 与 java类似, 都实现了自动内存管理。 Golang运行时的内存分配算法主要是 TCMalloc算法。核心思想就是把内存分为多级管理,从而降低锁的粒度。它将可用的堆内存采用二级分配的方式进行管理:每个线程都会自行维护一个独立的内存池,进行内存分配时优先从该内存池中分配,当内存池不足时才会向全局内存池申请,以避免不同线程对全局内存池的频繁竞争。 基本概念 Page 2024-10-14 go
unsafe.Pointer与uintptruintptr 一个足够大的无符号整型,用来表示内存地址的值,比如 0xffffffff 可以进行地址的数值计算 uintptr 可以和 int、int8、int32、uint8 等整型类型相互转换 使用示例: 12345678910func main() { var i int = 1 fmt.Println(uintptr(i)) fmt.Println(uint 2024-10-11 go
go map 原理与并发安全mapmap 原理go map 整体和 java hashmap 差不多, 只是源码阅读的位置不太方便 map 的相关文件位于 GOROOT 的 runtime 包中的 map.go map 结构hmap12345678910111213141516171819202122232425// A header for a Go map.type hmap struct { // map中的 2024-10-09 go
MySQ之onlineDDLDDL 的算法copyCOPY是MYSQL 5.5以及之前的默认算法,使用COPY算法会锁表,不支持online ddl,COPY算法在server层创建一个临时表用于copy数据,最后用新表替换旧表。 copy 算法的执行执行流程: 准备: 对表加 DML 读锁,读取元数据(DDL不并行,DML可以并行) 升级 DML 写锁(DDL和DML都不并行) 按照原表定义创建一个新的临时表 执行 2024-08-08 mysql #mysql
k8s_service网络原理k8s 中网络访问方式 如上图, K8s 目前有四种网络访问方式: 同一个 Node 内 Pod 访问 跨 Node 间 Pod 访问 Pod 访问集群外服务 集群外访问集群内 Pod 网络空间的隔离network namespace 是实现网络虚拟化的重要功能,它能创建多个隔离的网络空间,它们有独自的网络栈信息。不管是虚拟机还是容器,运行的时候仿佛自己就在独立的网络中。对于每个 networ 2024-07-08 云原生 #网络 #k8s
从ES底层原理来看查询优化ES 底层设计概览ES 底层(或者说内核)是基于 Lucene,本文从 ES 查询流程以及 Lucene 底层的一些存储结构设计设计, 来分析 ES 的一些查询优化方向 ES 查询模型 上图是 ES 的完整查询流程, ES 的任意节点可作为写入请求的协调节点(Coordinating Node),接收用户请求。协调节点将请求转发至对应一个或多个数据分片的主或者从分片进行查询,各个分片查询结果最后 2024-06-20 中间件 #es #算法
feeds流系统设计概述Feeds 流概述什么是 Feeds 流? 从用户层面来说, 各种手机 APP 里面, 特别是社交类的, 我们可以看到关注的内容、好友的动态聚合成一个列表(最典型的就是微信朋友圈)都是 feeds 流的一种形式。 Feeds 流的核心功能就是: 信息聚合它可以根据你的行为去聚合你想要的信息,然后再将它们以轻松易得的方式提供给你。这个方式就是信息流的方式,你只需要不断的滑动,就可以再各种信息中穿梭, 2024-06-13 系统设计