Redis 是用C语言开发的一个开源的、高性能、基于内存运行的、非关系型的键值对NoSQL数据库。可以存储键和五种不同类型的值之间的映射(键的类型只能为字符串,值支持五种),传统数据库的数据存储是在硬盘上的,而redis的数据存储在内存中,所以读写速度很快。
去官网https://redis.io/download下载redis-6.2.6.tar.gz的安装包,并放入Linux中的/usr/local的目录中;
在/usr/local目录下,执行解压命令;
tar-zxvf redis-6.2.6.tar.gz -C /usr/local/
解压完成后出现文件夹redis-6.2.6,并进行修改名字;
mv redis-6.2.6/redis6.2
进入文件夹redis6.2,在此目录下执行make && make install命令,如果出现以下错误,是因为没有安装gcc环境,用 yum -y install gcc 来安装。
如下图所示,未找到命令,因为没有gcc环境:
如果再出现以下致命错误,执行此命令可完成安装 ;
make MALLOC=libc
进入默认安装目录cd /usr/local/bin,此目录中有如下文件
vi redis.conf
通过vim查找语句查找daemonize:进入命令模式 shift+:,输入以下查找命令:/daemonize;然后被no改成yes,保证后台可以自行运行;
linux下vim 查找命令:
/text --查找text, 按n查找下一个, N查找上一个
?text --查找text(反向查找), 按n查找下一个, N查找上一个
*/# --查找光标当前的单词,相当于/text
:set ignorecase --查找忽略大小写
:set noignorecase --查找不忽略大小写
:nohlsearch --关闭当前的高亮显示,当再次查找时恢复高亮
:set incsearch --逐步搜索模式,对当前键入的字符进行查找,不必等输入完成
:set wrapscan --重新搜索,当搜索到文件头或尾时,返回重新搜索
cd /usr/local/redis6.2 //进入该目录
redis-server /redis6.2/redis.conf //启动服务
或者在 cd /usr/local/bin //进入该目录
./redis-server redis.conf //启动服务
不过按下ctrl+c就中断了
ps aux|grep redis-server
或者 ps ef|grep redis
需要修改配置文件里的 bind 127.0.0.1 ::1
删除 ::1 保存退出
假如在配置文件中 的内容是:bind x.x.x.x ::1
那么再使用redis-cli连接redis-server时,应该使用 :
redis-cli -h x.x.x.x -p 6379 或者 redis-cli -h x.x.x.x -p port(配置文件中指定的端口号)
使用redis命令行工具
redis-cli :一般都会使用 redis-cli 进入交互模式,然后一问一答来读写服务器
Redis有五大数据类型:String、List、Set、Zset、Hash;
注意:Redis采用键值(key-value)对存储数据,key永远是String类型,五大数据类型指的是value部分
一个key对象一个value;
String可以包含任何数据,比如jpg图片等等;
String是Redis最基本的数据类型,一个String最大可以支持M;
对于set
与mset
两个指令,应该使用哪一个由具体的业务场景决定;
(1) set指令的执行过程
set指令发送给Redis服务器需要一个网络时间;Redis服务器执行该指令需要一个处理时间; Redis服务器将结果返回需要一个网络时间;故需要2个网络时间 + 1个处理时间
(2) 使用set存储n个值
n个网络时间(发送) + n个处理时间(处理) + n个网络时间(返回)
(3) 使用mset存储n个值
1个网络时间(发送) + n个处理时间(处理) + 1个网络时间(返回)
注:每次携带的数据增多,网络时间会相应的延长
**综上所述,当需要处理的数据较少时,使用单指令;当处理的数据较多时,使用多指令 **
1.意外断电或者重启之后,内存中的数据将会丢失,故应当将内存中的数据保存在磁盘中。
2.概念
利用磁盘等将数据进行保存,在特定的时间将保存的数据进行恢复的工作机制称为持久化。
为什么要进行持久化
3.持久化的两种方式
快照:将某个时间点的工作状态保存下来,恢复时可直接恢复指定时间点的工作状态,Redis中这种方式称为RDB。
日志:将对数据的所有操作过程记录下来,恢复数据时重新执行这些操作,Redis中这种方式称为AOE。
Redis 分别提供了 RDB 和 AOF 两种持久化机制:
(1)RDB启动方式 —— save指令,作用:手动执行一次保存操作
save
save保存数据:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7nQy41uh-1650343462262)(C:/Users/xxy/AppData/Roaming/Typora/typora-user-images/image-20220324150823315.png)]
查看数据存储文件目录下的rdb文件,配置文件中指定的存储目录:
(2)RDB启动方式 —— save指令相关配置
对redis.conf配置文件进行修改(修改配置文件后需要进行重新Redis)
(3)RDB启动方式 —— save指令工作原理
Redis是单线程的,故执行save指令会阻塞其之后的命令的执行(可能多人操作同一个Redis 服务器),如果要保存的数据较多时,会导致之后的命令长时间阻塞,故一般不使用save指令。
**注意:**save指令的执行会阻塞当前Redis服务器,直到当前RDB过程完成为止,有可能会造成长时间阻塞,线上环境不建议使用。
(1)RDB启动方式 —— bgsave指令,作用:手动启动后台保存操作,但不是立即执行。
bgsave
(2)RDB启动方式 —— bgsave指令工作原理
注意: bgsave命令是针对save阻塞问题做的优化。Redis内部所有涉及到RDB操作都采用bgsave的方式,save命令可以放弃使用。
查看日志中bgsave命令执行成功后返回的信息:
(3)RDB启动方式 —— bgsave指令相关配置
自动执行:
(4)配置自动保存 RDB启动方式 ——save配置(修改配置文件后需要重启Redis)
save second changes
作用
参数
位置
(5)RDB启动方式 ——save配置原理
注意:
(6)RDB启动方式对比
(7)RDB特殊启动形式
debug reload
shutdown save
RDB优点:
RDB缺点:
参考文献:
https://blog.csdn.net/baidu_41388533/article/details/108936459
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ey4id8Ft-1650343462272)(C:/Users/xxy/AppData/Roaming/Typora/typora-user-images/image-20220324161312073.png)]
Redis 目前支持三种 AOF 保存模式,它们分别是:
AOF_FSYNC_NO
:不保存。AOF_FSYNC_EVERYSEC
:每一秒钟保存一次。AOF_FSYNC_ALWAYS
:每执行一个命令保存一次。AOF写数据遇到的问题:如果连续执行如下指令该如何处理
所以就引入了AOF重写:
(1)概念
随着命令不断写入AOF,文件会越来越大,为了解决这个问题,Redis引入了AOF重写机制压缩文件体积。AOF文件重写是将Redis进程内的数据转化为写命令同步到新AOF文件的过程。
简单说就是将对同一个数据的若干个条命令执行结果转化成最终结果数据对应的指令进行记录。
(2)AOF重写作用
(3)AOF重写规则
(4)AOF重写方式
bgrewriteaof //手动重写
auto-aof-rewrite-min-size size
auto-aof-rewrite-percentage percentage //手动重写
bgrewriteaof
自动重写
(5)AOF手动重写 —— bgrewriteaof指令工作原理
(6)AOF自动重写方式
自动重写触发条件设置
auto-aof-rewrite-min-size size
auto-aof-rewrite-percentage percent
自动重写触发比对参数( 运行指令info Persistence获取具体信息 )
aof_current_size
aof_base_size
自动重写触发条件
示例
- 输入info查看信息
注:执行重写自己开启一个主进程
RDB与AOF的选择:
对数据非常敏感,建议使用默认的AOF持久化方案
AOF持久化策略使用everysecond,每秒钟fsync一次。该策略redis仍可以保持很好的处理性能,当出现问题时,最多丢失0-1秒内的数据。
注意:由于AOF文件存储体积较大,且恢复速度较慢。
数据呈现阶段有效性,建议使用RDB持久化方案
综合比对
参考文献:https://blog.csdn.net/baidu_41388533/article/details/108937181
RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储;
AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据, AOF命令以redis协议追加保存每次写的操作到文件末尾, redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大只做缓存:如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式,同时开启两种持久化方式。
在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整。
RDB的数据不实时,同时使用两者时服务器重启也只会找AOF文件,那要不要只使用AOF呢?作者建议不要,因为RDB更适合用于备份数据库(AOF在不断变化不好备份) ,快速重启,而且不会有AOF可能潜在的bug ,留着作为一个万一的手段。
性能建议:
因为RDB文件只能做后备用途,建议只在Slave上持久化RDB文件,而且只要15分钟备份- -次就够了,只保留save 900 1这条规则。
如果开启AOF ,好处是在最恶劣的情况下也只会丢失不超过两秒的数据,启动脚本简单只加载自己的AOF文件就可以了,代价一是带来了持续的IO,二是AOF重写的最后将重写过程中产生的新数据写到新文件造成的堵塞几乎是不可避免的,只要硬盘许可,应该尽量减少AOF重写的频率,AOF重写的基础大小默认值64M太了,可以设置到5GB以上,默认超过原大小100%大小时重写可以改到适当的数值。如果不开启AOF ,仅靠Master- Slave Replication 实现高可用性也可以,能省掉一大笔I0也减少了重弓时带来的系统波动,代价是如果Master/Slave同时倒掉,会丢失十几分钟的数据,启动脚本也要比较两个Master/Slave中的RDB文件,载入较新的那个,新浪微博就选用了这种架构。
1.什么是事务?
在Redis执行指令过程中,多条连续执行的指令被干扰,打断,插队**,redis事务就是一个命令执行的队列,将一系列预定义命令包装成一个整体(一个队列)**。当执行时,一次性按照添加顺序依次执行,中间不会被打断或者干扰。一个队列中,一次性、顺序性、排他性的执行一系列命令
2.事务的基本操作
watch
(1)开启事务
multi
作用:设定事务的开启位置,此指令执行后,后续的所有指令均加入到事务中
(2)执行事务
exec
作用:设定事务的结束位置,同时执行事务。与multi成对出现,成对使用。
注意:加入事务的命令暂时进入到任务队列中,并没有立即执行,只有执行exec命令才开始执行。
(3)取消事务
discard
作用:终止当前事务的定义,发生在multi之后,exec之前
实例:
3.事务的工作流程
4.事务的注意事项
定义事务的过程中,命令格式输入错误怎么办?
定义事务的过程中,命令执行出现错误怎么办?
手动进行事务回滚
通过部署多台redis,并在配置文件中指定这几台redis之间的主从关系,主负责写入数据,同时把写入的数据实时同步到从机器,这种模式就叫做主从复制,即master/slave,并且redis默认master(主)用于写,slave(从)用于读。
【多台服务器连接方案】
主从复制
- 主从复制即将master中的数据即时、有效的复制到slave中
- 特征:一个master可以拥有多个slave,一个slave只对应一个master
- 职责:
- master
- 写数据
- 执行写操作时,将出现变化的数据自动同步到slave
- 读数据(可忽略)
- slave
- 读数据
- 写数据(可忽略)
【主从复制的作用总结】
redis replication(复制)的核心机制:
redis 采用异步方式复制数据到 slave 节点,不过 redis2.8 开始后,slave node 会周期性地确认自己每次复制的数据量;
一个 master node 是可以配置多个 slave node 的;
slave node 也可以连接其他的 slave node;
slave node 做复制的时候,不会 block(阻塞) master node 的正常工作;
slave node 在做复制的时候,也不会 block(阻塞)对自己的查询操作,它会用旧的数据集来提供服务;但是复制完成的时候,需要删除旧数据集,加载新数据集,这个时候就会暂停对外服务了;
slave node 主要用来进行横向扩容,做读写分离,扩容的 slave node 可以提高读的吞吐量。
redis 主从复制的核心原理:
当启动一个 slave node 的时候,它会发送一个 PSYNC 命令给 master node;
如果这是 slave node 初次连接到 master node,那么会触发一次 full resynchronization 全量复制;
此时 master 会启动一个后台线程,开始生成一份 RDB 快照文件,同时还会将从客户端 client 新收到的所有写命令缓存在内存中;RDB 文件生成完毕后, master 会将这个 RDB 发送给 slave;
slave 会先写入本地磁盘(持久化);
然后再从本地磁盘加载到内存中;接着 master 会将内存中缓存的写命令发送到 slave,slave 也会同步这些数据。
slave node 如果跟 master node 有网络故障,断开了连接,会自动重连,连接之后 master node 仅会复制给 slave 部分缺少的数据。
如下图所示:
过程原理:
当从库和主库建立MS关系后,会向主数据库发送SYNC命令;
主库接收到SYNC命令后,会开始在后台保存快照(RDB持久化过程),并将期间接收到的写命令缓存起来;
当快照完成后,主Redis会将快照文件和所有缓存的写命令发送给从Redis;
从Redis接收到后,会载入快照文件并且执行收到的缓存的命令;
之后,主Redis每当接收到写命令时就会将命令发送从Redis,从而保证数据的一致。
给三个结点去做集群,加入第四个服务器。
**作用:**当做哨兵来使用,用第四台服务器去监控3个节点的状态,一旦主节点挂掉了,那么会在从节点中进行选举投票,看那台服务器的性能比较好,指定这台机器升级为主节点,当主节点修复好以后,原来的主节点就会变成从节点。
【主机“宕机”处理】
- 关闭master和所有slave
- 找一个slave作为master
- 修改其他slave的配置,连接新的主
- 启动新的master与slave
- 可能出现全量复制N+部分复制N
【思考】
- 关闭期间的数据服务谁来承接?
- 找一个主?怎么找法?
- 修改配置后,原始的主恢复了怎么办?
1.哨兵基本概念
哨兵(sentinel) 是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的master并将所有slave连接到新的master。
2.哨兵的作用
**作用:**当做哨兵来使用,用第四台服务器去监控3个节点的状态,一旦主节点挂掉了,那么会在从节点中进行选举投票,看那台服务器的性能比较好,指定这台机器升级为主节点,当主节点修复好以后,原来的主节点就会变成从节点。
【主机“宕机”处理】
- 关闭master和所有slave
- 找一个slave作为master
- 修改其他slave的配置,连接新的主
- 启动新的master与slave
- 可能出现全量复制N+部分复制N
【思考】
- 关闭期间的数据服务谁来承接?
- 找一个主?怎么找法?
- 修改配置后,原始的主恢复了怎么办?
1.哨兵基本概念
哨兵(sentinel) 是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的master并将所有slave连接到新的master。
[外链图片转存中…(img-EOOWy831-1650343462282)]
2.哨兵的作用