Redis 集群

介绍

1.单机、单实例的持久化方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
rdb(relation-ship database)持久化:
默认redis会以一个rdb快照的形式,将一段时间内的数据持久化到硬盘,保存成一个dumpr.rdb二进制文件。
工作原理:当redis需要持久化时,redis会fork一个子进程,子进程将数据写到磁盘上临时一个RDB文件中。当子进程完成写临时文件后,将原来的RDB替换掉,这样的好处就是可以copy-on-write。

配置redis.conf:
save 900 1
save 300 10
save 60 10000

在900秒内,如果有一个key被修改,则会发起快照保存。300秒之内,如果超过10个key被修改,则会发起快照保存。在60秒内,如果1w个key被修改,则会发起快照保存。

aof(append-only file)持久化:
默认会以一个appendonly.aof追加进硬盘。

redis.conf默认配置:
appendfsync yes
appendfdync always
#每次有数据修改都会写入AOF
appendfsync everysec
#每秒同步一次,策略为AOF的缺省策略
阅读更多

Redis 常用语法

1.string

  • select db 选择数据库(0-20)
  • set k v 设置一个数据
  • set k1 v nx nx仅仅可以新建的时候进行插入数据
  • set k2 v xx xx仅仅可以更新的时候进行更新数据
  • mset k1 v1 k2 v2 可以进行设置多个值
  • get k 返回一个v,没有返回nil
  • mget k1 k2 k3 获取多个v
  • getrange k start end 获取一个索引从start到end,双闭合的区间
阅读更多

Redis 架构

1.问题

redis是单线程,单实例,为什么并发那么多,依旧很快呢?

回答:因为调用了系统内核的epoll

2.Linux的早期版本

Linux有Linux kernal,我们的客户端,进行连接,首先到达的是Linux kernal,在Linux的早期版本,只有read和write进行文件读写。我们使用一个线程/进程 进行调用read和write函数,那么将会返回一个文件描述符fd(file description)。我们开启线程/进程去调用read进行读取。因为socket在这个时期是blocking(阻塞的),遇到高并发,就会阻塞,也就是bio时期。

阅读更多

Redis 数据存储的发展史

1.磁盘时代

很久之前,我们的数据存储方式是磁盘存储,每个磁盘都有一个磁道。每个磁道有很多扇区,一个扇区接近512Byte。

磁盘的寻址速度是毫秒级的,带宽是GB/M的。内存是ns级的,带宽也比磁盘大上好几个数量级。总体来说,磁盘比内存在寻址上慢了接近10W倍。

在这段历史中,我们的面临的问题是,I/O问题。在读写文件时,我们常常面临很大的I/O成本问题。但是最初有个最初的解决方案是加一个buffer。

阅读更多