摘要: 一、redis set nx实现限流 比如我们需要在10秒内限定20个请求,那么我们在setnx的时候可以设置过期时间为当前时间戳+10s,使用set nx 设置20个互不相同的key,当请求的setnx数量达到20时候即达到了限流效果。 当然这种做法的弊端是很多的,比如当统计1-10秒的时候,无法 阅读全文
posted @ 2022-10-31 15:46 matengfei 阅读(416) 评论(0) 推荐(0) 编辑
摘要: 一、数据丢失的情况 异步复制同步丢失 集群产生脑裂数据丢失 1.异步复制丢失 对于Redis主节点与从节点之间的数据复制,是异步复制的,当客户端发送写请求给master节点的时候,客户端会返回OK,然后同步到各个slave节点中。 如果此时master还没来得及同步给slave节点时发生宕机,那么m 阅读全文
posted @ 2022-10-24 20:05 matengfei 阅读(70) 评论(0) 推荐(0) 编辑
摘要: 有一个项目,mysql 语句采用了not in,结果某些页面打开需要40多秒,排查sql语句后,发现是采用了 not in 语法导致全表扫描,消耗了大量的时间,飘易记录下优化的过程: 项目简介:会议应该签到表 signshould :15万条数据会议实际签到表 sign :10万条数据请假表 lea 阅读全文
posted @ 2022-10-24 19:53 matengfei 阅读(2352) 评论(0) 推荐(0) 编辑
摘要: 主键索引是InnoDB存储引擎默认给我们创建的一套索引结构,我们表里的数据也是直接放在主键索引里,作为叶子节点的数据页。 但我们在开发的过程中,往往会根据业务需要在不同的字段上建立索引,这些索引就是二级索引,今天我们就给大家讲讲二级所有的原理。 比如,你给name字段加了一个索引,你插入数据的时候, 阅读全文
posted @ 2022-07-22 22:17 matengfei 阅读(133) 评论(0) 推荐(0) 编辑
摘要: 内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。 内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可 阅读全文
posted @ 2022-02-28 20:45 matengfei 阅读(186) 评论(0) 推荐(0) 编辑
摘要: 之前有一篇文章介绍分布式id生成粗略选型,提到雪花算法作为一个优秀的方案,满足了我们在分布式下的id生成需求。但如果直接把雪花算法生成的id作为分表键(shard key)在低并发下是会有问题的。下面来一起看下。 现象 我们分表数量是256张表(tb_0,tb_1,tb_2...tb_255),分表 阅读全文
posted @ 2022-02-08 17:32 matengfei 阅读(1058) 评论(0) 推荐(0) 编辑
摘要: 在数据库主键设计上,比较常见的方法是采用自增ID(1开始,每次加1)和生成GUID。数据库自增主键保证唯一性,但在分布式系统中,部署需要考虑的因素太多;GUID设计简单,能保证主键的唯一性,分布式系统中,数据库部署也简单,只是GUID是一串无物理意义的字符串,大量数据查询的时候效率相对会打折,存储暂 阅读全文
posted @ 2022-02-08 14:28 matengfei 阅读(575) 评论(0) 推荐(0) 编辑
摘要: 然而如果某个 goroutine 运行时间太长了,那很肯定会拖累主 goroutine 被阻塞住,整个程序就挂起在那儿了。因此我们需要有超时的控制。 通常我们可以通过 select + time.After 来进行超时检查,例如这样,我们增加一个函数 Run() ,在 Run() 中执行 go ru 阅读全文
posted @ 2021-05-08 17:35 matengfei 阅读(101) 评论(0) 推荐(0) 编辑
摘要: 当业务规模达到一定规模之后,像淘宝日订单量在5000万单以上,美团3000万单以上。数据库面对海量的数据压力,分库分表就是必须进行的操作了。而分库分表之后一些常规的查询可能都会产生问题,最常见的就是比如分页查询的问题。一般我们把分表的字段称作shardingkey,比如订单表按照用户ID作为shar 阅读全文
posted @ 2021-03-10 17:35 matengfei 阅读(95) 评论(0) 推荐(0) 编辑
摘要: 缓存机制介绍 如今利用缓存机制来提高查询效率已被广泛用在各大生产环境,查询数据的一般流程如下所示 使用缓存提高查询效率 如果数据在缓存里边有,则直接从缓存取数据返回。 如果缓存中没有想要的数据,则先去查询数据库,然后将数据库查出来的数据写到缓存中再返回 没有更新数据的情况下,数据库和缓存的数据是保持 阅读全文
posted @ 2021-03-10 15:36 matengfei 阅读(97) 评论(0) 推荐(0) 编辑