Redis(5.0)

1、什么是Redis

  Redis是一种开源的、基于内存、支持持久化的高性能Key-Value的NoSQL数据库,它同时也提供了多种数据结构来满足不同场景下的数据存储需求。

2、安装Redis(Linux)

2.1、去官网(http://www.redis.cn/)下载redis安装包

在这里插入图片描述

2.2、将下载的解压包放入目录【/opt】下面并解压;解压命令: tar -zxvf 包名

在这里插入图片描述
解压后的文件夹
在这里插入图片描述

2.3、安装Redis

2.3.1、安装redis之前先要安装【gcc】;gcc是linux下的一个编译程序,是C程序的编译工具。

注意:前提是必须联网。
在这里插入图片描述

2.3.2、查看是否安装gcc成功;出现版本信息表示成功。

在这里插入图片描述

2.3.3、安装Redis

在这里插入图片描述

2.3.4、出现提示要你执行如图的命令表示安装成功(这里不用执行这个命令)

在这里插入图片描述

2.3.5、如果出现【jemalloc/jemalloc.h:没有那个文件或目录】这样的提示;有可能是在没有b编译【gcc】之前,执行了redis的【make】这个命令;编译失败之后留下了一些残留,所有执行命令【 make distclean 】清理残留之后,再执行命令【make】就可以编译成功。

在这里插入图片描述

2.3.6、编译之后安装redis;安装命令【make install】

在这里插入图片描述

2.3.7、查看redis默认安装位置

在这里插入图片描述

3、运行与停止Redis

3.1、启动redis服务

3.1.1、为了不修改redis的默认配置,先将文件【redis.conf】拷贝一份到新建文件夹【RunRedis】中;

在这里插入图片描述

3.1.2、修改拷贝的配置文件【redis.conf】;将daemonize 的值修改为【yes】;原因是将redis修改为后台启动;如果是前台启动的话,终端就无法执行其他操作了;

在这里插入图片描述

3.1.3、进入路径【/usr/local/bin】

在这里插入图片描述

3.1.4、启动Redis服务 命令【/usr/local/bin/redis-server /RunRedis/redis.conf】

启动时指定读取修改好的配置文件;
在这里插入图片描述

3.1.5、使用命令【ps -ef | grep redis】查看redis服务是否启动;可以看出redis的默认端口是6379

在这里插入图片描述

3.1.5、也可以测试一下这个端口【6379】是否有效;

使用命令【redis-cli -p 端口号】;–进入指定redis终端控制台
使用命令【ping】;查看端口是否有效,返回字样“PONG“表示成功。
退出【ctrl+c】或者使用命令【exit】–可以退出redis控制台

在这里插入图片描述

3.1、停止redis

命令:【/usr/local/bin/redis-cli shutdown】
在这里插入图片描述
附加:指定端口关闭为【/usr/local/bin/redis-cli -p 6379 shutdown】

4、Redis基础知识

  redis默认16个数据库,类似数组下标从零开始,初始默认使用0号库;16个库都是同样密码,要么都OK要么一个也连接不上;Redis索引都是从零开始;Redis的默认端口是6379

4.1、在文件 【redis.conf】中查看当前redis有多少个库。

在这里插入图片描述

4.2、使用命令【select 库号】可以切换数据库。

在这里插入图片描述

4.3、如何在redis中存入值

命令
写入值:【set key value】
获取值:【get key】
在这里插入图片描述
注意:同一个key重复设置值会覆盖原来的值。

4.4、查看当前数据库的key数量

命令【dbsize】
示例中查出2个。
在这里插入图片描述

4.5、查看当前数据库的key数量

命令【keys *】
在这里插入图片描述

4.6、显示当前库key名是“a”开头的

命令【keys a*】
在这里插入图片描述

4.7、显示当前库key名是“e”结尾的

命令【keys *e】
在这里插入图片描述

4.8、清空当前库的所有key(正式工作中慎用)

命令【FLUSHDB】
在这里插入图片描述

4.9、清空所有库的key(正式工作中慎用)

命令【FLUSHALL】
在这里插入图片描述

5、redis的数据类型

5.1、String(字符串)

  String是redis最基本的类型,一个key对应一个value。String类型是二进制安全的。意思是redis的String可以包含任何数据。比如jpg图片或者序列化的对象 。String类型是Redis最基本的数据类型,一个redis中字符串的value值最大可以是512M。

常用命令

  • set 【key】【value】 --设置指定 key 的值.
  • get 【key】 --获取指定key值。
  • del 【key】 --删除指定key和它的值。
  • append 【key】【value】 --如果 key 已经存在并且是一个字符串,append命令将指定的 value 追加到该 key原来值(value)的末尾。
  • strlen 【key】 --返回指定 key 所储存的字符串值的长度。
  • incr 【key】 --将 key 中储存的数字值增一。
  • decr 【key】 --将 key 中储存的数字值减一。
  • incrby 【key】【数字】 --将 key 所储存的数字值加上给定的数字。
  • decrby 【key】【数字】 --将 key 所储存的数字值剪去给定的数字。
  • getrange 【key】【索引a】【索引b】 --获取key从【索引a】到【索引b】之间的值;从0到-1表示全部.
  • setrange 【key】【索引】【值】 --将key的值从【索引】处开始覆盖成指定的【值】。
  • setex 【key】【s】【value】 --设置【key】的值为【value】,过期时间为【s】,时间单位是秒。
  • setnx 【key】【value】 --将key设置指定的value;前提是这个key未创建的情况下。
  • mset 【key1】【value1】【key2】【value2】…. --同时设置多个键值对。不能设置已有的key。
  • mget 【key1】【key2】–同时获取多个key的值;

5.2、Hash(哈希)

  Hash 是一种键值对集合,它可以将多个字段(field)和对应的值(value)关联到同一个键(key)下,形成类似于关系型数据库中的“行”的结构。在 Redis 中,一个 Hash 可以存储多个字符串类型的 field-value 对应关系,这使得它非常适合用于存储对象或映射表。类似Java里面的Map<String,Object>

常用命令

  • hset 【key】【k v】 --将指定的key中设置一个键值对。
  • hget【key】【k】 --获取key中某一个【k】的元素值。
  • hmset 【key】【k1 v1 k2 v2 …】–将指定的key中设置多个键值对.
  • hmget 【key】【k1 k2 k3 …】–获取key中指定的多个【k】的元素值
  • HGETALL 【key】 --获取key中所有的键值对。
  • hdel 【key】【k】 --删除key中的某一个【k】的元素。
  • hlen 【key】 --获取key中键值对的个数。
  • hexists 【key】【k】 --判断key里面【k】键是否存在;1表示有;0表示无
  • hkeys 【key】 --将指定的【key】中所有的键值对的键取出来
  • hvals 【key】 --将指定的【key】中所有的键值对的值取出来。
  • HINCRBY 【key】【k】【n】-- 将key中的指定k的整数值加上增量 n
  • HINCRBYFLOAT 【key】【k】【n】-- 将key中的指定k的浮点数加上增量 n
  • hsetnx 【key】【k v】 --将指定的key中设置一个键值对。如果该键值对已存在,则不设置。

5.3、List(列表)

  List数据类型是一种有序的、可以重复的数据序列,它允许用户在头部(左端)或尾部(右端)插入和移除元素。每个 List 可以存储多个字符串值,并且这些值在列表中的位置是有顺序的。

5.3.1、常用命令

  • lpush 【key】【value1 value2 …】 --将指定的key设置多个值。(最后存入的值下标是‘0’,最新的值会把已有的值下标往后推)。
  • lrange 【key】【下标x】【下标n】–获取指定key中下标【下标x】到【下标n】之间的value值。从0到-1表示全部.
  • rpush 【key】【value1 value2 …】 --在列表中添加/追加一个或多个值。
  • LPOP 【key】 --移出并获取列表的第一个元素(命令必须大写)。
  • RPOP 【key】 --移除列表的最后一个元素,返回值为移除的元素(命令必须大写)。
  • LINDEX 【key】【下标】 --通过索引获取列表中的元素。
  • llen 【key】 --获取列表的长度。
  • lrem 【key】【n】【value】 --在指定的key中删除【n】个相同的【value】。
  • ltrim 【key】【下标1】【下标2】 --让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
  • RPOPLPUSH 【key1】【key2】 --移除key1列表的最后一个元素,并将该元素添加到key2列表的最前面并返回该元素。
  • LSET 【key】 【index】【value】 --通过索引设置列表元素的值。
  • linsert 【key】before【元素】【新元素】 --在“元素“前面插入“新元素“
  • linsert 【key】after【元素】【新元素】 --在“元素“后面插入”新元素“

5.3.2、示例

5.3.2.1、使用命令lpush给key【list1】插入多个value

在这里插入图片描述

5.3.2.2、获取key【list1】的所有值。

在这里插入图片描述

5.3.2.3、使用命令rpush给key【list2】添加值。

在这里插入图片描述

5.3.2.4、使用命令【LPOP】移除并获取key【list2】的第一个值。

在这里插入图片描述

5.3.2.5、使用命令【RPOP】移除并获取key【list2】的最后一个值。

在这里插入图片描述

5.3.2.6、使用命令【LINDEX】获取key【list2】小标为【1】的值。

在这里插入图片描述

5.3.2.7、使用命令【llen】获取key【list2】的列表长度。

在这里插入图片描述

5.3.2.8、使用命令【lrem】移除key【list3】列表中【2】个相同的【i2】值

在这里插入图片描述

5.3.2.9、使用命令【ltrim】移除key【list3】下标【3】到【5】以外的值。

在这里插入图片描述

5.3.2.10、使用命令【rpoplpush】将key【list1】的最后一个元素【3】剪切到key【list2】元素列表的最前面。

在这里插入图片描述

5.3.2.11、使用命令【lset】将下标为0的元素【3】修改为【h】。

在这里插入图片描述

5.3.2.12、使用命令【linsert】在key【list1】的元素【2】前面添加一个新元素【b】

在这里插入图片描述

5.3.2.13、使用命令【linsert】在key【list1】的元素【2】后面添加一个新元素【g】

在这里插入图片描述

5.4、Set(集合)

  Redis 的 Set(集合)数据类型是一种无序的、不重复元素的集合。Set 中的每个成员必须是唯一的,这意味着你不能在同一个 Set 中添加两个相同的值。

常用命令

  • sadd 【key】【value1 value2 value3 ……】 --向key中添加一个或多个元素。
  • smembers 【key】 --获取【key】中的所有元素。
  • sismember 【key】【元素】 --判断元素是否是集合 key 的成员;1表示是;0 表示 不是。
  • scard 【key】 --获取集合中的元素个数。
  • srem 【key】 【value】 --删除集合中元素。
  • srandmember 【key】 【n】 --随机返回集合中【n】个随机数。
  • spop 【key】 --随机移除key中的一个元素。
  • smove 【key1】【key2】【元素】 --将集合key1中的【元素】移动到集合key2中。数字集合类命令
  • 差集:sdiff 【key1】【key2】 --把key1于key2作比较;把key1有的元素,而key2没有的元素获取出来。
  • 交集:sinter 【key1】【key2】 --把key1于key2作比较;把key1和key2中相同的元素取出来。
  • 并集:sunion 【key1】【key2】–将key1和key2中元素都取出来(其中相同的元素只取一次)。

5.5、zset(有序集合)

  zset是一种特殊的数据结构,它在普通集合的基础上增加了排序功能。每个元素(成员 member)在有序集合中都是唯一的,并且与一个 double 类型的分数(score)相关联。有序集合中的元素会根据其关联的分数进行自动排序,分数可以是任何浮点数,包括负数。

常用命令

  • zadd 【key】【score1 value1 score2 value2】 --向有序集合添加一个或多个成员,或者更新已存在成员的分数.
  • zrange 【key】【下标x】【下标n】 --返回有序集合【key】中下标是【下标x】到下标【下标n】之间的键值对的值。
  • zrange 【key】【下标x】【下标n】withscores --返回有序集合【key】中下标是【下标x】到下标【下标n】之间的键值对
  • zrangebyscore 【key】 【score1】 【score2】–获取分数【score1】到分数【score2】之间的元素值。
  • zrangebyscore 【key】 【(score1】 【score2】–获取分数【score1】到分数【score2】之间的元素值;但不包含score1的元素值。
  • zrangebyscore 【key】 【(score1】 【(score2】 --获取分数【score1】到分数score2】之间的元素值;但不包含 - score1和score2的元素值。
  • zrangebyscore 【key】 【score1】 【score2】limit 【n】【x】–获取分数【score1】到分数【score2】之间的元素值;limit是实现分页显示查询结果如显示第【】页数据,一页显示【】条数据。
  • zrem 【key】【 value值】 --将指定【key】中的某一个score键值对删除;(这里为什么选value值做删除索引,是因为value值是唯一的,而score键可用重复)。
  • zcard 【key】 --获取指定【key】中的键值对个数。
  • zcount【key】【score1】【score2】–获取指定【key】中【score1】到【score2】之间的键值对个数。
  • zrank 【key】【value】 --获取【key】中指定【value】的索引
  • zscore 【key】【value】 --根据【key】中【value值】获得分数。
  • zrevrank【key】【values值】 --获取【key】中指定逆序获得下标值
  • zrevrange 【key】【下标1】【下标2】–从指定的【key】逆序获取【下标1】到【小标2】中得值。
  • zrevrangebyscore 【key】【结束score】 【开始score】 --返回有序集中指定分数区间内的所有的成员。有序集成员按分数值递减(从大到小)的次序排列。

6、Redis常用命令key

6.1、set 【key】【value】 --在数据中设置值

示例:设置key【age】的值为【22】
在这里插入图片描述

6.2、get 【key】 --获取一个key 的值

示例:获取key[【age】的值。
在这里插入图片描述

6.3、del 【key1 key2】 --删除一个key或多个key

示例:删除key【k2】
在这里插入图片描述
示例2 :删除key【k1】和key【k2】
在这里插入图片描述

6.4、 keys * --查看当前库的所有key

示例:查看当前库的所有key
在这里插入图片描述

6.5、move 【key名】 【库号】 --将key移动至指定的数据库。

示例:将key【age】移动到数据库2
在这里插入图片描述

6.6、expire 【key】 【秒钟】 --为给定的key设置过期(自动删除)时间。

ttl 【key】 --查看还有多少秒过期,-1表示永不过期,-2表示已过期
示例:设置key【k1】十秒后过期。;查看k1的过期时间
在这里插入图片描述

6.7、type 【key】 --查看key的数据类型。

示例:查看key【k2】的数据类型。
在这里插入图片描述

6.8、exists 【key】 --查询某个key是否存在;0:表示不存在;1:表示存在。

示例:查看key【s】和key【age】是否存在。
在这里插入图片描述

6.8、rename 【key1】【key2】 --将指定的【key1】名称重命名为【key2】

示例:将key【age】重命名为【ageplus】
在这里插入图片描述

7、redis配置文件—redis.conf

7.1、redis.conf的位置:【/opt/redis-5.0.7】

在这里插入图片描述

7.2、redis详细配置解析

第三方详细解析。
https://blog.csdn.net/suprezheng/article/details/90679790
https://www.cnblogs.com/ysocean/p/9074787.html

7.3、redis常用配置解析

常见配置redis.conf介绍(重点)https://blog.csdn.net/suprezheng/article/details/90679790

7.3.1、 GENERAL通用(重点)

在 Redis 配置文件(redis.conf)中,“GENERAL” 类型的配置通常指的是那些适用于 Redis 服务整体运行的基础配置选项,这些通用设置包括但不限于以下内容:

  • daemonize:是否以守护进程模式运行。daemonize yes/no,默认为 no。当设为 yes 时,Redis 将作为后台守护进程启动。
  • pidfile:守护进程的 PID 文件路径。如 pidfile /var/run/redis_6379.pid,用于记录 Redis 进程的 ID,方便系统管理。
  • logfile:日志文件路径,指定 Redis 的日志输出位置,默认情况下,Redis 会将日志信息输出到标准输出(终端),通过此配置可以更改日志写入到特定文件。
  • loglevel:日志级别,例如 loglevel notice。Redis 支持多个日志级别,如 debug(记录大量日志信息,适用于开发、测试阶段)、verbose(较多日志信息)、notice(默认)、warning (较多日志信息)和 error 等,用以控制日志信息的详细程度。
  • port:Redis 服务器监听的 TCP 端口号,默认为 6379。
  • bind:绑定的网络接口地址。如果不配置,Redis 将监听所有可用网络接口;如果指定一个或多个 IP 地址,则仅监听来自这些地址的连接请求。
  • timeout:客户端空闲超时时间,在该时间内未执行任何命令的客户端连接将被关闭。
  • protected-mode:是否开启保护模式,默认为 yes,这会影响 Redis 在没有明确配置 bind 或 requirepass 情况下的访问策略。
  • databases:数据库数量,即 Redis 默认支持的最大数据库数,默认为 16。

7.3.2、 SNAPSHOTTING(快照)

SNAPSHOTTING(快照)是一种持久化机制,用于将内存中的数据保存到磁盘中。Redis 的默认快照方式称为 RDB (Redis Database) 持久化。

7.3.2.1、save 参数:
  • 这是一个多条配置项,用于指定触发快照保存的条件。
  • 示例配置格式:save ,其中 表示时间(秒数),表示在给定时间内发生更改的键的数量。
  • 示例配置值:
save 900 1    # 如果900秒内至少有1个键被修改,则创建快照
save 300 10   # 如果300秒内至少有10个键被修改,则创建快照
save 60 10000 # 如果60秒内至少有10000个键被修改,则创建快照
  • 若要禁用自动快照,可以注释掉所有 save 行或者添加一行 save “”。
7.3.2.2、stop-writes-on-bgsave-error:
  • 默认情况下为 yes,当后台保存时如果出现错误(例如磁盘满或写入权限问题),Redis 将停止接受写请求以避免数据丢失。
  • 可以将其设置为 no 来允许即使在快照失败的情况下也继续接受写操作。
7.3.2.3、rdbcompression:
  • 默认为 yes,表示在存储 RDB 文件时启用 LZF 压缩以减少文件大小。
  • 设置为 no 则不进行压缩,可能有助于更快地保存和载入数据,但会增加磁盘空间占用。
7.3.2.3、rdbchecksum:
  • 默认为 yes,会在 RDB 文件中存储一个校验和,以便在加载时检查数据完整性。
  • 如果设置为 no,则不会计算和验证校验和,可能会导致加载损坏的 RDB 文件而不被发现。
7.3.2.3、dbfilename:
  • 指定 RDB 文件的名称,默认为 “dump.rdb”。
7.3.2.3、dir:
  • 指定 RDB 文件存放的目录,默认通常为 Redis 数据目录。
7.3.2.3、rdb-del-sync-files:
  • Redis 6.2 版本引入的新配置选项,用于控制是否同步删除旧的 RDB 文件。

7.3.3、REPLICATION(复制)

REPLICATION(复制)是用于创建和维护多个 Redis 实例之间数据同步的机制。通过配置主从复制,可以实现高可用性和可扩展性,同时支持读写分离等应用场景。

7.3.3.1、slave-serve-stale-data:
  • 默认值为yes。当一个 slave 与 master 失去联系,或者复制正在进行的时候,slave 可能会有两种表现:
     1) 如果为 yes ,slave 仍然会应答客户端请求,但返回的数据可能是过时,或者数据可能是空的在第一次同步的时候
     2) 如果为 no ,在你执行除了 info he salveof 之外的其他命令时,slave 都将返回一个 “SYNC with master in progress” 的错误
7.3.3.1、slave-read-only:
  • 配置Redis的Slave实例是否接受写操作,即Slave是否为只读Redis。默认值为yes。
7.3.3.1、repl-diskless-sync:
  • 主从数据复制是否使用无硬盘复制功能。默认值为no。
7.3.3.1、repl-diskless-sync-delay:
  • 当启用无硬盘备份,服务器等待一段时间后才会通过套接字向从站传送RDB文件,这个等待时间是可配置的。 这一点很重要,因为一旦传送开始,就不可能再为一个新到达的从站服务。从站则要排队等待下一次RDB传送。因此服务器等待一段 时间以期更多的从站到达。延迟时间以秒为单位,默认为5秒。要关掉这一功能,只需将它设置为0秒,传送会立即启动。默认值为5。
7.3.3.1、repl-disable-tcp-nodelay:
  • 同步之后是否禁用从站上的TCP_NODELAY 如果你选择yes,redis会使用较少量的TCP包和带宽向从站发送数据。但这会导致在从站增加一点数据的延时。 Linux内核默认配置情况下最多40毫秒的延时。如果选择no,从站的数据延时不会那么多,但备份需要的带宽相对较多。默认情况下我们将潜在因素优化,但在高负载情况下或者在主从站都跳的情况下,把它切换为yes是个好主意。默认值为no。

8、redis持久化

  什么是持久化:由于redis的高性能主要来源于它将所有的数据都存在内存中,而将内存中数据同步到硬盘中的这个过程叫做持久化。Redis 提供了两种主要的持久化方法:

8.1、RDB (Redis Database)(默认)

  • RDB 是 Redis 默认采用的一种持久化方式,通过定期或在满足特定条件时(如自上次快照以来有指定数量的键被修改)创建数据库的二进制快照(Snapshot)。这个过程是通过 fork 子进程来完成的,子进程将当前的数据写入到一个名为 dump.rdb 的文件中。
  • 优点:恢复速度快,文件占用空间小;适合大规模的数据恢复场景。
  • 缺点:在 Redis 宕机后,最后一次快照后的数据可能会丢失;如果数据更新频繁,可能会导致较多的数据损失。

8.1.1、定时持久化数据的时间的设置位置

在这里插入图片描述

save 900 1:表示900 秒内如果至少有 1 个 key 的值变化,则保存
save 300 10:表示300 秒内如果至少有 10 个 key 的值变化,则保存
save 60 10000:表示60 秒内如果至少有 10000 个 key 的值变化,则保存

在这里插入图片描述

8.2、AOF (Append Only File)

  • AOF 持久化是另一种可选的持久化方式,它将所有对 Redis 服务器进行的写操作命令以追加的方式记录在一个日志文件中。用户可以配置不同的策略来决定何时将命令从缓存同步到磁盘上,包括每秒同步、每次写操作后同步和不主动同步等。

  • 优点:数据安全性更高,几乎可以实现完全持久化,即使在服务器意外停机的情况下也能保证较少的数据丢失。

  • 缺点:随着写操作增加,AOF 文件会越来越大,需要定期执行重写(rewrite)来压缩体积,并且在启动时加载 AOF 文件比 RDB 要慢一些。

  • AOF的开启步骤
    1、在rendis的配置文件【redis.conf】中的“APPEND ONLY MODE”一栏将【appendoly】的值设置为 “yes”。
    2、AOF数据持久化到硬盘的默认存储文件是【appendonly.aof】。
    在这里插入图片描述

  • AOF恢复数据:重启redis服务即可。默认就会读取【appendonly.aof】的数据。

8.1、说明

  为了达到最佳的持久化效果,有些用户会选择同时开启 RDB 和 AOF 两种持久化方式,这样既能利用 RDB 快速恢复的优点,又能确保 AOF 提供更高的数据安全性。当 Redis 重启时,如果同时开启了这两种持久化方式,则优先使用 AOF 文件恢复数据,因为 AOF 文件包含了自最后一次 RDB 快照之后的所有写入操作,能够提供更完整的数据状态

9、redis事务

  可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞。

9.1、常用命令

  • MULTI --标记事务的开始。
  • Exec --执行所有事务块内的命令。
  • DISCARD --取消事务,放弃执行事务块内的所有命令。
  • 注意:redis开启一个事务时,如果列队中有命令语法错误,那么这个事务里面的命令都不会执行;如果是命令语法没错,在执行命令中出错,则列队中的其他命令不受其中执行错误影响。能执行的还是会执行。

9.2、使用示例

9.2.1、使用命令【MULTI】开启一个事务,返回“OK”表示开启成功。

在这里插入图片描述

9.2.1、创建一个事务,创建一组命令,并执行这个事务中的命令。

“QUEUED“:表示这个命令已在事务列队中。
在这里插入图片描述

9.3、watch命令(监控事务)

  watch命令类似于乐观锁;watch 命令可以决定事务是执行还是回滚。一般而言,可以在 MULTI命令之前使用 watch 命令监控某些键值对,然后使用 MULTI命令开启事务,执行各类对数据结构进行操作的命令,这个时候这些命令就会进入队列。
  当 Redis 使用 exec 命令执行事务的时候,它首先会去比对被 watch 命令所监控的键值对,如果没有发生变化,那么它会执行事务队列中的命令,提交事务;如果发生变化,那么它不会执行任何事务中的命令,而去事务回滚。无论事务是否回滚,执行了【exec】命令;Redis 都会去取消执行事务前的 watch 命令(监控锁);同时返回Nullmulti-bulk应答以通知调用者事务执行失败信息。

10、redis的主从复制

10.1、说明:

  主机数据更新后根据配置和策略,自动同步到备机的机制,Master以写为主,Slave以读为主。

10.2、作用:

  实现读写分离,容灾恢复。

10.3、使用案例:

10.3.1、创建三个redis服务器79、80、81

在这里插入图片描述

10.3.2、并复制三个redis.conf配置文件,根据服务器分别开启【指定端口】【daemonize yes】【修改pid文件名字】【log文件名字】【dump.rdb名字】

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

10.3.3、启动三台服务器

在这里插入图片描述

10.3.4、使用命令【info replication】可以查看三台服务的主从复制信息。(reole=master表示主机/slave表示从机)。也就是说不设置的话默认就是主机。

在这里插入图片描述

10.3.5、如何设置从机;如:将80和81设置为79的从机;使用命令【SLAVEOF ip 端口】来实现

在这里插入图片描述

10.3.6、当80和81设置为79的从机之后,从机会备份主机库中所有的数据。80和81成为从机前和成为从机后的数据都会备份。(k4是有从机后的数据。k1和k2是无从机之前的数据,可以看出都可以从从机读取出来。)

在这里插入图片描述

10.3.7、写入数据只有主机可以,从机是不可以写入数据的(写入时会报错!)

在这里插入图片描述

10.3.8、当主机关机停止工作时,从机会原地待命,既不会停止工作,也不会代替主机工作;直到主机恢复,继续备份主机。一切照旧。

在这里插入图片描述

10.3.9、当从机80停止工作时,之后又恢复的从机不会再是从机的身份(会恢复为主机身份),要想再次作为从机为主机工作必须再次执行命令【SLAVEOF ip 端口】设为从机。要想设置该机永久为从机,必须写进配置文件redis.conf。

在这里插入图片描述

10.3.10、当前从机也可以有从机如:81是80 的从机,80是79的从机。

在这里插入图片描述

10.3.11、如果主机停止工作时,可以使用命令【SLAVEOF no one】 将从机转为主机,成为新的主机,注意的是其他的从机要重新设置备份的主机。

在这里插入图片描述

10.3.12、复制原理

slave(从机)启动成功连接到master(主机)后会发送一个sync(同步)命令,Master(主机)接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,

在后台进程执行完毕之后,master(主机)将传送整个数据文件到slave(从机),以完成一次完全同步
全量复制:而slave(从机)服务在接收到数据库文件数据后,将其存盘并加载到内存中。
增量复制:Master(主机)继续将新的所有收集到的修改命令依次传给slave(从机),完成同步,但是只要是重新连接master(主机),一次完全同步(全量复制)将被自动执行。

10.3.13、哨兵模式

10.3.13.1、什么是哨兵模式

能够从后台监控主机是否故障,如果故障了根据投票数自动将从机转换为主机。也就是说,如果主机挂了,哨兵模式会通过投票在从机中选出新的主机来使用。没有被选中的从机会自动设置为新主机的从机,如果以前的老主机又重新恢复会被自动设置为新主机的从机,不再是主机,这就是哨兵模式的优点。

10.3.13.2、使用方式

  1. 使用环境:一主二从(79是主机,80、81是从机)
    2.

  2. 在自定义的/RedisRun目录下新建sentinel.conf文件,名字绝不能错。
    在这里插入图片描述

  3. 配置哨兵:在文件【sentinel.conf】中填写内容为【sentinel monitor 被监控的主机名字(自己随便起名字) 127.0.0.1 6379 1】
    在这里插入图片描述
    注意:上面最后一个数字1,表示主机挂掉后salve投票看让谁接替成为主机,得票数多少后成为主机

  4. 使用命令【redis-sentinel】运行该文件; 命令为【/usr/local/bin/redis-sentinel /RunRedis/sentinel.conf】
    4.

  5. 出现如下效果表示哨兵模式开启成功
    在这里插入图片描述

  6. 使用命令【shutdown】关闭服务,模拟主机出现故障。
    在这里插入图片描述

  7. 稍等30秒左右,查看哨兵模示的运行窗口是否有新主机的投票结果。根据日志信息,我们可以看出新选出来的主机是6381.
    在这里插入图片描述

  8. 验证试一下新主机是否是6381
    从图可以看出新选出开的主机是6381并且6380也自动转换成了6381的从机。

    8.如果这时已停机的6379又恢复使用,会自动成为新主机6381的从机;查看查看效果
    启动主机6379
    在这里插入图片描述

  9. 查看哨兵日志信息;自动将7379设置为6381的从机
    9.

10.3.14、复制的缺点

复制延迟: 由于所有的写操作都是先在Master(主机)上操作,然后同步更新到Slave(从机)上,所以从Master(主机)同步到Slave(从机)机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave(从机)机器数量的增加也会使这个问题更加严重。

11、面试题

1、Redis是什么?都有哪些使用场景?

  1. Redis是一个开源的,使用C语言编写的,是一个高性能的K,V键值对分布式内存数据库。
  2. 数据高并发的读写;海量数据的读写;对扩展性要求高的数据;

2、redis 为什么是单线程的?

  1. 内存操作高效性: Redis 数据主要存储在内存中,内存访问速度非常快(相比磁盘 I/O),CPU 不是性能瓶颈。由于所有操作都在内存中完成,多线程带来的并发处理优势在这种场景下并不显著。

  2. 避免锁竞争: 单线程模型可以避免多线程环境中的锁竞争问题,使得代码逻辑更简单、执行效率更高。Redis 中的数据结构如链表、哈希表等都被设计为无锁或极少使用锁,这在单线程环境下可以保证操作的原子性和一致性。

  3. 简化编程模型: 单线程架构简化了编程模型,无需考虑复杂的并发控制和同步机制,使 Redis 代码更加简洁,更易于理解和维护。

  4. 网络 I/O 多路复用技术: Redis 使用 I/O 多路复用技术(如 epoll、kqueue 或者 select)来监听多个客户端连接请求,虽然只有一个线程服务这些请求,但该线程可以在等待一个命令执行完毕的同时处理其他客户端的读写事件,从而实现在单线程上高效的并发处理能力。

  5. 高吞吐量与低延迟: 单线程模式能够提供很高的吞吐量,并且由于没有上下文切换的开销,因此延迟相对较低。对于 Redis 这种主要用于缓存和快速数据访问的应用场景来说,牺牲多核并行计算的能力换取更高的单个请求响应速度是有意义的。

3、什么是缓存穿透、缓存击穿、缓存雪崩?

3.1、 缓存穿透:

  用户请求的数据在缓存和数据库中都没有。比如恶意用户不断查询不存在的用户信息,每次查询都会去查数据库,导致数据库压力大。解决办法是在缓存层对查询结果为空的情况也设置一个特殊的值(如空对象),或者使用布隆过滤器提前拦截一定不存在的数据请求。

解决方式:

  • 布隆过滤器:在请求到达缓存之前,先经过一个布隆过滤器。布隆过滤器可以用来判断一个数据是否存在数据库中,对于确定不存在的数据,直接返回“未找到”,避免对数据库进行查询。
  • 空值缓存:即使查询结果为空,也将空值缓存起来(设置一个合理的过期时间),这样下次同样的查询会直接从缓存获取。

3.2、 缓存击穿:

  热点数据(经常访问的数据)过期后,大量并发请求同时过来,所有请求都直接去找数据库,让数据库不堪重负。就像一堵墙被连续猛烈撞击而破洞一样。解决方法是在缓存失效时加锁,只允许一个请求穿透到数据库获取数据,并在拿到数据后立即回填到缓存,其他请求等待解锁后再从缓存读取。

解决方式:

  • 互斥锁(Mutex Lock):当某个热点数据即将过期或已过期时,为这个 key 设置一个互斥锁,仅允许一个线程去数据库查询并回填缓存,其他线程等待解锁后读取缓存。
  • 永不过期策略:对于非常重要的热点数据,可以考虑将它们设置为永不过期,通过后台服务定期更新其缓存。

3.3、 缓存雪崩:

  大量的缓存在同一时间失效,所有的请求像雪崩一样全部涌向数据库,导致数据库瞬间崩溃。这可能是因为缓存服务器整体故障或大规模缓存统一过期等。处理方式包括构建缓存集群提高可用性、分散缓存过期时间、设置熔断机制,在流量过大时暂时保护数据库不被打垮。

解决方式:

  • 分散过期时间:设置缓存过期时间时引入随机性,防止大量缓存在同一时刻失效。
  • 分层缓存:使用二级缓存或者本地缓存,即使一级缓存(如 Redis)挂掉,也能暂时依靠其他缓存层级抵挡住部分请求压力。
  • 缓存预热:在系统上线或缓存重建前,提前将可能访问到的数据加载到缓存中,避免瞬间大量请求打到数据库。
  • 熔断与限流降级:当检测到数据库压力过大时,利用熔断机制暂停非核心业务的写操作,并且采用限流措施减少并发读请求的数量,优先保障核心服务稳定运行。

4、redis 支持的数据类型有哪些?

string、list、hash、set、zset。

5、怎么保证缓存和数据库数据的一致性?

先删缓存后写数据库(DCTWD): 这个策略相对简单且实用,适用于大部分读多写少、对数据一致性要求不是非常严格的场景。

延时双删策略: 在更新数据库后立即删除缓存,并设置一个短时间的延迟任务再次删除缓存。这种策略可以有效减少因网络延迟等因素导致的数据不一致问题,尤其适用于并发写操作较多且对数据一致性有一定要求的场景。

使用消息队列异步处理: 对于高并发或者强一致性的场景,通过引入消息队列进行解耦,确保数据库更新和缓存更新的最终一致性。这种方式虽然复杂度较高,但能较好地应对分布式系统中的各种异常情况。

7、redis 持久化有几种方式?

RDB(Redis Database):指定的时间间隔能对数据进行快照存储。
AOF(Append Only File):每一个收到的写命令都通过write函数追加到文件中。

附加
当redis开启了AOF时,redis启动服务时默认就是读取AOF,所以当redis开启AOF时,恢复时就会以AOF为默认。可以和RDB共存,但恢复数据时不会执行rdb文件。

8、redis 淘汰策略有哪些?

  1. volatile-lru:从已设置过期时间的数据集(server. db[i]. expires)中挑选最近最少使用的数据淘汰。
  2. volatile-ttl:从已设置过期时间的数据集(server. db[i]. expires)中挑选将要过期的数据淘汰。
  3. volatile-random:从已设置过期时间的数据集(server. db[i]. expires)中任意选择数据淘汰。
  4. allkeys-lru:从数据集(server. db[i]. dict)中挑选最近最少使用的数据淘汰。
  5. allkeys-random:从数据集(server. db[i]. dict)中任意选择数据淘汰。
  6. no-enviction(驱逐):禁止驱逐数据。

9、redis 有哪些功能?

数据缓存功能、分布式锁的功能、 数据持久化、支持事务、消息队列

  • 17
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值