Amazing RedisOpsDev

Redis复习笔记

2019-02-07  本文已影响18人  NealLemon

Redis基础复习

由于做的是企业级的开发,有很多之前学过的内容,差不多都好忘光了,趁过年休假,好好整理一下,温故知新。这里只是我复习之后记录的大纲和关键内容,很多操作需要自己去实践。如果想系统学习一下redis,个人认为不需要去买书去看,只需要看看在线文档和博客,基本就可以满足我们的开发要求了,这个力推一个在线文档 Redis在线文档 。希望对大家有所帮助。

Redis简介

Redis是一款开源的、高性能的键-值存储(key-value store)。它常被称作是一款数据结构服务器(data structure server)。

​ Redis的键值可以包括字符串(strings)类型,同时它还包括哈希(hashes)、列表(lists)、集合(sets)和 有序集合(sorted sets)等数据类型。 对于这些数据类型,你可以执行原子操作。例如:对字符串进行附加操作(append);递增哈希中的值;向列表中增加元素;计算集合的交集、并集与差集等。

​ 为了获得优异的性能,Redis采用了内存中(in-memory)数据集(dataset)的方式。同时,Redis支持数据的持久化,你可以每隔一段时间将数据集转存到磁盘上(snapshot),或者在日志尾部追加每一条操作命令(append only file,aof)。

​ Redis同样支持主从复制(master-slave replication),并且具有非常快速的非阻塞首次同步( non-blocking first synchronization)、网络断开自动重连等功能。同时Redis还具有其它一些特性,其中包括简单的事物支持、发布订阅 ( pub/sub)、管道(pipeline)和虚拟内存(vm)等 。
Redis具有丰富的客户端,支持现阶段流行的大多数编程语言。

Redis 采用单线程结构,包括主IO处理,IO相关的业务处理,集群协调等,对于redis的所有请求都是串行处理的,我们可以启用多个redis实例来发挥CPU多核的特性。

​ Redis使用多路I/O复用模型,非阻塞IO,其实这个模型就相当于React 模型,举个简单的例子,就相当于咱们去肯德基麦当劳点餐,而吧台只有一个点餐员(即一个线程),当很多个顾客去点餐时,点餐员给你点完餐后就会给下一个人点餐,不会发生阻塞,当你的餐准备好时,通知你取走。

常用的数据类型

类型 简介 特性 场景 具体命令
String(字符串) 二进制安全 可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512M --- set/get
Hash(字典) 键值对集合,即编程语言中的Map类型 适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值(Memcached中需要取出整个字符串反序列化成对象修改完再序列化存回去) 存储、读取、修改用户属性 hset/hget
List(列表) 链表(双向链表) 增删快,提供了操作某一段元素的API 1,最新消息排行等功能(比如朋友圈的时间线) 2,消息队列 lpush/rpop
Set(集合) 哈希表实现,元素不重复 1、添加、删除,查找的复杂度都是O(1) 2、为集合提供了求交集、并集、差集等操作 1、共同好友 2、利用唯一性,统计访问网站的所有独立ip 3、好友推荐时,根据tag求交集,大于某个阈值就可以推荐 sadd/sinter
Sorted Set(有序集合) 将Set中的元素增加一个权重参数score,元素按score有序排列 数据插入集合时,已经进行天然排序 1、排行榜 2、带权重的消息队列 zadd/zrangebyscore

查询出某一固定前缀的key

其他游标迭代命令

Redis持久化

Redis 提供了多种不同级别的持久化方式

RDB方式持久化

配置

首先需要打开 redis.conf 文件,查找到相关RDB的配置。

p2.png p3.png

以上配置完成,redis默认使用的就是 bgsave指令,fork一个子进程来创建RDB文件。

运作方式

当 Redis 需要保存 dump.rdb 文件时, 服务器执行以下操作:

  1. Redis 调用 fork() ,同时拥有父进程和子进程。
  2. 子进程将数据集写入到一个临时 RDB 文件中。
  3. 当子进程完成对新 RDB 文件的写入时,Redis 用新 RDB 文件替换原来的 RDB 文件,并删除旧的 RDB 文件。

这种工作方式使得 Redis 可以从写时复制(copy-on-write)机制中获益。

自动触发RDB

优缺点

AOF方式持久化

配置

首先需要打开 redis.conf 文件,查找到相关RDB的配置。

p4.png p5.png

以上配置完成,redis默认使用的就是 BGREWRITEAOF指令,fork一个子进程来创建RDB文件。

运作方式

AOF 重写和 RDB 创建快照一样,都巧妙地利用了写时复制机制。

以下是 AOF 重写的执行步骤:

  1. Redis 执行 fork() ,现在同时拥有父进程和子进程。
  2. 子进程开始将新 AOF 文件的内容写入到临时文件。
  3. 对于所有新执行的写入命令,父进程一边将它们累积到一个内存缓存中,一边将这些改动追加到现有 AOF 文件的末尾: 这样即使在重写的中途发生停机,现有的 AOF 文件也还是安全的。
  4. 当子进程完成重写工作时,它给父进程发送一个信号,父进程在接收到信号之后,将内存缓存中的所有数据追加到新 AOF 文件的末尾。
  5. 搞定!现在 Redis 原子地用新文件替换旧文件,之后所有命令都会直接追加到新 AOF 文件的末尾。

在AOF和RDB共存情况下数据的恢复流程

  1. 重新启动redis。
  2. 检查AOF是否存在如果存在,直接加载AOF文件忽略掉RDB文件。
  3. 如果不存在AOF,则加载RDB文件。

优缺点

RDB和AOF混合方式

这种持久化能够通过 AOF 重写操作创建出一个同时包含 RDB 数据和 AOF 数据的 AOF 文件, 其中 RDB 数据位于 AOF 文件的开头, 它们储存了服务器开始执行重写操作时的数据库状态: 至于那些在重写操作执行之后执行的 Redis 命令, 则会继续以 AOF 格式追加到 AOF 文件的末尾, 也即是 RDB 数据之后。

配置

首先需要打开 redis.conf 文件

1,开启AOF持久化

appendonly yes

2.开启混合方式

aof-use-rdb-preamble yes

3.执行命令 BGREWRITEAOF

主从复制

全量复制

p6.png

Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体步骤如下:

增量复制

Redis增量复制是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。

增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。

Redis集群

redis集群的原理就是 一致性哈希算法进行分片。这里我就不做总结了,推荐一个大神的博文 一致性Hash算法(Consistent Hash)

上一篇下一篇

猜你喜欢

热点阅读