Redis学习笔记

1 NoSQL

1.1 什么是NoSQL

NoSQL = Not Only SQL(不仅仅是 SQL) ,也解释为 non-relational(非关系型数据库)。在NoSQL 数据库中数据之间是无联系的,无关系的。数据的结构是松散的,可变的。

1.2 为什么使用NoSQL

关系型数据库的瓶颈:
1)无法应对每秒上万次的读写请求,无法处理大量集中的高并发操作。关系型数据的是IO 密集的应用。硬盘 IO 也变为性能瓶颈
2)无法简单地通过增加硬件、服务节点来提高系统性能。数据整个存储在一个数据库中的。多个服务器没有很好的解决办法,来复制这些数据。
3)关系型数据库大多是收费的,对硬件的要求较高。软件和硬件的成本花费比重较大。

1.3 NoSQL的优势

(1) 大数据量,高性能
NoSQL 数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。关系型数据库(例如 MySQL)使用查询缓存。这种查询缓存在更新数据后,缓存就是失效了。在频繁的数据读写交互应用中。缓存的性能不高。NoSQL 的缓存性能要高的多。

(2) 灵活的数据模型
NoSQL 无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦。尤其在快速变化的市场环境中,用户的需求总是在不断变化的。

(3) 高可用
NoSQL 在不太影响性能的情况,就可以方便的实现高可用的架构。NoSQL 能很好的解决关系型数据库扩展性差的问题。弥补了关系数据(比如 MySQL)在某些方面的不足,在某些方面能极大的节省开发成本和维护成本。MySQL 和 NoSQL 都有各自的特点和使用的应用场景,两者结合使用。让关系数据库关注在关系上,NoSQL 关注在存储上。

(4) 低成本
这是大多数分布式数据库共有的特点,因为主要都是开源软件,没有昂贵的 License 成本

1.4 NoSQL的劣势

(1) 不支持标准的 SQL,没有公认的 NoSQL 标准
(2) 没有关系型数据库的约束,大多数也没有索引的概念
(3) 没有事务,不能依靠事务实现 ACID.
(4) 没有丰富的数据类型(数值,日期,字符,二进制,大文本等)

2 Redis的安装和使用

Redis 是当今非常流行的基于 KV 结构的作为 Cache 使用的 NoSQL 数据库

2.1 Redis介绍

Remote Dictionary Server(Redis)是一个开源的使用 C 语言编写、支持网络、可基于内存亦可持久化的 Key-Value 数据库. Key 字符类型,其值(value)可以是字符串(String), 哈希(Map), 列表(list), 集合(sets) 和有序集合(sorted sets)等类型,每种数据类型有自己的专属命令。所以它通常也被称为数据结构服务器。

官网:https://redis.io/
中文:http://www.redis.cn/

2.2 Linux安装Redis

1、下载redis-5.0.8.tar.gz并在linux上解压到/usr/local/目录下。
2、安装gcc编译器,执行命令:yum -y install gcc
3、编译redis源文件,在安装目录/usr/local/redis-5.0.8下执行:make。成功后可选择执行make install,表示在任何路径下都可以执行redis。
4、启动redis。
首先切换到/usr/local/redis-5.0.8/src
(1)前台启动:./redis-server ../redis-cli
(2)后台启动:./redis-server ../redis-cli &
5、关闭reids。
(1)使用客户端关闭。
切换到/redis-5.0.8/src 目录下,执行./redis-cli shutdown.
推荐使用这种方式, redis 先完成数据操作,然后再关闭。
(2)强制关闭 kill pid或者kill -9 pid
这种不会考虑当前应用是否有数据正在执行操作,直接就关闭应用。
先使用 ps -ef | grep redis 查出进程号,再使用 kill pid

2.3 Redis客户端

Redis 客户端是一个程序,通过网络连接到 Redis 服务器,在客户端软件中使用 Redis 可以识别的命令,向 Redis 服务器发送命令,告诉 Redis 想要做什么。Redis 把处理结果显示在客户端界面上。通过 Redis 客户端和 Redis 服务器交互。
Redis 客户端发送命令,同时显示 Redis 服务器的处理结果在。

2.3.1 redis命令行客户端

1、直接连redis(默认ip 127.0.0.1,端口号6379):./redis-cli
2、指定ip和端口号连接redis:./redis-cli -h 127.0.0.1 -p 6379

2.3.2 redis远程客户端

1、下载安装Redis Desktop Manager。官网地址:https://redisdesktop.com/
2、使用客户端连接Linux的redis。
在这之前需要修改redis服务器的配置信息。redis服务器有安全保护措施,默认只有本机(安装redis的那台机器)可以访问。配置信息放在redis.conf中。修改此文件的两个设置。
(1)bind ip 将此行注释
(2)protected-mode yes 保护模式改为 no
使用vim命令修改redis.conf文件,修改文件前备份此文件。cp redis.conf bak_redis.conf
在这里插入图片描述
3、使用redis.conf启动redis
修改配置文件后,需要使用配置文件重新启动 Reids,默认不加载配置文件。
只要修改了redis.conf想让修改结果生效,必须使用配置文件启动redis。
执行命令:./redis-server ../redis.conf &
4、关闭linux防火墙
查看防火墙状态:systemctl status firewalld
关闭防火墙:systemctl stop firewalld
在这里插入图片描述
5、配置RDM,连接redis

在这里插入图片描述
连接成功后:
在这里插入图片描述

2.4.3 redis编程客户端

1、 Jedis
redis 的 Java 编程客户端,Redis 官方首选推荐使用 Jedis,jedis 是一个很小但很健全的redis 的 java 客户端。通过 Jedis 可以像使用 Redis 命令行一样使用 Redis。

⚫ jedis 完全兼容 redis 2.8.x and 3.x.x
⚫ Jedis 源码:https://github.com/xetorthio/jedis
⚫ api 文档:http://xetorthio.github.io/jedis/
2.、redis 的其他编程语言客户端:
C 、C++ 、C# 、Erlang、Lua 、Objective-C、Perl 、PHP 、Python 、Ruby、Scala 、Go等 40 多种语言都有连接 redis 的编程客户端

3 Redis操作命令

Redis基本操作命令详解:
https://blog.csdn.net/Luna_A/article/details/107292994

4 高级话题

4.1 Redis事务

4.1.1 什么是事务

事务是指一系列操作步骤,这一系列的操作步骤,要么完全地执行,要么完全地不执行。
Redis 中的事务(transaction)是一组命令的集合,至少是两个或两个以上的命令,redis事务保证这些命令被执行时中间不会被任何其他操作打断。

4.1.2 事务的操作命令

1、multi
语法: multi
作用:标记一个事务的开始。事务内的多条命令会按照先后顺序被放进一个队列当中。
返回值:总是返回 ok
2、exec
语法:exec
作用:执行所有事务块内的命令
返回值:事务内的所有执行语句内容,事务被打断,返回 nil
3、discard
语法:discard
作用:取消事务,放弃执行事务块内的所有命令
返回值:总是返回 ok
4、watch
语法:watch key [key …]
作用:监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,
那么事务将被打断。
返回值:总是返回 ok
5、unwatch
语法:unwatch
作用:取消 WATCH 命令对所有 key 的监视。如果在执行 WATCH 命令之后, EXEC 命令
或 DISCARD 命令先被执行了的话,那么就不需要再执行 UNWATCH 了
返回值:总是返回 ok

4.1.3 事务的实现

4.1.3.1 正常执行事务

事务的执行步骤:首先开启事务,其次向事务队列中加入命令,最后执行事务提交
例 1:事务的执行:
1)multi:用 multi 命令告诉 Redis,接下来要执行的命令你先不要执行,而是把它们暂时存起来(开启事务)
2)sadd works john 第一条命令进入等待队列(命令入队)
3)sadd works rose 第二条命令进入等待队列(命令入队)
4)exce 告知 redis 执行前面发送的两条命令(提交事务)
在这里插入图片描述

4.1.3.2 事务执行exec之前,入队命令错误

执行事务步骤:
1)MULTI 正常命令
2)SET key value 正常命令
3)INCR 命令语法错误
4)EXEC 无法执行事务,那么第一条正确的命令也不会执行,所以 key 的值不会设置成功
在这里插入图片描述
结论:事务执行 exec 之前,入队命令错误,事务终止,取消,不执行。

4.1.3.3 事务执行exec之后,命令错误

执行步骤:
1)MULTI 正常命令
2)SET username zhangsan 正常命令
3)lpop username 正常命令,语法没有错误,执行命令时才会有错误。
4)EXEC 正常执行,发现错误可以在事务提交前放弃事务,执行 discard.
在这里插入图片描述
结论:在 exec 执行后的所产生的错误,即使事务中有某个/某些命令在执行时产生了错误,事务中的其他命令仍然会继续执行。

Redis 在事务失败时不进行回滚,而是继续执行余下的命令。
Redis 这种设计原则是:Redis 命令只会因为错误的语法而失败(这些问题不能在入队时发现),或是命令用在了错误类型的键上面,失败的命令并不是 Redis 导致,而是由编程错误造成的,这样错误应该在开发的过程中被发现,生产环境中不应出现语法的错误。就是在程序的运行环境中不应该出现语法的错误。而 Redis 能够保证正确的命令一定会被执行。再者不需要对回滚进行支持,所以 Redis 的内部可以保持简单且快速。

4.1.3.4 放弃事务

执行步骤:

  1. MULTI 开启事务
  2. SET age 25 命令入队
  3. SET age 30 命令入队
  4. DISCARD 放弃事务,则命令队列不会被执行
    在这里插入图片描述
4.1.3.5 watch机制

1、 Redis 的 WATCH 机制

WATCH 机制原理:
WATCH 机制:使用 WATCH 监视一个或多个 key , 跟踪 key 的 value 修改情况,如果有key 的 value 值在事务 EXEC 执行之前被修改了,整个事务被取消。EXEC 返回提示信息,表示事务已经失败。

WATCH 机制使的事务 EXEC 变的有条件,事务只有在被 WATCH 的 key 没有修改的前提下才能执行。不满足条件,事务被取消。使用 WATCH 监视了一个带过期时间的键,那么即使这个键过期了,事务仍然可以正常执行
大多数情况下,不同的客户端会访问不同的键,相互同时竞争同一 key 的情况一般都很少,watch 能很好解决数据冲突的问题。

2、何时取消 key 的监视(WATCH)?

①WATCH 命令可以被调用多次。对键的监视从 WATCH 执行之后开始生效,直到调用 EXEC 为 止。不管事务是否成功执行,对所有键的监视都会被取消。
②当客户端断开连接时,该客户端对键的监视也会被取消。
③UNWATCH 命令可以手动取消对所有键的监视

3、 WATCH 的事例

执行步骤:
首先启动 redis-server , 在开启两个客户端连接。分别叫 A 客户端和 B 客户端。
启动 Redis 服务器
客户端A:
在这里插入图片描述
客户端B:
在这里插入图片描述
客户端A:
在这里插入图片描述

4.2 持久化

4.2.1 持久化概述

持久化可以理解为存储,就是将数据存储到一个不会丢失的地方,如果把数据放在内存中,电脑关闭或重启数据就会丢失,所以放在内存中的数据不是持久化的,而放在磁盘就算是一种持久化。

Redis 的数据存储在内存中,内存是瞬时的,如果 linux 宕机或重启,又或者 Redis 崩溃或重启,所有的内存数据都会丢失,为解决这个问题,Redis 提供两种机制对数据进行持久化存储,便于发生故障后能迅速恢复数据。

4.2.2 持久化方式

4.2.2.1 RDB方式

1、 什么是 RDB 方式?
Redis Database(RDB),就是在指定的时间间隔内将内存中的数据集快照写入磁盘,数据恢复时将快照文件直接再读到内存。

RDB 保存了在某个时间点的数据集(全部数据)。存储在一个二进制文件中,只有一个文件。默认是 dump.rdb。RDB 技术非常适合做备份,可以保存最近一个小时,一天,一个月的全部数据。保存数据是在单独的进程中写文件,不影响 Redis 的正常使用。RDB 恢复数据时比其他 AOF 速度快。

2、 如何实现?
RDB 方式的数据持久化,仅需在 redis.conf 文件中配置即可,默认配置是启用的。
在配置文件 redis.conf 中搜索 SNAPSHOTTING,查找在注释开始和结束之间的关于 RDB的配置说明。配 SNAPSHOTTING 置地方有三处。

①:配置执行 RDB 生成快照文件的时间策略。
对 Redis 进行设置,让它在“ N 秒内数据集至少有 M 个 key 改动”这一条件被满足时,自动保存一次数据集。
配置格式:save <seconds> <changes>
save 900 1
save 300 10
save 60 10000
在这里插入图片描述
②:dbfilename:设置 RDB 的文件名,默认文件名为 dump.rdb
③:dir:指定 RDB 文件的存储位置,默认是 ./ 当前目录
在这里插入图片描述
3、总结
优点:由于存储的是数据快照文件,恢复数据很方便,也比较快
缺点:
1)会丢失最后一次快照以后更改的数据。如果你的应用能容忍一定数据的丢失,那么使用 rdb 是不错的选择;如果你不能容忍一定数据的丢失,使用 rdb 就不是一个很好的选择。

2)由于需要经常操作磁盘,RDB 会分出一个子进程。如果你的 redis 数据库很大的话,子进程占用比较多的时间,并且可能会影响 Redis 暂停服务一段时间(millisecond 级别),如果你的数据库超级大并且你的服务器 CPU 比较弱,有可能是会达到一秒。

4.2.2.2 AOF方式

1、什么是 AOF 方式
Append-only File(AOF),Redis 每次接收到一条改变数据的命令时,它将把该命令写到一个 AOF 文件中(只记录写操作,读操作不记录),当 Redis 重启时,它通过执行 AOF 文件中所有的命令来恢复数据。
2、如何实现
AOF 方式的数据持久化,仅需在 redis.conf 文件中配置即可
配置项:
①:appendonly:默认是 no,改成 yes 即开启了 aof 持久化
②:appendfilename:指定 AOF 文件名,默认文件名为 appendonly.aof
③:dir :指定 RDB 和 AOF 文件存放的目录,默认是 ./
④:appendfsync:配置向 aof 文件写命令数据的策略:
no:不主动进行同步操作,而是完全交由操作系统来做(即每 30 秒一次),比较快但不
是很安全。
always:每次执行写入都会执行同步,慢一些但是比较安全。
everysec:每秒执行一次同步操作,比较平衡,介于速度和安全之间。这是默认项。
⑤:auto-aof-rewrite-min-size:允许重写的最小 AOF 文件大小,默认是 64M 。当 aof 文件大
于 64M 时,开始整理 aof 文件,去掉无用的操作命令。缩小 aop 文件。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3、总结
1)append-only 文件是另一个可以提供完全数据保障的方案;
2)AOF 文件会在操作过程中变得越来越大。比如,如果你做一百次加法计算,最后你只会
在数据库里面得到最终的数值,但是在你的 AOF 里面会存在 100 次记录,其中 99 条记录
对最终的结果是无用的;但 Redis 支持在不影响服务的前提下在后台重构 AOF 文件,让文
件得以整理变小
3)可以同时使用这两种方式,redis 默认优先加载 aof 文件(aof 数据最完整);

4.3 主从复制

4.3.1 主从复制–读写分离

通过持久化功能,Redis 保证了即使在服务器重启的情况下也不会丢失(或少量丢失)数据,但是由于数据是存储在一台服务器上的,如果这台服务器出现故障,比如硬盘坏了,也会导致数据丢失。

为了避免单点故障,我们需要将数据复制多份部署在多台不同的服务器上,即使有一台服务器出现故障其他服务器依然可以继续提供服务。

这就要求当一台服务器上的数据更新后,自动将更新的数据同步到其他服务器上,那该怎么实现呢?Redis 的主从复制。
在这里插入图片描述
Redis 提供了复制(replication)功能来自动实现多台 redis 服务器的数据同步(每天 19点新闻联播,基本从 cctv1-8,各大卫视都会播放)

我们可以通过部署多台 redis,并在配置文件中指定这几台 redis 之间的主从关系,主负责写入数据,同时把写入的数据实时同步到从机器,这种模式叫做主从复制,即master/slave,并且 redis 默认 master 用于写,slave 用于读,向 slave 写数据会导致错误

4.3.1.1 主从复制实现

修改配置文件,启动时,服务器读取配置文件,并自动成为指定服务器的从服务器,从而构成主从复制的关系

实现步骤:
模拟多 Reids 服务器,在一台已经安装 Redis 的机器上,运行多个 Redis 应用模拟多 个 Reids 服务器。一个 Master,两个 Slave

1、新建三个redis配置文件
如果 Redis 启动,先停止。
作为 Master 的 Redis 端口是 6380
作为 Slaver 的 Redis 端口分别是 6382 , 6384
从原有的 redis.conf 拷贝三份,分别命名为 redis6380.conf, redis6382.conf , redis6384.conf
在这里插入图片描述
2、编辑master配置文件
编辑 Master 的配置文件 redis6380.conf : 在空文件加入如下内容

include /usr/local/redis-4.0.13/redis.conf
daemonize yes
port 6380
pidfile /var/run/redis_6380.pid
logfile 6380.log
dbfilename dump6380.rdb

配置项说明:
include :包含原来的配置文件内容。/usr/local/redis-4.0.13/redis.conf 按照自己的目录设置。
daemonize:yes 后台启动应用,相当于 ./redis-server & 的作用。
port : 自定义的端口号
pidfile : 自定义的文件,表示当前程序的 pid ,进程 id。
logfile:日志文件名
dbfilename:持久化的 rdb 文件名
3、编辑slave配置文件
编辑 Slave 的配置文件 redis6382.conf 和 redis6384.conf: 在空文件加入如下内容
①:redis6382.conf:

include /usr/local/redis-4.0.13/redis.conf
daemonize yes
port 6382
pidfile /var/run/redis_6382.pid
logfile 6382.log
dbfilename dump6382.rdb
slaveof 127.0.0.1 6380

配置项说明:
slaveof :表示当前 Redis 是谁的从。当前是 127.0.0.0 端口 6380 这个 Master 的从。
②:redis6384.conf:

include /usr/local/ redis-4.0.13/redis.conf
daemonize yes
port 6384
pidfile /var/run/redis_6384.pid
logfile 6384.log
dbfilename dump6384.rdb
slaveof 127.0.0.1 6380

4、启动服务器 master/slave都启动
在这里插入图片描述
5、查看配置后的服务信息
命令:
①: Redis 客户端使用指定端口连接 Redis 服务器
./redis-cli -p 端口
②:查看服务器信息
info replication
登录到 Master:6380
在这里插入图片描述
查看当前服务信息
在客户端的 Redis 内执行命令 info replication
Master 服务的查看结果:
在这里插入图片描述
在新的 Xshell 窗口分别登录到 6382 ,6384 查看信息
在这里插入图片描述
6. 向 Master 写入数据
在 6380 执行 flushall 清除数据,避免干扰的测试数据。生产环境避免使用。
在这里插入图片描述
7. 在从 Slave 读数据
6382,6384 都可以读主 Master 的数据,不能写
在这里插入图片描述
Slave 写数据失败
在这里插入图片描述

4.3.1.2 容灾处理

当 Master 服务出现故障,需手动将 slave 中的一个提升为 master,剩下的 slave 挂至新的master 上(冷处理:机器挂掉了,再处理)

命令:
①:slaveof no one,将一台 slave 服务器提升为 Master (提升某 slave 为 master)
②:slaveof 127.0.0.1 6382 (将 slave 挂至新的 master 上)
执行步骤:
1、将 Master:6380 停止(模拟挂掉)
在这里插入图片描述
在这里插入图片描述
2、选择一个 Slave 升到 Master,其它的 Slave 挂到新提升的 Master
在这里插入图片描述
3、将其他 Slave 挂到新的 Master
在 Slave 6384 上执行
在这里插入图片描述
现在的主从(Master/Slave)关系:Master 是 6382, Slave 是 6384
查看 6382:
在这里插入图片描述
4、 原来的服务器重新添加到主从结构中
6380 的服务器修改后,重新工作,需要把它添加到现有的 Master/Slave 中
先启动 6380 的 Redis 服务
在这里插入图片描述
连接到 6380 端口
在这里插入图片描述
当前服务挂到 Master 上
在这里插入图片描述
5、查看新的 Master 信息
在这里插入图片描述
现在的 Master/Slaver 关系是:
Master: 6382
Slave: 6380
6384

4.3.1.3 操作命令

进入客户端需指定端口:./redis-cli -p 6380
不配置启动默认都是主 master
info replication 查看 redis 服务器所处角色

4.3.1.4 总结

1、一个 master 可以有多个 slave
2、slave 下线,读请求的处理性能下降
3、master 下线,写请求无法执行
4、当 master 发生故障,需手动将其中一台 slave 使用 slaveof no one 命令提升为 master,其
它 slave 执行 slaveof 命令指向这个新的 master,从新的 master 处同步数据
5、主从复制模式的故障转移需要手动操作,要实现自动化处理,这就需要 Sentinel 哨兵,
实现故障自动转移

4.3.2 高可用Sentinel哨兵

Sentinel 哨兵是 redis 官方提供的高可用方案,可以用它来监控多个 Redis 服务实例的运行情况。Redis Sentinel 是一个运行在特殊模式下的 Redis 服务器。Redis Sentinel 是在多个Sentinel 进程环境下互相协作工作的。

Sentinel 系统有三个主要任务:
⚫ 监控:Sentinel 不断的检查主服务和从服务器是否按照预期正常工作。
⚫ 提醒:被监控的 Redis 出现问题时,Sentinel 会通知管理员或其他应用程序。
⚫ 自动故障转移:监控的主 Redis 不能正常工作,Sentinel 会开始进行故障迁移操作。将
一个从服务器升级新的主服务器。让其他从服务器挂到新的主服务器。同时向客户端提
供新的主服务器地址。
在这里插入图片描述
1、sentinel文件
复制三份sentinel文件。
sentinel默认端口号是26379,复制后的三个文件指定端口号为
在这里插入图片描述
2、修改sentinel文件
(1)修改port
三个文件的port改为文件名后面的数字。
在这里插入图片描述
(2)修改监控的master地址
在这里插入图片描述
3、启动主从redis
在这里插入图片描述
查看master的配置信息

在这里插入图片描述
查看slave的配置信息,6384端口同下。

在这里插入图片描述
4、启动哨兵
分三个窗口,在/usr/local/redis-5.0.8/src下执行三条命令
第一条: ./redis-sentinel ../sentinel26380.conf
第二条: ./redis-sentinel ../sentinel26382.conf
第三条: ./redis-sentinel ../sentinel26384.conf
成功后如图
在这里插入图片描述
5、模拟主机down
在这里插入图片描述
6、sentinel发挥作用
在 Master 执行 shutdown 后,稍微等一会 Sentinel 要进行投票计算,从可用的 Slave 选
举新的 Master。
查看 Sentinel 日志,三个 Sentinel 窗口的日志是一样的
在这里插入图片描述

4.4 安全设置

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值