redis详解

本文详细介绍了Redis,一个高性能的内存数据存储系统,支持多种数据结构如键值对、列表、集合等。Redis利用单线程模型实现高效操作,并提供了RDB和AOF两种持久化策略确保数据安全。此外,文章讨论了NoSQL的特点和Redis的适用场景,包括缓存、发布订阅、地理位置分析等。同时,文中深入探讨了Redis的线程模型、事务处理、数据类型及其操作,如String、List、Set等,并提到了位图、HyperLogLog等高级特性的应用。最后,文章讲解了Redis的持久化策略、AOF重写机制和发布订阅功能,以及如何通过主从复制构建高可用的Redis集群。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.1.1redis介绍

     Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可 基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的 开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。

redis能做什么?

1. 内存存储,持久化,断电即丢失,所以持久化很重要,redis采用两种机制(RDB和AOF)

2. 效率高,可以用于高速缓存

3. 发布订阅系统

4. 地图信息分析

5. 计数器等,网站浏览量

redis特点/特性

1. 多样的数据类型

2. 持久化

3. 集群

4. 事务等...

1.1.2NoSQL特点

扩展方便,数据与数据之间没有必然联系,0耦合。

大数据量和高性能(redis => 单秒写10万次 读取11万次) QPS

数据类型的多样化(5+3) String、List、Set、Hash、Zset | geo(地理位置信息) 、hyperloglog(访 客信息)、bitmap 位图(常用计算活跃粉丝和不活跃粉丝、登录和未登录、是否打卡等)

不需要提前设计数据库,随取随用。

1.1.3NoSQL的四大类

KV类型

- 新浪 redis

- 美团 Redis + Tair

- 阿里、百度 redis + memcached

档类型数据库(BSON 和 JSON一样)- MongoDB (目前企业需求也是比较大的) 是一个给予分布式存储的数据库,主要用于处理大量的文档, 是一个介于关系型和非关系型数据库的中间产品,本身属于非关系型。

列存储的数据库

- 大数据的HBase

- 分布式文件系统(一个业务分拆多个子业务,部署在不同的服务器上)

图形关系数据库

- 图示 - 存储的是图形关系,类似与朋友圈或社交平台

- Neo4J InfoGrid

1.1.4关于redis线程问题

redis的单线程的,那么单线程为什么还这么快?

Redis 的数据结构并不全是简单的 Key-Value,还有 list,hash 等复杂的结构。这些结构有可能会进行很细 粒度的操作,比如在很长的列表后面添加一个元素,在 hash 当中添加或者删除一个对象。这些操作可能就 需要加非常多的锁,导致的结果是同步开销大大增加。

总之,在单线程的情况下,代码更清晰,处理逻辑更简单,不用去考虑各种锁的问题,不存在加锁释放锁操 作,没有因为可能出现死锁而导致的性能消耗,不存在多进程或者多线程导致的切换而消耗 CPU。

单线程多进程的集群方案

单线程的威力实际上非常强大,每核效率也非常高。多线程自然是可以比单线程有更高的性能上限,但是在 今天的计算环境中,即使是单机多线程的上限也往往不能满足需要了,需要进一步摸索的是多服务器集群化 的方案,这些方案中多线程的技术照样是用不上的。所以单线程、多进程的集群不失为一个时髦的解决方 案。

CPU 消耗

采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU。 但是如果 CPU 成为 Redis 瓶颈,或者不想让服务器其他 CPU 核闲置,那怎么办?

可以考虑多起几个 Redis 进程,Redis 是 key-value 数据库,不是关系数据库,数据之间没有约束。只要客 户端分清哪些 key 放在哪个 Redis 进程上就可以了。

2.1redis 基础命令

2.1.1数据库切换操作

 2.1.2 查看当前数据库

 2.1.3清除数据库中的数据

flushdb 删除当前库 -- 前提进入当前数据库中

flushall 删除所有库

2.1.4设置过期时间

 2.1.5查看key类型

type key

2.1.6 查看key是否存在

EXISTS key

3.1redis数据类型

redis存在5种基本数据类型和三种特殊类型

3.1.2String类型

例举:分布式锁、Session相关、验证码相关、计数相关(点击量/阅读量/关注)等单一的值。

3.1.3取值赋值

关键词:set get append strlen

3.1.4加减操作

 increment 自增1 decrement 自减

incrby 固定增量 自定义

decrby 固定减量 自定义

3.1.5范围操作 range

getrange key index1 index2 获取当前指定范围 如果最大长度 index2 可替为-1

3.1.6替换操作

setrange key offset index 内容 ##offset 偏移量 指定位置开始替换

 

 3.1.7判断是否存在

EXISTS t6 判断值是否存在

#set with expire #如果存在设置消失时间及信息值 -- 订单

setex key time v 既能增加过期时间还能够重新指定新的值,如果当前key不存在创建一个新的key和值并指定过期时间

 #set if not expire #如果不存在 默认会创建一个新的,存在不操作 ///// 及判断存在不存在同时也能根据结 果进行进一步操作 setnx key v

 3.1.8批量值操作

more set

mset k1 v1 k2 v2

mget k1 k2

3.1.9关于对象的存储

 3.2.1取值赋值操作

 getset 先取值,再赋值

3.2.2关于浮点类型的增减操作

 3.2.3删除数据

 del key ...

4.1.1List列表类型

list列表类型,特点:所有的命令操作都是使用l开始。 和链表/队列比较相似,可以通过首尾进行操作。

 4.1.2基本赋值和取值操作

保留案例:导航信息存储

默认左侧插入值: lpush l意思 list

右侧插入值:rpush r意思 right

查询数据:lrange key start end

获取长度 llen key

 2 list结构的删除数据操作

 4.1.4索引相关 index

通过索引获取数据 lindex key index

127.0.0.1:6379> lindex stu 1

截取列表中一部分值

trim 在Java和脚本中是去掉前后空格,本身意思 修剪、整理。 在redis中作用域截取部分值,截取完成只保 留获取的内容

5.1.1Set集合类型

特点: 无序、不能重复 所有命令 s 开头

用途:点赞,签到,like等功能、抽奖功能

5.1.2基本操作

添加值 sadd key v......

查询值 smembers members 成员 组成

通用删除 del key 将整个集合直接删除

删除指定指定的元素 srem key value

5.1.3其他操作

判断当前集合中是否存在指定的值 s is member 是否是成员

语法 sismember key v

查看当前集合中值个数 s card

语法:sacrd key

随机获取和随机删除

随机获取: srandmember [ s random member ]

语法:srandmember key count

随机删除: spop

语法: spop key count

5.1.4特殊操作

解决中文问题

差集 diff 差异 只返回第一个集合的差值

 交集 sinter 交集

并集 s union 联盟 工会 ---- 去重复

6.1.1 Hash类型(map结构)

key-value(map) 比较适合对象类型的数据存储 key -(key-value)

6.1.2基础语法

存值(key (key - value))

语法: hset key k1 v1 k2 v2 k3 v3

hget key k -- 获取单个值

 6.1.3其他用法

 判断是否存在

 读取所有的key ----- 1w条数据 取某一些特定的数据,取到所有key 循环 取值 判断 筛选。

取所有的value --- 案例:Java中想将redis中的hash结构转化为set结构

7.1.1Zset

有序不重复集合,在set的基础上多增加一个值 set k1 * v1 (zset k1 排序的值(score) v1)

有序不可重复的set集合

主要使用方向:工资、班级成绩等等之类的数据。 或者 权重处理 0 普通 1 重要

7.1.2基本语法

增加和查询

 删除数据

删除整个key del key

7.1.3zset 复杂查询

#显示所有信息,从小到大 (范围) -inf 负无穷 +inf正无穷

语法:** z range by score** key min max --- min max使用的是排序字段的值

 升序操作

 降序操作

z rev range k start stop start stop取索引的范围。

8.1.1geospatial 地理位置

作用:朋友圈定位,附近的人,打车距离计算。

添加地理位置信息 GEOADD

geoadd key 精度 纬度 名称

查询指定位置的经纬度 GEOPOS

 查询两地点之间的距离

GEODIST geodist key 地点1 地点2 单位(默认 米)

 

 查询附近的城市(定位) GEORADIUS

 查询附近的城市(定位)--显示到中间的距离 GEORADIUS

关键词: withdist

 查询附近的城市(定位)--显示他人精准信息 GEORADIUS

关键词:withcoord

 查询附近的城市(定位)--显示他人精准信息 并指定返回个数 GEORADIUS

关键词: count

 

 8.1.2HyperLogLog基数统计

Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积 非常非常大时,计算基数所需的空间总是固定的、并且是很小的。在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64(long类型的最大值) 个不同元素的基数。这和计算基 数时,元素越多耗费内存就越多的集合形成鲜明对比。但是,因为 HyperLogLog 只会根据输入元素来 计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素

什么是基数?

比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数重复元素为5(个数)。 基数(不估计就是在误差可接受的范围内,快速计算基数。

 8.1.3Bitmaps位图

1Byte=8bit(比特) 1KB=1024Byte(字节)=8*1024bit 1MB=1024KB 1GB=1024MB 1TB=1024GB 1PB=1024TB 位存储: 给大家举个例子,比如中国有14亿人口,那么我们用位图中使用0表示每一个人 127.0.0.1:6379> pfadd clazz zhangsan lisi wangwu zhaoliu tianqi 99 2111 99.9 1 127.0.0.1:6379> pfadd clazz zhangsan lisi wangwu zhaoliu 0 127.0.0.1:6379> pfadd clazz zhangsan lisi wangwu zhaoliu 33 1 127.0.0.1:6379> pfcount clazz 11 127.0.0.1:6379> pfadd stu xiongda xionger zhangsan 1 127.0.0.1:6379> pfmerge clazz stu OK 127.0.0.1:6379> pfcount clazz 11 127.0.0.1:6379> pfcount stu 3 0 0 0 0 0 0 x 14亿 ,这种数据其实即使是14亿占用内存也是不多的,那么接下来我们使用位图表示当前疫情 下哪些人被感染了,那么我们就可以将位图更改为 0 1 0 0 1 0 x 14亿 . 我们就能通过 0 和 1 判断 没有感染的和传染人的数量。 在我们日常的开发过程中,位图经常用作于 统计用户活跃or不活跃、登录or未登陆 、上班族一年的打卡记 录,只要有两个状态的都可以使用位图计算。 案例:是否打卡(一周) 0 未打卡 1 打卡 一年为例 365 = 365bit  1字节=8bit  约46字节左右。

首先增加基础数据 setbit

 统计打卡的天数 bitcount

9.1.1redis事务

理论

       redis 事务可以一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行 化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。redis事务没有隔离级别 的概念,所以不会出现脏读、幻读、不可重复读,因为队列就有序列化的概念,你可以认为默认就是MySQL 序列化级别。

       redis采用了乐观锁方式进行事务控制,它使用watch命令监视给定的key,当exec(提交事务)时候如果监 视的key从调用watch后发生过变化,则整个事务会失败。也可以调用watch多次监视多个key。注意watch的 key是对整个连接有效的,如果连接断开,监视和事务都会被自动清除。当然exec,discard,unwatch命令 都会清除连接中的所有监视。

       redis保证一个事务中的所有命令要么都执行,要么都不执行。如果在发送EXEC命令前客户端断线了,则 Redis会清空事务队列,事务中的所有命令都不会执行。而一旦客户端发送了EXEC命令,所有的命令就都会 被执行,即使此后客户端断线也没关系,因为Redis中已经记录了所有要执行的命令。 -------前面话述中看似 redis是能够保证原子性,但是保证原子性是有特殊的前提的,首先单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。可能有人问redis 因为使用watch命令监视再加上乐观锁应该能保证原子性了,但实际事务执行过程中因为编译(命令)导致的错 误可以保证原子性(出现的概率极低)多线程出现干扰问题,但是运行的错误(命令正确,但是结果出错误) 就不能够保证原子性了。实操部分会给大家演示。

实践

事务从开始到执行会经历以下三个阶段:

1. 开始事务(MULTI)

2. 命令入队(输出queued)

3. 执行事务(EXEC) / 取消事务(DISCARD)

9.1.2标准事务执行 EXEC

 9.1.3放弃事务执行DISCARD

        在关系型数据库中,之所以有回滚的方法是因为在事务执行的过程中(增加)在commit之前已经操作了数 据库,那么一旦出现问题,我们必须提供一个回滚的方法来回到最初的状态。 --- 占ID        

 reids中,我们执行的命令都在队列中(没有执行),所以就没有回滚的概念,此时你只要放弃提交(取消执 行),那么数据就是最初状态了。

 9.1.4redis事务保证原子性测试

redis事务中执行编译错误(命令错误)是保证原子性的, 但是redis运行错误(命令正确,但是结果出错误),事务是不保证原子性的。 相当于Java中两种异常状态 编译异常 运行异常1/0


 redis事务不保证原子性测试

 9.1.5测试redis乐观锁

redis默认使用的是乐观锁保证事务原子性。

悲观锁: 认为什么时候都会出问题,无论做什么都需要加锁。synchronized -- 特别消耗性能

乐观锁: 认为什么时候都不会出现问题,所以不会上锁,但是执行的时候会经过判断是否有修改, MySQL中使用version判断,正确提交,错误不提交。

redis 中通过 Watch监视器实现

正常执行

 异常执行案例

 关于废弃锁处理

 9.1.6性能测试

测试1

redis启动后进入到bin目录中,执行以下命令进行性能测试:

说明:因为测试的是本机的redis性能,所以没有指定IP和端口号。

-t:表示执行以逗号分隔的命令,执行的是set操作和get操作,如果不指定具体的值,测试的结果较多

 执行结果如下:

 测试2

在实际生产中,我们需要关心在应用场景中,redis能够处理的QPS是多少。我们需要估计生产的报文大小, 使用benchmark工具指定-d数据块大小来模拟:

指定并发数为100,数据大小为2048字节,在实际生产中,每个业务处理的数据大小不一致,取出一个最大 的数据为基数进行测试即可,在程序里将数据的字节大小打印出来,使用redis-benchmark的-d参数指定数 据大小。

执行结果:

 

 信息检测

使用redis客户端登录到redis服务中,执行info命令查看redis的信息

10.1.1redis持久化

理论

前面我们说过,Redis 相对于 Memcache 等其他的缓存产品,有一个比较明显的优势就是 Redis 不仅仅支持 简单的key-value类型的数据, 同时还提供list,set,zset,hash等数据结构的存储。这几种丰富的数据类型我们 接下来我们要介绍 Redis 的另外一大优势——持久化。

由于 Redis 是一个内存数据库,所谓内存数据库,就是将数据库中的内容保存在内存中, 这与传统的MySQL,Oracle等关系型数据库直接将内容保存到硬盘中相比,内存数据库的读写效率比传统数 据库要快的多(内存的读写效率远远大于硬盘的读写效率)。 但是保存在内存中也随之带来了一个缺点,一旦断电或者宕机,那么内存数据库中的数据将会全部丢失。

为了解决这个缺点,Redis提供了将内存数据持久化到硬盘,以及用持久化文件来恢复数据库数据的功能。 Redis 支持两种形式的持久化,一种是RDB快照(snapshotting),另外一种是AOF(append-only-file)

10.1.2RDB快照(redis DateBase)

概述

RDB是Redis用来进行持久化的一种方式,是把当前内存中的数据集快照写入磁盘,也就是 Snapshot 快照 (数据库中所有键值对数据)。恢复时是将快照文件直接读到内存里。

触发方式

RDB 有两种触发方式,分别是自动触发和手动触发。

自动触发

save: 这里是用来配置触发 Redis的 RDB 持久化条件,也就是什么时候将内存中的数据保存到硬盘。比如 “save m n”。表示m秒内数据集存在n次修改时,自动触发bgsave(这个命令下面会介绍,手动触发RDB持 久化的命令)。

rdbcompression :默认值是yes。对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话, redis会采用LZF算法进行压缩。如果你不想消耗CPU来进行压缩的话,可以设置为关闭此功能,但是存储在 磁盘上的快照会比较大。

stop-writes-on-bgsave-error :默认值为yes。当启用了RDB且最后一次后台保存数据失败,Redis是否停 止接收数据。这会让用户意识到数据没有正确持久化到磁盘上,否则没有人会注意到灾难(disaster)发生 了。如果Redis重启了,那么又可以重新开始接收数据了。

rdbchecksum :默认值是yes。在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,但是 这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。

dbfilename :设置快照的文件名,默认是 dump.rdb

dir:设置快照文件的存放路径,这个配置项一定是个目录,而不能是文件名。默认是和当前配置文件保存在 同一目录

测试自动触发

1 添加数据测试, 查找数据库文件

2 改变文件名称

3 查看快照路径

手动触发

手动触发Redis进行RDB持久化的命令有两种:

save:该命令会阻塞当前Redis服务器,执行save命令期间,redis不能处理其他命令,直到RDB过程完成为 止。显然该命令对于内存比较大的实例会造成长时间阻塞,这是致命的缺陷,为了解决此问题,redis提供了 第二种方式。(不建议使用)

bgsave:执行该命令时,Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。具体操作是 Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在创建子 进程fork阶段,一般时间很短。

基本上 Redis 内部所有的RDB操作都是采用 bgsave 命令。

还有两种特殊的操作也能触发RDB的持久化,但是因为情况特殊,所以不作为手动触发条件

# 执行执行 flushall.flushdb 命令,也会产生dump.rdb文件,但里面是空的,无意义

# 关闭redis 服务同样会生成 --- 规则使用 bgsave 保存数

10.1.3RDB数据恢复(企业管理者经常用的手段)

将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可,redis就会自动加载文件数据至内存了。 Redis 服务器在载入 RDB 文件期间,会一直处于阻塞状态,直到载入工作完成为止。 启动服务器的当前目录一定是redis-*** 否则快照生成的路径就会发生错误!

 停止 RDB 持久化

有些情况下,我们只想利用Redis的缓存功能,并不像使用 Redis 的持久化功能,那么这时候我们最好停掉 RDB 持久化。可以通过上面讲的在配置文件 redis.conf 中,可以注释掉所有的 save 行来停用保存功能或者 直接一个空字符串来实现停用:save ""

11.1.1AOF

概述

Redis的持久化方式之一RDB是通过保存数据库中的键值对来记录数据库的状态。而另一种持久化方式 AOF 则是通过保存Redis服务器所执行的写命令来记录数据库状态。

AOF以协议文本的方式,将所有对数据库进行写入的命令(及其参数)记录到 AOF 文件,以此达到记录数据 库状态的目的。

用日志的形式来记录每个操作,将redis执行过的所有的指令都记录下来(读操作不记录),只许追加文件但不 可以写文件,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次,已完成数据文件的 恢复工作

AOF配置

 appendonly:默认值为no,也就是说redis 默认使用的是rdb方式持久化,如果想要开启 AOF 持久化方 式,需要将appendonly 修改为 yes。

appendfilename :aof文件名,默认是"appendonly.aof"

appendfsync**:**aof持久化策略的配置;

1. no表示不执行fsync,由操作系统保证数据同步到磁盘,速度最快,但是不太安全;

2. always表示每次写入都执行fsync,以保证数据同步到磁盘,效率很低;

3. everysec表示每秒执行一次fsync,可能会导致丢失这1s数据。通常选择 everysec ,兼顾安全性和效 率。(默认)

no-appendfsync-on-rewrite:在aof重写或者写入aof文件的时候,会执行大量IO,此时对于everysec和 always的aof模式来说,执行fsync会造成阻塞过长时间,no-appendfsync-on-rewrite字段设置为默认设置 为no。如果对延迟要求很高的应用,这个字段可以设置为yes,否则还是设置为no,这样对持久化特性来说 这是更安全的选择。 设置为yes表示rewrite期间对新写操作不fsync,暂时存在内存中,等rewrite完成后再写 入,默认为no,建议yes。Linux的默认fsync策略是30秒。可能丢失30秒数据。默认值为no。

auto-aof-rewrite-percentage:默认值为100。aof自动重写配置,当目前aof文件大小超过上一次重写的 aof文件大小的百分之多少进行重写,即当aof文件增长到一定大小的时候,Redis能够调用bgrewriteaof对日 志文件进行重写。当前AOF文件大小是上次日志重写得到AOF文件大小的二倍(设置为100)时,自动启动 新的日志重写过程。 64M - 40M - 80M(55M) - 110M(70M)

auto-aof-rewrite-min-size:64mb。设置允许重写的最小aof文件大小,避免了达到约定百分比但尺寸仍 然很小的情况还要重写。

aof-load-truncated:aof文件可能在尾部是不完整的,当redis启动的时候,aof文件的数据被载入内存。 重启可能发生在redis所在的主机操作系统宕机后,出现这种现象 redis宕机或者异常终止不会造成尾部不完 整现象,可以选择让redis退出,或者导入尽可能多的数据。如果选择的是yes,当截断的aof文件被导入的时 候,会自动发布一个log给客户端然后load。如果是no,用户必须手动redis-check-aof修复AOF文件才可 以。默认值为 yes。

开启AOF

默认不开启,需要手动开启 - AOF和RDB同时开启 ,默认走AOF策略

appendonly yes

注意配置完成后重启redis,并set几个值,# vim查看aof文件

AOF文件故障修复

关闭redis

删除dump.rdb

 随便修改点aof文件

 重新启动redis

 AOF文件重写机制

AOF 文件包含三类文件:基本文件、增量文件与清单文件。其中基本文件一般为 rdb 格式,就是 rdb 持久化 的数据文件。

由于AOF持久化是Redis不断将写命令记录到 AOF 文件中,随着Redis不断的进行,AOF 的文件会越来越 大,文件越大,占用服务器内存越大以及 AOF 恢复要求时间越长。为了解决这个问题,Redis新增了重写机 制,当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最 小指令集。可以使用命令 bgrewriteaof 来重写。

 也就是说 AOF 文件重写并不是对原文件进行重新整理,而是直接读取服务器现有的键值对,然后用一条命令 去代替之前记录这个键值对的多条命令,生成一个新的文件后去替换原来的 AOF 文件。

AOF的优缺点

优点:

1. AOF 持久化的方法提供了多种的同步频率,即使使用默认的同步频率每秒同步一次,最多也就丢失1秒 的数据而已。

2. AOF 文件使用 Redis 命令追加的形式来构造,因此,即使 Redis 只能向 AOF 文件写入命令的片断,使 用 redis-check-aof 工具也很容易修正 AOF 文件。

3. AOF 文件的格式可读性较强,这也为使用者提供了更灵活的处理方式。例如,如果我们不小心错用了 FLUSHALL 命令,在重写还没进行时,我们可以手工将最后的 FLUSHALL 命令去掉,然后再使用 AOF 来恢复数据。

缺点:

1. 对于具有相同数据的的 Redis,AOF 文件通常会比 RDB 文件体积更大。

2. 虽然 AOF 提供了多种同步的频率,默认情况下,每秒同步一次的频率也具有较高的性能。但在 Redis 的负载较高时,RDB 比 AOF 具好更好的性能保证。

3. RDB 使用快照的形式来持久化整个 Redis 数据,而 AOF 只是将每次执行的命令追加到 AOF 文件中,因 此从理论上说,RDB 比 AOF 方式更健壮。官方文档也指出,AOF 的确也存在一些 BUG,这些 BUG 在 RDB 没有存在。

11.1.1redis发布订阅

Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。

Redis 的 subscribe 命令可以让客户端订阅任意数量的频道, 每当有新信息发送到被订阅的频道时, 信息就 会被发送给所有订阅指定频道的客户端。

 12.1.1redis集群

概念

使用redis的复制功能创建主机和从机(一对多) 主从机支持多个数据库之间的数据同步。一类是主数据库 (master主机)一类是从数据库(slave从机)(主从复制) 读写分离

主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而从数据库一般是只读的(读 写分离)

从机接收主数据库同步过来的数据,一个主数据库可以有多个从数据库,而一个从数据库只能有一个主数据 库(只有一个老大)

通过redis的复制功能可以很好的实现数据库的读写分离,提高服务器的负载能力。主数据库主要进行写操 作,而从数据库负责读操作。

这样大部分80%的操作都是读取数据,所以在之前给大家介绍的架构图中,读写分离的方式,从而减轻服务 器压力,这样也就是集群的环境了。 # 一般推荐搭建方式为1主2从为最低配。

主从复制(redis集群)的作用

# 1 数据冗余: 主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式,在大数据领域,冗余一 般是指一模一样的数据存储多于一份的情况.

# 2 数据灾备(故障恢复): 当主节点出现问题时,可以由从节点提供服务,实现快速的故障服务

# 3 负载均衡:主从复制的基础之上,可以实现读写分离,提高并发了量。

# 4 高可用(集群)基础:主从复制是哨兵和集群实施的基础,因此说redis的主从复制是高可用的基础(集群 环境的基础)

# 所以在真实的项目中,我们不可能是单机模式,基本都是搭建redis集群,实现高可用和高并发。

12.1.2集群基础搭建(单机多集群)

基础指令

 准备工作

 启动集群

...

一主二从配置

# 默认情况下,每一台redis服务器都是主节点 - 所以我们只要配置从机就可以了!!

# 分别连接客户端(对应端口登录) 通过 info replication查看情况 --- 默认都是主机

# 配置策略 -- 小黄人找大哥(认老大,认主)

主(6379) 从(6380,6381)

配置命令

slaveof ip port

 注意:我们这里使用的是命令配置的,如果服务器重启就会消失配置,真是的企业环境都配置到配置文件 中,这样就是永久配置了。

12.1.25 读写分离(默认)

 总结:主机断开,从机依然能正常获取数据,但是没有写操作了,当主机恢复后,依然能够同步数据(高可 用)

从机宕机后,此时剩余的一主一从可以正常工作,从机6380恢复之后,不能直接同步数据,原因是通过命令 进行挂载的主机,重新启动后默认当前6380是主机,如果继续保持这个集群环境,需要我们再次通过 slaveof host port 指定老大,指定之后所有的数据会同步到从机中。

如果我们这个集群通过配置文件搭建的,是否能够避免上述问题。

修改配置文件

 重新启动从机

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值