redis高级操作

一redis事物操作
1.之前我们提到过redis支持简单的事物
2、Redis与 mysql事务的对比
在这里插入图片描述
redis的事务,在用multi开启之后,之后输入的所有命令,其实都是将其添加到一个执行队列中,当使用exec这个命令时,这个队列中的命令就会按顺序执行,使用discard这个命令式,这个队列就会被清空。

注: rollback与discard 作用:
discard和rollback都可以做到回滚。但是dicard其实就是将开启事物后的队列里面的命令清空。rollback是真正的回滚,就是回到开启事务之前的状态。

3、在mutil后面的语句中, 语句出错可能有2种情况
(1)语法就有问题,此时,在输入命令时,就会报错。–直接会回滚。
(2)语法本身没错,但适用对象有问题. 比如 zadd 操作list对象,这个命令也会被加入队列。exec之后,出错的那个命令之前的命令是会被执行的
换句话说就是相当于只要关于事务的所有命令中出现任何语法错误,在exec时都会回滚,所有命令都不会

4、乐观锁
思考:我正在买票,Ticket = 1, money =100,而票只有1张, 如果在我multi之后,和exec之前, 票被别人买了—即ticket变成0了。我该如何观察这种情景,并不再提交。
悲观的想法:
世界充满危险,肯定有人和我抢, 给 ticket上锁, 只有我能操作. [悲观锁]
乐观的想法:
没有那么人和我抢,因此,我只需要注意,有没有人更改ticket的值就可以了 [乐观锁]
Redis的事务中,启用的是乐观锁,只负责监测key没有被改动
具体的命令---- watch命令
步骤:
创建ticket和money 字符串,分别是1和100
打开两个客户端:一个客户端执行上述代码,另一个客户端在exec之前,更改一下ticket的值。

watch key1 key2 … keyN
作用:监听key1 key2…keyN有没有变化,如果有变, 则事务取消
unwatch
作用: 取消所有watch监听

二消息订阅
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
Redis 客户端可以订阅任意数量的频道。
下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系
在这里插入图片描述
当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端。
在这里插入图片描述

 客户端例子:
redis 127.0.0.1:6379> subscribe news
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news"
3) (integer) 1
1) "message"
2) "news"
3) "good good study"
1) "message"
2) "news"
3) "day day up"
 
服务端例子:
redis 127.0.0.1:6379> publish news 'good good study'
(integer) 1
redis 127.0.0.1:6379> publish news 'day day up'
(integer) 1

三.redis持久化配置
我们知道redis是运行在内存上的数据库读写速度非常快,可是为什么我们每次关闭电脑在打开电脑数据都没有丢失呢??
redis启动之后,就从硬盘上将所有数据读出来,加载到内存中去
持久化就是讲数据保存到硬盘上
序列化就是将对象保存到硬盘上
redis持久化是通过两种方式来完成的:
第一种是rdb快照
在这里插入图片描述
综上所述 redis数据都保存到内存上,当数据在内存上的数据满足一定条件时,就会拍摄快照将快照中的数据保存到快照文件中也就是硬盘中的dump.rdb文件(保存数据)这样就做到持久化到硬盘的操作
那么拍摄快照的条件呢?都在配置文件中写入 默认开启快照选项满足条件就拍摄快照
快照的内容是整个数据库的数据 所以第二次拍摄快照时就会将第一次快照的数据覆盖掉
Rdb快照的配置选项:
save 900 1 // 900内,有1条写入,则产生快照
save 300 1000 // 如果300秒内有1000次写入,则产生快照
save 60 10000 // 如果60秒内有10000次写入,则产生快照
(这3个选项都屏蔽,则rdb禁用)
dbf有个弊端就是如果在拍摄快照的0.几秒的时间,再次满足拍摄快照的条件,而拍摄快照的工具就一组那么在这缝隙中没记录到的数据应该怎么办这时就引入第二种持久化机制

第二种aof日志
aof就是一种通过日志记录的方式来保存数据
日志记录的都是什么呢
我们知道,向数据库里添加数据都是通过命令得来的所有想要保存数据,保存命令就可以了吧
将命令执行一遍我们想要的数据就得到了
所以aof目的:就是记录当前redis中的数据中的状态就ok了

在这里插入图片描述
开启aof的配置也是在配置文件中满足条件就会记录下操作命令追加到保存在硬盘上的aof日志文件(保存命令)得到数据执行命令即可
Aof 在配置文件中的配置条件:
appendonly no # 是否打开 aof日志功能**(系统默认是关闭状态的)**
appendfsync always # 每1个命令,都立即同步到aof. 安全,速度慢
appendfsync everysec # 折衷方案,每秒写1次 默认是以这种方式追加命令
appendfsync no # 写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到 aof. 同步频率低,速度快。
no-appendfsync-on-rewrite yes: # 正在导出rdb快照的过程中,要不要停止同步aof
auto-aof-rewrite-percentage 100 #aof文件大小比起上次重写时的大小,增长率100%时,重写
auto-aof-rewrite-min-size 64mb #aof文件,至少超过64M时,重写
重写操作是指:有些命令比如一些删除操作这时候光记录命令可是数据都没有了就会很浪费 所以有了重写这个方式
aof重写:将redis中的数据逆化成命令,重新写入aof日志的过程
aof重写的目的就是不让aof日志文件无线增长

no-appendfsync-on-rewrite yes: # 正在导出rdb快照的过程中,要不要停止同步aof
在这里插入图片描述
为了保证数据的安全性开启rdb的同时开启aof 我们知道拍摄快照的时候rdb是无法记录数据的那为了保持数据的一致性呢拍摄快照的同时会停止aof这期间产生的数据全部放到缓存队列里等拍摄快照结束后再执行

两种持久化机制的比较:
在这里插入图片描述
四.redis持久化相关的问题(面试常考)
1、在dump rdb过程中,aof如果停止同步,会不会丢失数据?
答: 不会,所有的操作缓存在内存的队列里, dump完成后,统一操作.

2、aof重写是指什么?
答: aof重写是指把内存中的数据,逆化成命令,写入到.aof日志里。题。以解决 aof日志过大的问。

3、如果rdb文件,和aof文件都存在,优先用谁来恢复数据?
答: 在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件完整。

4、 2种是否可以同时用?
答: 可以,而且推荐这么做

5、恢复时rdb和aof哪个恢复的快
答: rdb快,因为其是数据的内存映射,直接载入到内存,而aof是命令,需要逐条执行

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值