Redis基础命令和事务,redis持久化和主从复制

2024-09-01 12:04

本文主要是介绍Redis基础命令和事务,redis持久化和主从复制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 第一章、Redis数据库的下载和安装
    • 1.1)nosql数据库和 Redis 介绍
    • 1.2)Windows中下载安装Redis数据库
    • 1.3)Linux中安装Redis数据库
    • 1.4)Linux中启动redis
    • 1.5)Linux中关闭redis
  • 第二章、三种Redis客户端连接Redis数据库
    • 2.1)redis 命令行客户端
    • 2.2)redis 远程客户端
    • 2.3)redis 编程客户端Jedis
      • 2.3.1)下载 Jedis 和 Commons-Pool
      • 2.3.2)Java 应用使用 Jedis 准备
      • 2.3.3)使用jedis连接池操作数据
  • 第三章、Redis 命令大全
    • 3.1)通用命令
      • 语法:redis >ping
      • 语法:dbsize
      • 语法:select db
      • 语法:flushdb
      • 语法:exit 或 quit
      • 语法:redis-cli
    • 3.2)Redis 的 Key 的操作命令
      • 语法:keys pattern
      • 语法:exists key [key…]
      • 语法:expire key seconds
      • 语法:ttl key
      • 语法:type key
      • 语法:del key [key…]
    • 3.3) 字符串类型的value操作命令
      • 语法:set key value
      • 语法: get key
      • 语法:incr key
      • 语法:decr key
      • 语法:append key value
      • 语法:strlen key
      • 语法:getrange key start end
      • 语法:setrange key offset value
      • 语法:mset key value [key value…]
      • 语法:mget key [key …]
    • 3.4)哈希类型的value操作命令
      • 语法:hset hash 表的 key field value
      • 语法:hget key field
      • 语法:hmset key field value [field value…]
      • 语法:hmget key field [field…]
      • 语法:hgetall key
      • 语法:hdel key field [field…]
      • 语法:hkeys key
      • 语法:hvals key
      • 语法:hexists key field
    • 3.5)列表list类型的value操作命令
      • 语法:lpush key value [value…]
      • 语法:rpush key value [value…]
      • 语法:lrange key start stop
      • 语法:lindex key index
      • 语法:llen key
      • 语法:lrem key count value
      • 语法:lset key index value
      • 语法:linsert key BEFORE|ALFTER pivot value
    • 3.6)集合类型的value操作命令
      • 语法:sadd key member [member…]
      • 语法:smembers key
      • 语法:sismember key member
      • 语法:scard key
      • 语法:srem key member [member…]
      • 语法:srandmember key [count]
      • 语法:spop key [count]
    • 3.7)有序集合类型的value操作命令
      • 语法:zadd key score member [score member…]
      • 语法:zrange key start stop [WITHSCORES]
      • 语法:zrevrange key start stop [WITHSCORES]
      • 语法:zrem key member [member…]
      • 语法:zcard key
      • 语法:zrangebyscore key min max [WITHSCORES ] [LIMIT offset count]
      • 语法:zrevrangebyscore key max min [WITHSCORES ] [LIMIT offset count]
      • 语法:zcount key min max
  • 第四章、redis事务和watch机制
    • 4.1)redis事务,事务的三大命令
      • 语法:开启事务 multi
      • 语法:执行事务 exec
      • 语法:取消事务 discard
    • 4.2)redis事务的错误和回滚的情况
    • 4.3)watch机制
      • 语法:watch key [key ...]
      • 语法:unwatch
  • 第五章、redis的持久化
    • 5.1)持久化概述
    • 5.2)RDB方式持久化
      • 5.2.1)配置过程
    • 5.3)AOF方式持久化
      • 5.3.1)配置过程
  • 第六章、redis的容灾处理之哨兵机制
    • 6.1)主从复制模式
    • 6.2)Redis 主从复制实现、
    • 6.3)容灾处理之哨兵
    • 6.4)Sentinel 配置

友情提醒:

先看文章目录,大致了解文章知识点结构,点击文章目录可直接跳转到文章指定位置。

第一章、Redis数据库的下载和安装

1.1)nosql数据库和 Redis 介绍

nosql数据库介绍:
解释为 non-relational(非关系型数据库)。在NoSQL 数据库中数据之间是无联系的数据的结构是松散的,可变的。
优势:
大数据量,高性能,灵活的数据模型,高可用,低成本
劣势:
(1)无关系,数据之间是无联系的。
(2)不支持标准的 SQL,没有公认的 NoSQL 标准
(3)没有关系型数据库的约束,大多数也没有索引的概念
(4)没有事务,不能依靠事务实现 ACID.
没有丰富的数据类型(数值,日期,字符,二进制,大文本等)
Redis 介绍:
Remote Dictionary Server(Redis) 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的 Key-Value 数据库. 每种数据类型有自己的专属命令。Key 是字符类型
其值(value)可以是 :
①字符串(String),它能存储任何形式的字符串,包括二进制数据,序列化后的数据,JSON 化的对象甚至是一张图片
在这里插入图片描述
②哈希(Map),是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。value分为field和value
在这里插入图片描述

③列表(list),列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
在这里插入图片描述

④集合(sets) ,是 string 类型的无序集合,集合成员是唯一的,即集合中不能出现重复的数
据.

在这里插入图片描述

⑤有序集合(sorted sets), string 类型元素的集合,不允许重复的成员。不同的是 zset 的每个元素都会关联一个分数(分数可以重复),redis 通过分数来为集合中的成员进行从小到大的排序。
在这里插入图片描述

1.2)Windows中下载安装Redis数据库


①Redis官网没有Windows版本:https://redis.io/

②windows 版本下载:https://github.com/MSOpenTech/redis/releases

③下载的 Redis-x64-3.2.100.zip 解压后即可使用。目录结构:
在这里插入图片描述

④双击 redis-server.exe 启动 Redis

⑤按 ctrl+c 退出 Redis 服务程序


⑥找不到配置文件,可在命令行(cmd)启动:

F:\redis_windows>redis-server.exe redis.windows.conf 

1.3)Linux中安装Redis数据库


①官网下载Linux版本Redis:https://redis.io/

在这里插入图片描述

②使用 Xftp 工具传输 redis-3.2.9.tar 到 linux 系统

Xftp工具下载和使用教程链接

③解压 redis-3.2.9.tar 到 usr/local 目录

tar -zxvf redis-3.2.9.tar.gz -C /usr/local

④在/usr/local/redis-3.2.9目录下使用make命令编译 Redis 文件

cd /usr/local/redis-3.2.9
make

⑤出现错误gcc找不到报错如图:

在这里插入图片描述
解决方式:安装gcc

yum -y install gcc

⑥安装gcc后执行 make distclean命令,出现报错

在这里插入图片描述
解决方式:执行如下命令

make MALLOC=libc

⑦再次执行make,出现如下页面代表成功

在这里插入图片描述
⑧再执行 make install

make install

⑨查看make编译结果

#先进入src目录
cd src
#再ls
ls

在这里插入图片描述

1.4)Linux中启动redis

①前台方式启动Redis 的服务器不能退出当前窗口, 退出窗口,应用终止: src 目录下执行

./redis-server

②后台方式启动Redis 的服务器,src 目录下执行

./redis-server &

③查看redis进程

ps -ef | grep redis

1.5)Linux中关闭redis

①执行 redis-cli shutdown

redis-cli shutdown

②停止redis进程

#这里的4628PID
kill -9 4628

第二章、三种Redis客户端连接Redis数据库

2.1)redis 命令行客户端

①后台方式开启redis

redis-server &

②直接连接 redis (默认 ip127.0.0.1,端口 6379):

redis-cli 

使用ping命令查看redis是否响应回复:PONG

ping

2.2)redis 远程客户端

①下载桌面客户端Redis Desktop Manager不过现在改名叫RESP.app了,而且除了Linux端免费其他的都收费,官网地址:https://redisdesktop.com/

②可直接百度网盘提取免费的旧版本:redis远程客户端文件下载后双击exe文件安装

在这里插入图片描述
③点击next,选择安装目录,点击install即可

在这里插入图片描述
④进入/usr/local/redis-3.2.9安装目录,编辑redis.conf文件

cd /usr/local/redis-3.2.9
vi redis.conf

⑤如下图:将bind注释,将保护模式改为no,保存退出

在这里插入图片描述
⑥关闭redis后,使用配置文件重新启动

#关闭redis
redis-cli shutdown
#以配置文件启动
redis-server redis.conf &

⑦使用远程客户端连接客户端

在这里插入图片描述
⑧界面介绍
在这里插入图片描述

2.3)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.3.1)下载 Jedis 和 Commons-Pool

①浏览器打开:http://search.maven.org/ ,搜索 jedis。在 Download 处,点击 jar下载
在这里插入图片描述
为了避免每次使用 Jedis 对象时都需要重新构建,Jedis 提供了 JedisPool。JedisPool 是基于Commons Pool 2 实现的一个线程安全的连接池。
浏览器打开:http://search.maven.org/ ,搜索 commons-pool2。在 Download 处,点击 jar 下载
在这里插入图片描述

2.3.2)Java 应用使用 Jedis 准备

项目中加入两个jar包:
jedis-2.9.0.jar
commons-pool2-2.4.2.jar
在这里插入图片描述

2.3.3)使用jedis连接池操作数据

①字符串
在这里插入图片描述
② 哈希
jedis连接实例池
在这里插入图片描述
使用连接池操作 hash操作数据
在这里插入图片描述
在这里插入图片描述

③列表 list
在这里插入图片描述

④集合 Set
在这里插入图片描述

⑤有序集合 Sorted Set
在这里插入图片描述
⑥事务
支持部分事务操作
在这里插入图片描述

第三章、Redis 命令大全

3.1)通用命令

①沟通命令,查看状态, 返回 PONG

语法:redis >ping


②查看当前数据库中 key 的数目:

语法:dbsize


③redis默认十六个库,切换库命令:

语法:select db

在这里插入图片描述

④删除当前库的数据:

语法:flushdb


⑤退出当前 redis 连接:

语法:exit 或 quit


⑥登录自带redis 命令行客户端:

语法:redis-cli

3.2)Redis 的 Key 的操作命令


①查看key

语法:keys pattern

通配符: 
* :表示 0-多个字符 ,例如:keys * 查询所有的 key , *表示 0 或多个字符
?:表示单个字符,例如:wo?d , 匹配 word , wood

在这里插入图片描述
②判断 key 是否存在

语法:exists key [key…]

exists key
exists key1 key2...

在这里插入图片描述
③ 设置 key 的生存时间,超过时间,key 自动删除。单位是秒。

语法:expire key seconds

在这里插入图片描述
④以秒为单位,返回 key 的剩余生存时间(ttl: time to live)返回值:
-1 :没有设置 key 的生存时间, key 永不过期。
-2 :key 不存在

语法:ttl key

在这里插入图片描述

⑤查看 key 所存储值的数据类型返回值:字符串表示的数据类型
none (key 不存在)
string (字符串)
list (列表)
set (集合)
zset (有序集)
hash (哈希表)

语法:type key

在这里插入图片描述

⑥删除指定存在的 key ,不存在的 key 忽略。
返回值:数字,删除的 key 的数量。

语法:del key [key…]

在这里插入图片描述

3.3) 字符串类型的value操作命令

①将字符串值 value 设置到 key 中,已经存在的 key 设置新的 value,会覆盖原来的值。

语法:set key value

在这里插入图片描述
②获取 key 中设置的字符串值

语法: get key

在这里插入图片描述

③将 key 中储存的数字值加 1,如果 key 不存在,则 key 的值先被初始化为 0 再执行 incr 操作(只能对数字类型的数据操作)

语法:incr key

在这里插入图片描述

④将 key 中储存的数字值减1,如果 key 不存在,则么 key 的值先被初始化为 0 再执行 decr 操作(只能对数字类型的数据操作)

语法:decr key

在这里插入图片描述

⑤如果 key 存在, 则将 value 追加到 key 原来旧值的末尾如果 key 不存在, 则将 key 设置值为 value
返回值:追加字符串之后的总长度

语法:append key value

在这里插入图片描述

⑥返回 key 所储存的字符串值的长度返回值:
如果key存在,返回字符串值的长度
key不存在,返回0

语法:strlen key

在这里插入图片描述

⑦获取 key 中字符串值从 start 开始 到 end 结束 的子字符串,包括 start 和 end, 负数表示从字符串的末尾开始, -1 表示最后一个字符
返回值:截取的子字符串。

语法:getrange key start end

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

⑧用 value 覆盖(替换)key 的存储的值从 offset 开始,不存在的 key 做空白字符串。
返回值:修改后的字符串的长度

语法:setrange key offset value

在这里插入图片描述
⑨同时设置一个或多个 key-value 对

语法:mset key value [key value…]

在这里插入图片描述

⑩获取(一个或多个)给定 key 的值
返回值:包含所有 key 的列表

语法:mget key [key …]

在这里插入图片描述

3.4)哈希类型的value操作命令

①哈希类型field(域 )和 value 的隐射表,value分为field和value,hset可将key中的值设置为value,如果 key 不存在,则新建 hash 表,执行赋值,如果有 field ,则覆盖值。
返回值:
如果 field 是 hash 表中新 field,且设置值成功,返回 1
如果 field 已经存在,旧值覆盖新值,返回 0

语法:hset hash 表的 key field value

在这里插入图片描述
key键已经存在则覆盖
在这里插入图片描述
②获取哈希表 key 中给定域 field 的值
返回值:field 域的值,如果 key 不存在或者 field 不存在返回 nil

语法:hget key field

在这里插入图片描述
获取不存在的 field,返回nil
在这里插入图片描述

③同时将多个 field-value (域-值)设置到哈希表 key 中,此命令会覆盖已经存在的 field, 若hash 表 key 不存在,创建空的 hash 表,执行 hmset.
返回值:设置成功返回 ok, 如果失败返回一个错误

语法:hmset key field value [field value…]

在这里插入图片描述
key 类型不是 hash,产生错误
在这里插入图片描述
④获取哈希表 key 中一个或多个给定域的值
返回值:返回和 field 顺序对应的值,如果 field 不存在,返回 nil

语法:hmget key field [field…]

在这里插入图片描述

⑤获取哈希表 key 中所有的域和值
返回值:以列表形式返回 hash 中域和域的值 ,key 不存在,返回空 hash

语法:hgetall key

在这里插入图片描述
不存在的 key,返回空列表
在这里插入图片描述
⑥删除哈希表 key 中指定域 field,不存在 field 直接忽略
返回值:成功删除的 field 的数量

语法:hdel key field [field…]

在这里插入图片描述

⑦查看哈希表 key 中的所有 field 域
返回值:包含所有 field 的列表,key 不存在返回空列表

语法:hkeys key

在这里插入图片描述

⑧返回哈希表中所有域的值
返回值:包含哈希表所有域值的列表,key 不存在返回空列表

语法:hvals key

在这里插入图片描述

⑨查看哈希表 key 中,给定域 field 是否存在
返回值:如果 field 存在,返回 1, 其他返回 0

语法:hexists key field

在这里插入图片描述

3.5)列表list类型的value操作命令

①将一个或多个值 value 插入到列表 key 的表头(最左边),从左边开始加入值,从左到右的顺序依次插入到表头,返回值:数字,新列表的长度

语法:lpush key value [value…]

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

②将一个或多个值 value 插入到列表 key 的表尾(最右边),各个 value 值按从左到右的顺序依次插入到表尾
返回值:数字,新列表的长度

语法:rpush key value [value…]

在这里插入图片描述

③获取列表 key 中指定区间内的元素,0 表示列表的第一个元素,start , stop 是列表的下标值, -1 表示列表的最后一个元素, start ,stop 超出列表的范围不会出现错误。
返回值:指定区间的列表

语法:lrange key start stop

在这里插入图片描述
显示列表中第 2 个元素,下标从 0 开始
在这里插入图片描述

④查询获取列表 key 中下标为指定 index 的元素,0 表示列表的第一个元素,start , stop 是列表的下标值, -1 表示列表的最后一个元素,
返回值:指定下标的元素;index 不在列表范围,返回 nil

语法:lindex key index

在这里插入图片描述
在这里插入图片描述
⑤获取列表 key 的长度
返回值:数值,列表的长度; key 不存在返回 0

语法:llen key

在这里插入图片描述
⑥根据参数 count 的值,移除列表中与参数 value 相等的元素, count >0 ,从列表的左侧向右开始移除; count < 0 从列表的尾部开始移除;count = 0 移除表中所有与 value 相等的值。
返回值:数值,移除的元素个数

语法:lrem key count value

在这里插入图片描述
删除列表中所有的指定元素,删除所有的 java
在这里插入图片描述
⑦将列表 key 下标为 index 的元素的值设置为 value。
返回值:设置成功返回 ok ; key 不存在或者 index 超出范围返回错误信息

语法:lset key index value

在这里插入图片描述

⑧将值 value 插入到列表 key 当中位于值 pivot 之前或之后的位置。key 不存在,pivot 不在列表中,不执行任何操作。
返回值:命令执行成功,返回新列表的长度。没有找到 pivot 返回 -1, key 不存在返回 0。

语法:linsert key BEFORE|ALFTER pivot value

修改列表 arch,在值 dao 之前加入 service
在这里插入图片描述
操作不存在的 pivot
在这里插入图片描述

3.6)集合类型的value操作命令

①将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略,不会再加入。
返回值:加入到集合的新元素的个数。不包括被忽略的元素

语法:sadd key member [member…]

在这里插入图片描述

②获取集合 key 中的所有成员元素,不存在的 key 视为空集合

语法:smembers key

在这里插入图片描述

③判断 member 元素是否是集合 key 的成员
返回值:member 是集合成员返回 1,其他返回 0

语法:sismember key member

在这里插入图片描述

④获取集合里面的元素个数
返回值:数字,key 的元素个数。 其他情况返回 0

语法:scard key

在这里插入图片描述

⑤删除集合 key 中的一个或多个 member 元素,不存在的元素被忽略。
返回值:数字,成功删除的元素个数,不包括被忽略的元素。

语法:srem key member [member…]

在这里插入图片描述

⑥只提供 key,随机返回集合中一个元素;提供了 count 时,count 正数, 返回包含 count 个数元素的集合, 集合元素各不相同。count 是负数,返回一个 count 绝对值的长度的集合, 集合中元素可能会重复多次。
返回值:一个元素;多个元素的集合

语法:srandmember key [count]

随机显示集合的一个元素
在这里插入图片描述
使用 count 参数, count 是正数
在这里插入图片描述
使用 count 参数,count 是负数
在这里插入图片描述
⑦随机从集合中删除一个元素, count 是删除的元素个数。
返回值:被删除的元素,key 不存在或空集合返回 nil

语法:spop key [count]

随机从集合删除一个元素
在这里插入图片描述
随机删除指定个数的元素
在这里插入图片描述

3.7)有序集合类型的value操作命令

①将一个或多个 member 元素及其 score 值加入到有序集合 key 中,如果 member 存在集合中,则更新值;score 可以是整数或浮点数
返回值:数字,新添加的元素个数

语法:zadd key score member [score member…]

创建保存学生成绩的集合:studentscore
在这里插入图片描述
使用浮点数作为 score
在这里插入图片描述

②查询有序集合指定区间内的元素。集合成员按 score 值从小到大来排序。 start, stop 都是从 0 开始。0 是第一个元素,1 是第二个元素。以 -1 表示最后一个成员,-2 表示倒数第二个成员。使用WITHSCORES 选项让 score 和 value 一同返回。
返回值:自定区间的成员集合

语法:zrange key start stop [WITHSCORES]

显示集合的全部元素,不使用 WITHSCORES 则不显示 score
在这里插入图片描述
显示集合全部元素,并使用 WITHSCORES
在这里插入图片描述
显示0,1 二个成员
在这里插入图片描述
排序显示浮点数的 score
在这里插入图片描述
③返回有序集 key 中,指定区间内的成员。其中成员的位置按 score 值递减(从大到小) 来排列。其它同 zrange 命令。
返回值:自定区间的成员集合

语法:zrevrange key start stop [WITHSCORES]

在这里插入图片描述
④删除有序集合 key 中的一个或多个成员,不存在的成员被忽略
返回值:被成功删除的成员数量,不包括被忽略的成员。

语法:zrem key member [member…]

在这里插入图片描述

⑤获取有序集 key 的元素成员的个数返回值:key 存在返回集合元素的个数, key 不存在,返回 0

语法:zcard key

在这里插入图片描述

⑥获取有序集 key 中,所有 score 值介于 min 和 max 之间(包括 min 和 max)的成员,有序成员是按递增(从小到大)排序。
min ,max 是包括在内 , 使用符号 ( 表示不包括。 min , max 可以使用 -inf ,
+inf 表示最小和最大 limit 用来限制返回结果的数量和区间。 withscores 显示 score 和 value
返回值:指定区间的集合数据使用的准备数据

语法:zrangebyscore key min max [WITHSCORES ] [LIMIT offset count]

在这里插入图片描述

在这里插入图片描述
显示指定具体区间的集合数据,开区间(不包括 min,max)
在这里插入图片描述
显示整个集合的所有数据
在这里插入图片描述
使用 limit 增加新的数据
在这里插入图片描述
在这里插入图片描述
⑦返回有序集 key 中, score 值介于 max 和 min 之间(默认包括等于 max 或 min )的所有的成员。有序集成员按 score 值递减(从大到小)的次序排列。其他同 zrangebyscore

语法:zrevrangebyscore key max min [WITHSCORES ] [LIMIT offset count]

在这里插入图片描述

⑧返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max ) 的成员的数量

语法:zcount key min max

工资在 3000-5000 的员工数量
在这里插入图片描述

第四章、redis事务和watch机制

4.1)redis事务,事务的三大命令

什么是redis事务
Redis 中的事务(transaction)是一个单独隔离的操作,保证两个或两个以上的命令集合按需排队并顺序执行,中间不会被任何其他操作打断。
redis事务其实是指运用事务的思想实现一组集合命令的执行,没有回滚的概念,严格意义上没有事务。

①multi - setAutoCommoit(false)-事务开启

语法:开启事务 multi

作用:标记一个事务的开始。通过multi,后续的命令都会按照先后顺序被放进一个队列当中。当用户键入exec后,这些指令都会按顺序执行。
返回值:总是返回 ok

②exec -执行

语法:执行事务 exec

作用:执行所有事务块内的命令
返回值:事务内的所有执行语句内容,事务被打断(影响)返回 nil


③discard -取消

语法:取消事务 discard

作用:取消事务,如果开启multi后输入若干命令,再键入discard,则之前的命令令通通取消执行。
返回值:总是返回 ok

# 开启事务
127.0.0.1:6379> MULTI
OK
# 输入两个或者两个以上命令
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
# 执行命令
127.0.0.1:6379(TX)> EXEC
1) OK
2) OK
127.0.0.1:6379> keys *
1) "k1"
2) "k2"

4.2)redis事务的错误和回滚的情况


①组队时出错,错误对于redis来说是已知的,事务中的所有指令都会失效。
在这里插入图片描述

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> set k33
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379(TX)> set k4 v4
QUEUED
127.0.0.1:6379(TX)> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> keys *
(empty array)


②运行时出错:因为错误是未知的,所以redis必须执行时才能知道错误,而redis无错误回滚机制,会继续执行后续指令并有效。
在这里插入图片描述

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> INCR k1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> EXEC
1) OK
2) (error) ERR value is not an integer or out of range
3) OK
127.0.0.1:6379> keys *
1) "k1"
2) "k2"
127.0.0.1:6379>

4.3)watch机制

①watch 监视某个或者某几个key的值,如果有 key 的 value 值在事务 EXEC 执行之前被修改了,那么事务将被打断。
返回值:总是返回 ok

语法:watch key [key …]


②取消 WATCH 命令对所有 key 的监视。如果在执行 WATCH 命令之后, EXEC 命令或 DISCARD 命令先被执行了的话,那么就不需要再执行 UNWATCH 了
返回值:总是返回 ok

语法:unwatch


③例子
启动服务器redis-server , 再开启两个客户端连接。 分别叫 A 客户端 (红色)和 B 客户端(黄色)。
在这里插入图片描述
在这里插入图片描述
1)在 A 客户端设置 key : str.lp 登录人数为 10
2)在 A 客户端监视 key : str.lp
3)在 A 客户端开启事务 multi
4)在 A 客户端修改 str.lp 的值为 11
5)在 B 客户端修改 str.lp 的值为 15
6)在 A 客户端执行事务 exec
7)在 A 客户端查看 str.lp 值,A 客户端执行的事务没有提交,因为 WATCH 的 str.lp 的值已经被修改了, 所以放弃了事务。
在这里插入图片描述

第五章、redis的持久化

5.1)持久化概述

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

②为解决这个问题,redis提供了两种持久化的方式,便于发生故障后能迅速恢复数据,分别是RDB(Redis DataBase)和AOF(Append Only File)。

③两种方式也可以同时使用,优先采用AOF方式来进行数据恢复,因为AOF方式的数据恢复完整度更高。

5.2)RDB方式持久化

①就是在指定的时间点内将内存中的数据集快照写入磁盘,数据恢复时将快照文件直接再读到内存。

②RDB 技术非常适合做备份,可以保存最近一个小时,一天,一个月的全部数据。保存数据是在单独的进程中写文件,不影响 Redis 的正常使用。RDB 恢复数据时比其他 AOF 速度快。

③RDB缺点:即使每5分钟都持久化一次,当redis故障时,仍然会有近5分钟的数据丢失。

5.2.1)配置过程

在配置文件 redis.conf 中搜索 SNAPSHOTTING, 查找在注释开始和结束之间的关于 RDB 的配置说明。配置地方有三处。

①: 配置执行 RDB 生成快照文件的时间策略。 让它在“ N 秒内数据集至少有 M 个 key 改动”
这一条件被满足时,自动保存一次数据集。 配置格式:save  <seconds>  <changes>
save 900 1
save 300 10 
save 60 10000 ②: dbfilename:设置 RDB 的文件名,默认文件名为 dump.rdb 
③: dir:指定 RDB 文件的存储位置,默认是 ./ 当前目录 

配置步骤:
①:查看 ps -ef | grep redis ,如果 redis 服务启动,先停止。
在这里插入图片描述
②:修改 redis.conf 文件, 修改前先备份,执行 cp redis.conf bak_redis.conf
在这里插入图片描述
查看默认启用的 RDB 文件
在这里插入图片描述
③:编辑 redis.conf 增加 save 配置, 修改文件名等。vim redis.conf
在这里插入图片描述
修改的内容:
在这里插入图片描述
在这里插入图片描述
把原来的默认的 dump.rdb 删除,修改 redis.conf 后,重新启动 redis
④:在 20 秒内,修改三个 key 的值

在这里插入图片描述
⑤:查看生成的 rdb 文件

在这里插入图片描述

5.3)AOF方式持久化

①Redis 每次接收到一条改变数据的命令时,它将把该命令写到一个 AOF 文件中(只记录写操作,读操作不记录),当 Redis 重启时,它通过执行 AOF 文件中所有的命令来恢复数据。

②在同样数据规模时,AOF文件要比RDB文件的体积大。恢复速度要慢于RDB方式。

③Redis 支持在不影响服务的前提下在后台重构 AOF 文件,让文件得以整理变小。比如:做一百次加法计算,最后你只会在数据库里面得到最终的数值,但是在你的 AOF 里面会存在 100 次记录,其中有99 条记录对最终的结果是无用的会被整理掉;

5.3.1)配置过程

AOF 方式的数据持久化,仅需在 redis.conf 文件中配置即可配置项:
①:停止运行的 redis , 备份要修改的 redis.conf
②:查看 redis 安装目录/src 下有无 .aof 文件。 默认是在 redis 的当前目录
在这里插入图片描述

③:编辑 redis.conf, appendonly默认是 no,改成 yes 即开启了 aof 持久化 , 查看 appendfilname 的文件名称是appendonly.aof
在这里插入图片描述
④:appendfsync:配置向 aof 文件写命令数据的策略:
no:不主动进行同步操作,而是完全交由操作系统来做(即每 30 秒一次),比较快但不是很安全。
always:每次执行写入都会执行同步,慢一些但是比较安全。
everysec:每秒执行一次同步操作,比较平衡,介于速度和安全之间。这是默认项。
在这里插入图片描述
⑤:dir : 指定 RDB 和 AOF 文件存放的目录,默认是 ./

⑥:auto-aof-rewrite-min-size:允许重写的最小 AOF 文件大小,默认是 64M 。当 aof 文件大于 64M 时,开始整理 aof文件, 去掉无用的操作命令。缩小 aof 文件。

⑦测试:在 redis 客户端执行 写入命令
在这里插入图片描述
查看 aof 文件
在这里插入图片描述
在这里插入图片描述

第六章、redis的容灾处理之哨兵机制

6.1)主从复制模式

①单点故障:数据存储在一台服务器上,服务器出现故障就会导致数据丢失。所以我们需要将数据复制多份部署在多台不同的服务器上,在配置文件中指定这几台 redis 之间的主从关系。

②主从复制:多台 redis 服务器的数据同步功能,主服务器(master)负责写入数据,同时把写入的数据实时同步到从(slave )机器,从服务器负责读

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

6.2)Redis 主从复制实现、

修改配置文件,启动时,服务器读取配置文件,并自动成为指定服务器的从服务器,从而构成主从复制的关系
①如果 Redis 启动,先停止,模拟多 Reids 服务器,从原有的 redis.conf 配置文件中拷贝三份,分别命名为 redis6380.conf, redis6382.conf , redis6384.conf
在这里插入图片描述
②编辑作为 Master 的配置文件 redis6380.conf : 在空文件加入如下内容

#包含原来的配置文件内容。/usr/local/redis-3.2.9/redis.conf 按照自己的目录设置。
include /usr/local/redis-3.2.9/redis.conf daemonize yes port 6380 
pidfile /var/run/redis_6380.pid 
logfile 6380.log 
dbfilename dump6380.rdb 

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

#①:redis6382.conf中加入: 
include /usr/local/redis-3.2.9/redis.conf daemonize yes port 6382 
pidfile /var/run/redis_6382.pid 
logfile 6382.log 
dbfilename dump6382.rdb 
slaveof 127.0.0.1 6380 
#②:redis6384.conf中加入: 
include /usr/local/redis-3.2.9/redis.conf daemonize yes port 6384 
pidfile /var/run/redis_6384.pid 
logfile 6384.log 
bfilename dump6384.rdb 
slaveof 127.0.0.1 6380 

配置项说明: slaveof : 表示当前 Redis 是谁的从。当前是 127.0.0.1 端口 6380 这个 Master 的从服务器。

④使用配置文件方式启动redis,并查看启动进程
在这里插入图片描述
⑤使用指定端口连接 Redis 服务器,查看配置后的服务信息

./redis-cli -p 端口

在这里插入图片描述
查看6380端口的服务器信息

info replication 

在这里插入图片描述
在新的 Xshell 窗口分别登录到 6382 ,6384 查看信息
在这里插入图片描述
⑥向 Master 写入数据,先执行 flushall 清除数据,避免干扰到测试数据。 生产环境谨慎使用。
在这里插入图片描述
⑦在从服务器 Slave 读数据,可以读主 Master 的数据,不能写
在这里插入图片描述
Slave 写数据失败
在这里插入图片描述

6.3)容灾处理之哨兵

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

Sentinel 系统有三个主要任务:
监控:Sentinel 不断的检查主服务和从服务器是否按照预期正常工作。
提醒:被监控的 Redis 出现问题时,Sentinel 会通知管理员或其他应用程序。
自动故障转移:监控的主 Redis 不能正常工作,Sentinel 会开始进行故障迁移操作。将一个从服务器升级新的主服务器。 让其他从服务器挂到新的主服务器。同时向客户端提供新的主服务器地址。
在这里插入图片描述

6.4)Sentinel 配置

①复制三份sentinel.conf文件
在这里插入图片描述
Sentinel系统默认 port 是26379 。三个配置port分别设置为 26380 , 26382 , 26384 。三个文件分别命名:
sentinel26380.conf
sentinel26382.conf
sentinel26384.conf
执行复制命令 cp sentinel.conf xxx.conf
在这里插入图片描述
②三份 sentinel 配置文件修改
sentinel26380.conf
1、修改 port
在这里插入图片描述
2、修改监控的 master 地址 6382
在这里插入图片描述
sentinel26382.conf 文件同样修改
port 26382
master的port :6382
sentinel26384.conf 文件同样修改
port 26384
master的port :6382

③启动主从(Master/Slave)Redis
启动 Reids
在这里插入图片描述
查看 Master 的配置信息连接到 6382 端口
在这里插入图片描述
使用 info 命令查看 Master/Slave
在这里插入图片描述
④启动 Sentinel模式下的Redis服务实例

在 XShell 开启三个窗口分别执行命令,将创建三个监视主服务器的Sentinel实例:
./redis-sentinel …/sentinel26380.conf
./redis-sentinel …/sentinel26382.conf
./redis-sentinel …/sentinel26384.conf
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
⑤让主 Redis 不能工作

让 Master 的 Redis 停止服务, 先执行 info replication 确认 Master 的 Redis 后再执行 shutdown

在这里插入图片描述
查看当前 Redis 的进程情况

在这里插入图片描述
⑥Sentinel 的起作用

在 Master 执行 shutdown 后, 稍微等一会 Sentinel 要进行投票计算,从可用的 Slave
选举新的 Master。查看 Sentinel 日志。
在这里插入图片描述
查看新的 Master
在这里插入图片描述
查看原 Slave 的变化

在这里插入图片描述
⑦新的 Redis 加入 Sentinel 系统,自动加入 Master

重新启动 6382
在这里插入图片描述
查看 6384 的信息
在这里插入图片描述
测试数据:在 Master 写入数据
在这里插入图片描述
在 6382 上读取数据,不能写入
在这里插入图片描述

⑧监控
1)Sentinel 会不断检查 Master 和 Slave 是否正常
2)如果 Sentinel 挂了,就无法监控,所以需要多个哨兵,组成 Sentinel 网络,一个健康的
Sentinel 至少有 3 个 Sentinel 应用。 彼此在独立的物理机器或虚拟机。
3)监控同一个 Master 的 Sentinel 会自动连接,组成一个分布式的 Sentinel 网络,互相通信并交换彼此关于被监控服务器的信息
4)当一个 Sentinel 认为被监控的服务器已经下线时,它会向网络中的其它 Sentinel 进行确认,判断该服务器是否真的已经下线
5)如果下线的服务器为主服务器,那么 Sentinel 网络将对下线主服务器进行自动故障转移,通过将下线主服务器的某个从服务器提升为新的主服务器,并让其从服务器转移到新的主服务器下,以此来让系统重新回到正常状态
6)下线的旧主服务器重新上线,Sentinel 会让它成为从,挂到新的主服务器下

这篇关于Redis基础命令和事务,redis持久化和主从复制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1126887

相关文章

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

30常用 Maven 命令

Maven 是一个强大的项目管理和构建工具,它广泛用于 Java 项目的依赖管理、构建流程和插件集成。Maven 的命令行工具提供了大量的命令来帮助开发人员管理项目的生命周期、依赖和插件。以下是 常用 Maven 命令的使用场景及其详细解释。 1. mvn clean 使用场景:清理项目的生成目录,通常用于删除项目中自动生成的文件(如 target/ 目录)。共性规律:清理操作

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

C 语言基础之数组

文章目录 什么是数组数组变量的声明多维数组 什么是数组 数组,顾名思义,就是一组数。 假如班上有 30 个同学,让你编程统计每个人的分数,求最高分、最低分、平均分等。如果不知道数组,你只能这样写代码: int ZhangSan_score = 95;int LiSi_score = 90;......int LiuDong_score = 100;int Zhou

MySql 事务练习

事务(transaction) -- 事务 transaction-- 事务是一组操作的集合,是一个不可分割的工作单位,事务会将所有的操作作为一个整体一起向系统提交或撤销请求-- 事务的操作要么同时成功,要么同时失败-- MySql的事务默认是自动提交的,当执行一个DML语句,MySql会立即自动隐式提交事务-- 常见案例:银行转账-- 逻辑:A给B转账1000:1.查询

利用命令模式构建高效的手游后端架构

在现代手游开发中,后端架构的设计对于支持高并发、快速迭代和复杂游戏逻辑至关重要。命令模式作为一种行为设计模式,可以有效地解耦请求的发起者与接收者,提升系统的可维护性和扩展性。本文将深入探讨如何利用命令模式构建一个强大且灵活的手游后端架构。 1. 命令模式的概念与优势 命令模式通过将请求封装为对象,使得请求的发起者和接收者之间的耦合度降低。这种模式的主要优势包括: 解耦请求发起者与处理者

linux 判断某个命令是否安装

linux 判断某个命令是否安装 if ! [ -x "$(command -v git)" ]; thenecho 'Error: git is not installed.' >&2exit 1fi

jenkins 插件执行shell命令时,提示“Command not found”处理方法

首先提示找不到“Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具执行shell命令是可以执行。奇怪的就是通过jenkinsSSH插件无法执行,经一番折腾各种搜索发现是jenkins没有加载/etc/profile导致。 【解决办法】: 需要在jenkins调用shell脚