随笔分类 - 数据库
摘要:总结 实现一个严格的 LRU 算法,需要额外的内存构建 LRU 链表,同时维护链表也存在性能开销,Redis 对于内存资源和性能要求极高,所以没有采用严格 LRU 算法,而是采用**「近似」**LRU 算法实现数据淘汰策略 触发数据淘汰的时机,是每次处理**「请求」**时判断的。也就是说,执行一个命
阅读全文
摘要:基础架构 连接器 建立连接成本过高,尽量使用长连接,维护长连接的方式有两种:定期断开长连接或定期执行mysql_reset_connection 来重新初始化连接资源 查询缓存 (key-value形式)key是查询语句,value是查询结果,查询缓存命中率不高,弊大于利,在mysql8.0已被移除
阅读全文
摘要:建索引的几大原则 最左前缀匹配原则 mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到
阅读全文
摘要:总结 很多人认为 Redis 是单线程,这个描述是不准确的。准确来说 Redis 只有在处理**「客户端请求」**比如接收客户端请求、解析请求和进行数据读写等操作时,是单线程的。但整个 Redis Server 并不是单线程的,还有后台线程,比如文件关闭、AOF 同步写和惰性删除在辅助处理一些工作。
阅读全文
摘要:索引目的 索引的目的在于提高查询效率,可以类比字典索引。 索引原理 通过不断的缩小想要获得数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件 数据库实现比较复杂,数据保存在磁盘上,而为了提高性能,每次又可以把部分数据读入内存来计算,因为访问磁盘的成本大概是访问内存的十万倍左右 磁盘IO
阅读全文
摘要:使用场景 DB缓存,减轻服务器压力 提高系统响应 做Session分离 分布式锁(Redis) 多个进程(JVM)在并发时也会产生问题,也要控制时序性,使用Redis实现 sexNX 乐观锁(Redis) 同步锁和数据库中的行锁、表锁都是悲观锁,悲观锁的性能是比较低的,响应性比较差 高性能、高响应(
阅读全文
摘要:对于海量的互联网业务来说,除了线上的数据库,还需要有一套对应的历史数据库,用于查询历史的数据。比如查看历史微博、查看淘宝历史交易。 历史数据库架构 业务会将最新的数据变更插入在线的 MySQL 数据库,但 MySQL 数据库仅保留最近半年的数据,超过半年的数据会存放在历史数据库系统中。对于历史数据库
阅读全文
摘要:DROP TABLE 生产环境大多数是已经确定的库表,一般不会进行 DROP TABLE 这么重的操作,甚至大部分DBA 都不应该拥有 DROP 权限。 随着数据无限增长,在某些系统中,需要将数据归档到历史数据库,删除生产数据库中的表,从而释放存储空间,典型的就是偏日志、流水类的数据。 “优雅的删除
阅读全文
摘要:表结构设计 INT 类型不使用 unsigned 无符号属性,容易引入额外的计算问题。 自增用 8 字节 BIG INT,不要使用 4 字节 INT,且自增在 MySQL 8.0 版本前有回溯问题,请考虑是否业务有影响。 字符集使用 UTF8MB4 字符编码,不推荐 GBK、UTF-8 等其他字符集
阅读全文
摘要:总结 要想理解 Redis 数据类型的设计,必须要先了解 redisObject。 Redis 的 key 是 String 类型,但 value 可以是很多类型(String/List/Hash/Set/ZSet等),所以 Redis 要想存储多种数据类型,就要设计一个通用的对象进行封装,这个对象
阅读全文
摘要:通过阅读 Redis 源码,可以学习和掌握到的计算机系统设计思想 根据 Redis 不同的功能特性,分线条学习每个功能特性上涉及的关键技术和设计思想 对于Redis的代码架构,需要掌握以下两类内容 代码的目录结构和作用划分,目的是理解 Redis 代码的整体架构,以及所包含的代码功能类别; 系统功能
阅读全文
摘要:介绍 etcd是一个高可用的 Key/Value 存储系统,主要用于分享配置和服务发现。它是一款云原生时代的首选元数据存储产品,已经成为云原生和分布式系统的存储基石。 简要基础架构图 Client层 组成 client v2 API 客户端库 client v3 API 客户端库 作用 提供了简
阅读全文