MySQL 去重该使用 distinct 还是 group by


MySQL 去重该使用 distinct 还是 group by 在数据库查询中,去重是一个常见的需求。无论是处理用户数据、日志记录还是其他类型的数据集,我们常常需要获取唯一值或唯一组合。MySQL 提供了两种主要的方法来实现这一目标:DISTINCT 和 GROUP BY。这两种方法各有优劣,选择

计数与信息流设计


计数 假如要存储帖子维度(帖子的计数,转发数、赞数等等)的数据,你可以这么设计表结构:以帖子 ID 为主键,转发数、评论数、点赞数和浏览数分别为单独一列,这样在获取计数时用一个 SQL 语句就搞定了。 select repost_count, comment_count, praise_count,

系统维护


监控指标如何选择 在服务层面一般需要监控四个指标,分别是延迟,通信量、错误和饱和度。 延迟指的是请求的响应时间。比如,接口的响应时间、访问数据库和缓存的响应时间。 通信量可以理解为吞吐量,也就是单位时间内,请求量的大小。比如,访问第三方服务的请求量,访问消息队列的请求量。 错误表示当前系统发生的错误

利用 Redission 实现延迟队列

Redis 

利用 Redission 实现延迟队列 1. Redis 实现延迟队列的方案 基于 Redis 实现延时任务的功能无非就下面两种方案: Redis 过期事件监听 Redisson 内置的延时队列 这里选用的是用 Redission 内置的延迟队列,所以实现的着重点放在 Redission 2. Re

Java线程池中线程异常后:是销毁还是复用?


Java线程池中线程异常后:是销毁还是复用? excute提交: execute 提交到线程池的方式,如果执行中抛出异常,并且没有在执行逻辑中catch,那么会抛出异常,并且移除抛出异常的线程,创建新的线程放入到线程池中。 可以发现,如果抛出异常,会移除抛出异常的线程,创建新的线程。 submit提

微服务设计


微服务拆分的原则 对于复杂的单体架构,可以看做是一个大的蜘蛛网,不同功能模块,错综复杂地交织在一起,方法之间调用关系非常的复杂,导致修复了一个 Bug,可能会引起另外多个 Bug,整体的维护成本非常高。同时,数据库较弱的扩展性,也限制了服务的扩展能力。 拆分原则: 原则一,做到单一服务内部功能的高内

消息队列设计


如何保证消息仅仅被消费一次? 消息从被写入到消息队列,到被消费者消费完成,这个链路上会有哪些地方存在丢失消息的可能?主要存 在三个场景: 消息从生产者写入到消息队列的过程。 消息在消息队列中的存储场景。 消息被消费者消费的过程 在消息生产的过程中丢失消息 在这个环节中主要有两种情况。 首先,消息的生

Mysql为什么使用B+树而不使用跳表

MySQL 

B+树更适合磁盘IO B+Tree一个节点是一个page,是一种多叉树结构,每个结点都是一个16k的数据页,能存放较多索引信息。一次IO一个page,大大节省了磁盘IO的操作。 B+Tree一个page 能存放较多索引信息 ,所以树的层数比较低, 三层左右就可以存储2kw左右的数据也就是说查询一次数

缓存设计


缓存一般是基于内存的,做一次内存寻址大概需要 100ns,而做一次磁盘的查找则需要 10ms。 1. 缓存数据如何分片 一般来讲,分片算法常见的就是 Hash 分片算法和一致性 Hash 分片算法两种。 Hash 分片的算法就是对缓存的 Key 做哈希计算,然后对总的缓存节点个数取余。 这个算法最大

数据库设计


分库分表是一种常见的将数据分片的方式,它的基本思想是依照某一种策略将数据尽量平均的分配到多个数据库节点或者多个表中。 不同于主从复制时数据是全量地被拷贝到多个节点,分库分表后,每个节点只保存部分的数据,这样可以有效地减少单个数据库节点和单个数据表中存储的数据量,在解决了数据存储瓶颈的同时也能有效的提