Dawn's Blogs

分享技术 记录成长

0%

Redis提供了两种不同形式的持久化方式:

  • RDB(Redis Database)
  • AOF(Append Only File)

RDB(Redis Database)

RDB持久化指在指定的时间间隔内将内存中的数据集快照写入磁盘。它也是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb

对于RDB来说,提供了三种机制:

  • save
  • bgsave
  • 自动化

save

save会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止。

bgsave

Redis会fork一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。阻塞只发生在fork阶段,一般时间很短。

bgsave

阅读全文 »

事务的隔离性机制实现。

而事务的原子性、一致性和持久性由事物的redo日志undo日志来保证。

  • redo日志(重做日志):提供再写入操作,恢复提交事务修改的页操作,用来保证事务的持久性(如在内存中修改还没来得及写入磁盘中,此时系统宕机,就需要redo日志来保证修改写入到磁盘中)
  • undo日志(回滚日志):回滚行记录到某个特定版本,用来保证事务的原子性、一致性

undo日志不是redo日志的逆过程,redo和undo都可以是看作是恢复操作

  • redo日志:是存储引擎层生成的日志,记录的是物理级别上的页修改操作,主要为了保证数据的可靠性
  • undo日志:是存储引擎层生成的日志,记录的是逻辑操作日志,如对某个表进行了INSERT操作,那么undo日志就记录一条与之相反的DELETE操作。主要用于回滚一致性非锁定读

redo日志

InnoDB是以为单位来管理存储空间的。在访问页面时,需要先把磁盘上的页缓存到内存中的缓冲池中,所有的修改必须先更新缓冲池中的数据,然后缓冲区中的脏页(写入缓冲池但还没有写回磁盘的页)以一定频率被刷新到磁盘中。

为什么需要redo日志

若有这样一种场景,当事务提交后,刚写完缓冲池还没来得及将修改写回磁盘,数据库宕机了,那么这段数据就丢失了。

但是,事务包含了持久性的特点,对于一个已经提交的事务,在事务提交后即使系统发生了崩溃,这个事务对数据库中所做的更改也不能丢失。

所以,这就引入了redo日志:只需要把修改了哪些东西记录一下就好。InnoDB的事务采用了WAL(Write-Ahead Logging)技术,这种技术的思想就是先写日志(redo日志),再写磁盘,只有日志成功写入,事务才算提交成功。当服务器宕机还未刷新磁盘时,可以通过redo日志恢复,以保证事务的持久性

redo日志的作用

阅读全文 »

事务概述

事务定义

Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

Redis事务的主要作用就是串联多个命令防止别的命令插队。

multi exec discard命令

从输入multi命令开始,输入的命令都会依次进入命令队列中,但不会执行,直到输入exec后,Redis会将之前的命令队列中的命令依次执行

组队的过程中可以通过discard放弃组队

Multi Exec discard

阅读全文 »

Bitmaps

介绍

Bitmaps数据类型提供了对比特位的操作

  • Bitmaps其实不是一种新的数据类型,本质上它就是字符串,但是它可以对字符串的位进行操作

Bitmaps

常用命令

  • setbit <key> <offset> <value>:设置Bitmaps中某个偏移量的值

  • getbit <key> <offset>:获取Bitmaps中某个偏移量的值

  • bitcount <key> [start end]:统计字符串从start字节到end字节比特值为1的数量

  • bitop and(or/not/xor) <destkey> [key…]:对多个Bitmaps进行与、或、非、异或运算

HyperLogLog

介绍

HyperLogLog用于做基数(基数就是集合中不同元素的个数)统计,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很的。

但是,HyperLogLog只会根据输入元素来计算基数,而不会储存输入元素本身,所以HyperLogLog不能像集合那样,返回输入的各个元素。

常用命令

  • pfadd <key> < element> [element ...]:添加指定元素到HyperLogLog中

  • pfcount <key> [key ...]:计算多个HyperLogLog中的近似基数

  • pfmerge <destkey> <sourcekey> [sourcekey ...]:将一个或多个HyperLogLog合并后存储在另一个HyperLogLog中

Geospatial

Geospatial类型用于记录地理位置信息,即经纬度坐标。

Redis的发布订阅

Redis提供了发布订阅功能,可以用于消息传输

发布订阅架构

发布订阅机制包括三个部分:发布者、订阅者和channel:

Redis发布订阅

发布者和订阅者都是Redis客户端,Channel则为Redis服务器端,发布者将消息发送到某个的频道,订阅了这个频道的订阅者就能接收到这条消息。一个订阅者可以订阅多个chanel。

阅读全文 »

最长重复子数组

最长重复子数组

解题思路

利用动态规划的思想,dp[i][j]表示以nums1[i]nums2[j]为结尾的最长公共后缀的长度

  • 初始化为:
    • nums1[i] == nums2[0],则dp[i][0] = 1,否则为0
    • nums1[0] == nums2[j],则dp[0][j] = 1,否则为0
  • 状态转移方程:若nums1[i] == nums2[j]dp[i][j] = dp[i-1][j-1]+1,否则为0
阅读全文 »

事务概述

InnoDB是支持事务的

基本概念

事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态

事务处理的原则:保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操作时,要么所有的事务都被提交( commit ),那么这些修改就永久地保存下来;要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback )到最初状态。

事务的ACID特性

ACID即原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)

  • 原子性(atomicity):事务是一个不可分割的工作单位,要么全部提交,要么全部失败回滚
  • 一致性(consistency):事务执行前后,数据从一个合法性状态变换到另外一个合法性状态。这样的合法性状态不是语法上的,而是和具体业务有关的。
  • 隔离性(isolation):事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
  • 持久性(durability):一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。持久性是通过事务日志来保证的。日志包括了重做日志回滚日志。当我们通过事务对数据进行修改的时候,首先会将数据库的变化信息记录到重做日志中,然后再对数据库中对应的行进行修改。这样做的好处是,即使数据库系统崩溃,数据库重启后也能找到没有更新到数据库系统中的重做日志,重新执行,从而使事务具有持久性。
阅读全文 »

Redis概述

介绍

Redis是一个高性能的key-value数据库,默认端口号6379

Redis有以下特点:

  • Redis支持数据持久化,可以将内存中的数据保存在磁盘中
  • Redis支持的类型更丰富,包括string(字符串)list(链表)set(集合)zset(sorted set –有序集合)hash(哈希类型)
  • Redis支持数据的备份,master-slave(主从)同步

Redis 和memcache有三点不同:

  • 支持多数据类型。
  • 支持持久化。
  • 单线程+多路IO复用(memcache为多线程)
阅读全文 »

螺旋矩阵 II

螺旋矩阵 II

解题思路

生成一个空的矩阵,随后模拟整个向内环绕的填入过程。定义上下左右边界up, down, left, right,设被填入的数字为num。当num <= n*n时循环,始终按照上、右、下、左的顺序填入数字

解题代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
func generateMatrix(n int) [][]int {
// 生成一个空矩阵
matrix := make([][]int, n)
for i := 0; i < n; i++ {
matrix[i] = make([]int, n)
}
// 定义上下左右边界
up, down, left, right := 0, n-1, 0, n-1
num := 1 // 待填入的数字
// 螺旋遍历矩阵,填入数字
for num <= n*n {
// 填写上边界
for i := left; i <= right; i++ {
matrix[up][i] = num
num++
}
up++
// 填写右边界
for i := up; i <= down; i++ {
matrix[i][right] = num
num++
}
right--
// 填写下边界
for i := right; i >= left; i-- {
matrix[down][i] = num
num++
}
down--
// 填写左边界
for i := down; i >= up; i-- {
matrix[i][left] = num
num++
}
left++
}

return matrix
}
阅读全文 »

范式

在关系型数据库中,关于数据表设计得基本原则/规则,就称为范式(Normal Form,NF)。目前关系型数据库有六种常见范式,按照范式级别从低到高分别是:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF)

数据库得范式设计越高阶,冗余度越低,同时高阶范式一定满足低阶范式得要求。一般在关系型数据库设计中,最高也就遵循到BCNF,普遍还是3NF。但是有些时候为了提高查询性能,还需要破坏范式规则,称为反规范化

阅读全文 »