缓存与数据库更新策略 缓存更新缓存(Redis、memory cache等)被广泛应用于高并发、高性能的项目中。应用在,请求先查询缓存,命中则返回。未命中则查询数据库,并缓存。而且缓存也有过期时间的,避免浪费内存、出现不一致等,因此缓存是最终一致性的。但实际使用中,需要主动更新缓存。那就存在一个问题:为保证数据读取的正确性、一致性,是先更新缓存,还是先更新数据库?数据变化时,缓存可以更新也可以删除,等查询的时候再次缓存即可。因此可以组合出以下四种策略:先更新缓存,再更新数据库;先删除缓存,再更新数据库;先更新数据
Redis高级特性 随着Redis越来越火,除了基本提供的五种基本数据类型,也提供了其他数据结构和特性。另外,其独特的Module加载机制也带来了极大的可扩展性。漏斗限流在业务中我们可能对一些调用、执行进行限流。而redis就为我们提供了一种方式。限流涉及的指标有 容量 流出速率 管道管道不是Redis独有的。本质上redis 客户端通过对管道中的指令列表改变读写顺序来节省IO。服务器依旧是收到一条消息,执行一条消息,回复一条消息。Geo我们知道,地球是一...
Redis主从复制与集群 之前已经介绍了一些redis的基本特性。这里介绍下主从复制与集群工作方式。主从复制为保证redis的高可用性,一般都会跟其他中间件一样进行主从复制。比如kafka是把消息传递、mysql使用binlog。既然涉及到分布式,就不得不提及CAP理论。CAP理论有三点 C-Consistent 一致性 A-Availability 可用性 P-Partition tolerance 分区容忍性 也就是说在一个分布式系统中,不能同时保证这三个特性。即,网络分区发生时,一
MySQL中InnoDB特性 InnoDB关键特性InnoDB是Mysql最常用的存储引擎。这里简单说下它的一些特性。主要有:插入缓冲、两次写、自适应哈希、异步IO、刷新临近页。插入缓冲即我们所说的Insert Buffer,xxx使用条件同时满足: 索引是辅助索引 索引不是唯一索引 可以在 show status 中查看,seg size * 16KB 代表Insert Buffer大小。两次写即Double Write,主要是为了保证数据页的可靠性。自适应哈希...
MySQL体系结构简介 很多人都用过MySQL,可能有些人对MySQL的结构和底层比较模糊。这里简单介绍下。MySQL架构首先看下一个随处可见的架构图,也是大家对MySQL可插拔式存储引擎吹捧的原因从图中可以看出大致分八个组件,这里简单说明下:组件 功能 说明 Connectors 连接客户端 Management Service & Utilities 系统管理控制工具、备份、灾难恢复、分区管理、集群等 Connection Pool 连接..
MySQL数据页结构 最近在学习Mysql的数据结构,这里整理下。因为主流存储引擎是InnoDB,学习的也是它。这里介绍的也是InnoDB。数据页在操作系统中,我们知道为了跟磁盘交互,内存也是分页的,一页大小4KB。同样的在MySQL中为了提高吞吐率,数据也是分页的,不过MySQL的数据页大小是16KB。(确切的说是InnoDB数据页大小16KB)为了详细说明,这里先用图介绍一下页的结构:而在MySQL内存中,多个这样的数据结构作为节点构成一个双向链表。File Header从上边的图也可以.
MySQL日期类型 MySQL日期类型有5种,分别是DATETIME、 TIMESTAMP、DATE、TIME和YEAR。前三种比较常用。这里对比下 日期时间类型 占用空间 日期格式 最小值 最大值 零值表示 DATETIME 8 bytes YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:
五种IO类型简单了解 编程过程中经常会遇到 IO,而且各种技术框架底层也是各种IO的应用。这里简单整理下。IO类型参考《UNIX网络编程》,IO一共分五种类型 阻塞IO(bloking IO) 同步非阻塞IO(synchronous non-blocking IO) 信号驱动式IO(signal-driven IO) 多路复用IO(multiplexing IO) 异步IO(asynchronous IO) 前四种为同步IO,最后一种为异步IO。概念这里简单介绍.
Typora使用快捷键 markdown 可以很好的编辑一个文档的格式,只是它的学习成本高而且只有编程习惯的人才能高效使用它。Typora是一个所见即所得的Markdown格式文本编辑器,支持Windows、macOS和GNU/Linux操作系统。简单来说,只需要简单的快捷键等操作,即可获取一个简洁美观的文档格式。下边介绍下它的使用,这里以 macOS为准。更新中...
Java字节码理解 Java字节码其实就是 .class 文件.我们写出的Java源代码经过编译后就会变成 class文件。编译过程源代码是程序员写的。JVM识别不了,因此需要编译器主要对源码代码做编译处理,大致如下:词法分析器 => 语法分析器 => 语法树/抽象语法树 => 语义分析器 => 注解抽象语法树 => 字节码生成器 => class文件这个过程涉及编译原理,就不说了。执行以下命令即可对类进行编译javac XXX.javaClass文件.
Redis服务启动、事件循环与客户端命令的执行 Redis 服务启动直接看代码。新的版本中服务器启动代码在 server.c 中int main(int argc, char **argv) { struct timeval tv; int j; // 省略 ... initServerConfig(); moduleInitModulesSystem(); if (argc >= 2) { // ... resetServerSaveParam
redis之RediSearch全文搜索 RediSearchRediSearch是一个高性能的全文搜索引擎,可作为一个Redis Module 运行在Redis上,是由RedisLabs团队开发的。主要特性如下:简单,快速索引和搜索数据存储在内存中,使用内存-有效的自定义数据结构支持多种使用UTF-8编码的语言文档和字段评分结果的数值过滤通过词干扩展查询精确的短语搜索按特定属性过滤结果(例如仅在标题中搜索“foo”)强大的自动提示引擎增量索引(不需要对索引进行优化和压缩)支持用作存储在另一数据库中的文档的搜索索引
RPC简单总结 RPC说起RPC,大家应该都用过一些常用RPC 框架。这里就不说了。RPC(Remote Procedure Call ),即远程过程调用。简单来说就是本地调用远程机器上的一个函数调用。RPC 最开始来源于 Bruce Jay Nelson 的论文《Implementing Remote Procedure Calls》。论文对RPC 基本结构解析如图:简单来说,RPC 有 5 个组件:1. User : 即客户端,也就是本地的调用方2. User-stub : 负责将调用的接
Redis源码编译与调试 Redis 是目前最常用的缓存数据库,C语言编写的。这里我用Clion 编译调试。Clion 安装CLion 是 JetBrains 推出的全新的 C/C++ 跨平台集成开发环境。用来阅读 Redis 源码再合适不过了。函数调用查询、跳转都很方便。从官网下载安装即可。下载源码首先从官网下载源码下载后解压即可。编译Clion 里用CMake 编译,因此需要安装 CMake。Mac 上直接命令安装即可brew install cmakeRedis源码有多个模..
Java的ConcurrentHashMap 底层了解 最近有人问Java8 中ConcurrentHashMap 底层实现,这里简单列下。大家都知道 Java8 对HashMap 、ConcurrentHashMap 进行了改进,前者非线程安全,后者线程安全。HashMap在Java 7 中,采用哈希表结构在Java 8 中,采用哈希表 + 红黑树ConcurrentHashMap在Java 7 中,采用分段的哈希表在Java 8 中,采用数组 + 链表+ 红黑树两者类似,下边主要讲下ConcurrentHashMap...
Java的synchronized 了解 Java中的锁在 Java 中主要2种加锁机制:synchronized 关键字java.util.concurrent.Lock (ReentrantLock是该接口的一个常用实现)两者在底层存在一些差别:synchronized 是关键字,通过一对字节码指令 monitorenter/monitorexit 实现。java.util.concurrent.Lock 利用Java 代码和sun.misc.Unsafe 中的本地调用实现的。Unsafe 包不是Java规范的一部分...
布隆过滤器Bloom filter基本原理 最近有碰到布隆过滤器,发现redis本身没有实现它。如果使用需要再安装这个模。有兴趣的可以自己学习下先看下介绍The RedisBloom module provides four data structures: a scalable Bloom filter, a cuckoo filter, a count-min sketch, and a top-k. These data structures trade perfect accuracy for extreme memory effi
IntelliJ IDEA jprofiler安装及性能分析 Eclicpse 中可以集成MAT,即 Memory Analyzer Tool。进行性能分析。而IntelliJ 里面可以用jprofiler 进行vm 性能分析。jprofiler功能JProfile是一款性能瓶颈分析工具,监控粒度可以细化到某一个类包。主要功能有:1.内存剖析 Memory profiler2.堆遍历 Heap walker3.CPU 剖析 CPU profiler4.线程剖析 Thread profiler5.VM 遥感勘测技术 VM telemetry
Redis简单了解三 事务redis 的事务跟之前了解的事务不一样。它是将多个命令请求打包,然后按顺序、一次性地执行多个命令。事务执行期间,服务器不会中断事务而去执行其他客户端的命令。注意,redis事务是不支持回滚的。事务分三步:事务开始 MULTI,打开事务标识命令入队事务提交执行 EXEC事务还可以配合watch使用,watch 即乐观锁。事务开始前,注册监视某key,在exec ...