最长上升子序列问题及其变种
总结最长上升子序列问题,类别划分及具体练习,帮助读者加以理解和巩固。
Java 中的随机数
总结 Java 中和随机数相关的函数。可以用 Random 类的 nextInt(bound) 返回 [0, bound - 1 ] 之间的随机数。
Redis 学习——一致性
如果 Redis 发生了宕机,AOF 和 RDB 可以分别通过回放日志和重新读入 RDB 文件的方式恢复数据,从而保证尽量少丢失数据,提升可靠性。
不过,即使用了这两种方法,也依然存在服务不可用的问题。比如说,我们在实际使用时只运行了一个 Redis 实例,那么,如果这个实例宕机了,它在恢复期间,是无法服务新来的数据存取请求的。
那我们总说的 Redis 具有高可靠性,又是什么意思呢?其实,这里有两层含义:一是数据尽量少丢失,二是服务尽量少中断。AOF 和 RDB 保证了前者,而对于后者,Redis 的做法就是增加副本冗余量,将一份数据同时保存在多个实例上。即使有一个实例出现了故障,需要过一段时间才能恢复,其他实例也可以对外提供服务,不会影响业务使用。
副本之间的数据如何保持一致呢?
本文的学习目标如下:
了解主从库,主从库同步的原理,应对网络断连风险的方案。
了解增量复制和切片集群。
了解哨兵机制。
了解哨兵集群。
了解切片集群。
数据同步:主从库模式Redis 提供了主从库模式,以保证数据副本的一致,主从库之间采用的是读写分离的方式。
读操作:主库、从库都可以接收;
写操作: ...
质数、因数和质因数
总结质数和因数相关的基本概念,类别划分及具体练习,帮助读者加以理解和巩固。
Redis 学习——内存快照 RDB
用 AOF 方法进行故障恢复的时候,需要逐一把操作日志都执行一遍。如果操作日志非常多,Redis 就会恢复得很缓慢,影响到正常使用。
我们今天要一起学习的另一种持久化方法:内存快照。所谓内存快照,就是指内存中的数据在某一个时刻的状态记录。这个快照文件就称为 RDB 文件,其中,RDB 就是 Redis DataBase 的缩写。
RDB 记录的是某一时刻的数据,并不是操作,所以,在做数据恢复时,我们可以直接把 RDB 文件读入内存,很快地完成恢复。
本文的学习目标是:
了解 RDB 的原理和实现。
了解写时复制技术(Copy-On-Write, COW)。
了解增量快照。
了解混合使用 AOF 日志和内存快照。
RDB 的原理和实现Redis 的数据都在内存中,为了提供所有数据的可靠性保证,它执行的是全量快照,也就是说,把内存中的所有数据都记录到磁盘中。
这就带来两个问题:
给内存的全量数据做快照,把它们全部写入磁盘也会花费很多时间。
全量数据越多,RDB 文件就越大,往磁盘上写数据的时间开销就越大。
对于 Redis 而言,它的单线程模型决定了,我们要尽量避免所有会阻塞主线程 ...
Redis 学习——AOF日志
Redis 是内存数据库。一旦断电,内存中的数据就会丢失。如何保证 Redis 的可靠性呢?
Redis 主要采取 AOF 日志和 RDB 内存快照两种持久化的手段。本文主要学习 AOF 日志。
本文的学习目标如下:
了解基本的日志。
了解 AOF 日志的实现和写回策略。
了解 AOF 日志的重写策略。
日志(log)日志是 MySQL 数据库的重要组成部分,记录着数据库运行期间各种状态信息。MySQL 日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。作为开发,我们重点需要关注的是二进制日志(binlog)和事务日志(包括 redo log 和 undo log )。
undo log为什么?我们在执行执行一条“增删改”语句的时候,虽然没有输入 begin 开启事务和 commit 提交事务,但是 MySQL 会隐式开启事务来执行“增删改”语句的,执行完就自动提交事务的,这样就保证了执行完“增删改”语句后,我们可以及时在数据库表看到“增删改”的结果了。
执行一条语句是否自动提交事务,是由 autocommit 参数决定的,默认是开启。所以,执行一条 upda ...
Redis 学习——单线程实现高性能
Redis 的单线程之所以那么快,主要原因是 Redis 的大部分操作在内存上完成,并且采用了 IO 多路复用机制,使其在网络 IO 操作中能并发处理大量的客户端请求,实现高吞吐率。
Redis 学习——数据结构
Redis 接收到一个键值对操作后,能以微秒级别的速度找到数据,并快速完成操作。
Redis 是怎么做到这么快速的呢?答案就在底层数据结构中。
本文的目的主要是:
了解 Redis 的底层数据结构。
了解 Redis 键值对的组织方式。
底层数据结构简单来说,底层数据结构一共有 6 种,分别是简单动态字符串、双向链表、压缩列表、哈希表、跳表和整数数组。它们和数据类型的对应关系如下图所示:
整数数组和双向链表很常见,它们的操作特征都是顺序读写,也就是通过数组下标或者链表的指针逐个元素访问,操作复杂度基本是 O(N),操作效率比较低。
接下来介绍 Redis 中其它四种具体的数据结构:
哈希表
压缩列表
跳表
简单动态字符串
哈希表为了实现从键到值的快速访问,Redis 使用了一个哈希表来保存所有键值对。
一个哈希表,其实就是一个数组,数组的每个元素称为一个哈希桶。所以,我们常说,一个哈希表是由多个哈希桶组成的,每个哈希桶中保存了键值对数据。
不管值是 String,还是集合类型,哈希桶中的元素都是指向它们的指针。
在下图中,可以看到,哈希桶中的 entry 元素中保存了key和 ...
Redis 学习——简介
Redis 是典型的内存键值数据库,经常被用于缓存、秒杀、分布式锁等场景。本文的目标是对 Redis 的总体架构和关键模块有一个全局的认知。
从波提切利到梵高——英国国家美术馆珍藏展
2023年1月17日至5月7日,上海博物馆首度联手英国国家美术馆,推出“对话世界”文物艺术大展系列的第二个展览——“从波提切利到梵高:英国国家美术馆珍藏展”。展览通过 52 件大师杰作,为观众奉上一场视觉盛宴,讲述欧洲绘画的故事。