Redis高级篇

发布于:2024-07-06 ⋅ 阅读:(45) ⋅ 点赞:(0)

传送门

SpringMVC的源码解析(精品)
Spring6的源码解析(精品)
SpringBoot3框架(精品)
MyBatis框架(精品)
MyBatis-Plus
SpringDataJPA
SpringCloudNetflix
SpringCloudAlibaba(精品)
Shiro
SpringSecurity
java的LOG日志框架
Activiti(敬请期待)
JDK8新特性
JDK9新特性
JDK10新特性
JDK11新特性
JDK12新特性
JDK13新特性
JDK14新特性
JDK15新特性
JDK16新特性
JDK17新特性
JDK18新特性
JDK19新特性
JDK20新特性
JDK21新特性
其他技术文章传送门入口

前言

本文深入了解Redis的事务和一些相关文件的属性。

下面文章不定期更新:
Redis入门篇(精品)
Redis命令篇(精品)
Redis高级篇(精品)
Redis集群篇(精品)
Redis面试篇(精品)

一、事务

Redis 提供了事务(Transaction)机制,允许一组命令作为一个原子操作进行执行,保证这些命令要么全部执行成功,要么全部不执行,从而保证数据的一致性。以下是 Redis 中事务相关的命令和使用方法:

开启事务

1、MULTI

  • 开启一个事务,标记事务的开始。

执行事务中的命令

2、command

  • 在 MULTI 和 EXEC 之间,可以依次执行多个命令,这些命令将会被放入事务队列中。

提交事务

3、EXEC

  • 执行事务中的所有命令,如果在 MULTI 和 EXEC之间出现错误,则事务中所有命令不会执行,执行结果是一个数组,包含每个命令的执行结果。

取消事务

4、DISCARD

  • 取消事务,清除事务队列中的所有命令,恢复到非事务模式。

监视键(乐观锁控制)

5、WATCH key [key …]

  • 监视一个或多个键,如果在执行 EXEC 命令前,有其他客户端修改了被监视的键,则事务不会执行,用于乐观锁的实现。

事务示例
在 Redis 中,事务的使用方式如下:

MULTI            // 开启事务
SET key1 value1  // 添加命令到事务队列
SET key2 value2  // 添加命令到事务队列
GET key1         // 添加命令到事务队列
EXEC             // 执行事务

如果在 MULTI 和 EXEC 之间发生错误(如语法错误、运行时错误等),则整个事务将不会执行,事务中的命令不会对数据库产生影响。

事务的注意事项

  • Redis 的事务是原子性的,但不支持回滚(Rollback)操作。
  • 如果在 EXEC 执行前监视的键发生了变化,事务将不会执行,可以通过 WATCH 命令来实现乐观锁的控制。
  • Redis 的事务不支持隔离级别(例如 SQL 数据库中的事务隔离级别)。

应用场景

  • 批量写入操作,例如批量设置多个键值对。
  • 需要保证一组操作的原子性,例如转账操作中的扣款和存款。
  • 提高性能,减少客户端和服务器之间的通信次数,将多个命令打包成一个事务一次性发送。

Redis 的事务机制通过保证一系列命令的原子性,帮助开发者处理复杂的操作,确保数据的一致性和完整性。

铁哥总结事务:
Redis单条命令保证原子性但是事务不保证原子性,也没有隔离级别。事务的本质是一组命令的集合,一次性集合,一个事务中的所有命令会被序列化,按照顺序执行。一次性,顺序性,排他性。
1.开启事务(multi)
2.命令入队(其他命令,命令一条一条的进QUEUED队列,而且每一条并没有执行)
3.执行事务(exec)(执行的时候按照顺序把队列中的命令一条一条执行)
Redis开启事务后,一组命令中有一条不对(写命令的时候就提示出错误来了,但是后面命令可以输入继续写,错的命令和准确的命令都会入队列),最后exec执行的时候报错了,所有命令全部是失败的(类比java编译时错误);Redis开启事务后,一组命令  看起来都是对的,但是存在逻辑错误,比如空的值加1,1/0这种,执行的时候报错了,正常命令是可以执行的,只有错误命令抛出异常,所以Redis没有原子性(类比java的运行时异常)
Discard可以放弃事务,在没有exec的话,放弃事务,相当于所有命令没有执行

Redis支持乐观锁 watch,比如命令 watch  money 会监控money这个变量,线程1开启事务正常操作money,还没有执行事务的时候,线程2插队修改了money的值,这个时候线程1再执行事务就会失败;执行失败的时候先unwatch命令解锁,然后再watch xxx加锁


Jedis:
Redis官方推荐的java连接开发工具,使用java操作的Redis中间件,类似jdbc操作数据库;里面所有的api都是原生命令的形式。
SpringBoot集成:
在SpringBoot2.x之后,原来的Jedis被替换为了Lettuce,Jedis采用的直连,多个线程操作的话,是不安全的,如果要避免不安全的,使用Jedis Pool连接池,像BIO模式;Lettuce采取了netty策略,实例可以在多个线程中进行共享,不存在线程不安全的情况,可以减少线程数据,更像NIO模式。
Redis使用的时候,默认redisTemplate会存在乱码的可能,并且传入的对象需要序列化,不序列化会报错,传入json是可以的。

二、配置文件Redis.config

Redis配置文件(Redis.config):
1.配置文件中unit单位对大小写不敏感,1GB,1gB,1gb都一样;
2.包含其他配置文件,类似Spring的import
3.网络,bind 127.0.0.1 绑定的ip;port 6379 端口设置;
4.通用,daemonize yes 默认是no,我们设置为守护进程的方式进行,改为yes,不然退出就不运行了;pidfile /var/run/redis_6379.pid 如果以守护进程方式运行,我们就需要制定一个pid文件;loglevel notice  日志级别;databases 16 默认16个数据库;
5.快照,持久化,在规定的时间内,执行多少次操作,就会持久化到文件.rdb   .aof
save 900 1   在900秒内,如果至少有一个key进行修改,就进行持久化文件操作
save 300 10  在300秒内,如果至少有10个key进行修改,就进行持久化文件操作
save 60 10000  在60秒内,如果至少有10000个key进行修改,就进行持久化文件操作
stop-writes-on-bgsave-error yes # 持久化如果出错,是否还需要继续工作
rdbcompression yes # 是否压缩rdb文件,需要消耗一些cpu资源
rdbchecksum yes # 保存rdb文件,进行错误的检查校验
6.REPLICATION复制,主从复制
# slaveof <masterip> <masterport>   这个改成  slaveof  127.0.0.1  6379 (具体的改成以具体主机的ip地址和端口),改后这台就是从机
7.SECURITY安全,可以设置密码等,默认没有密码  # requirepass foobared  这一行前面有个#表示没有密码  增加一行  requirepass 123456表示密码为123456 
8.LIMITS限制客户端  默认都没什么设置的,# maxclients 10000  这种同上操作,可以设置客户端连接的最大数量;# maxmemory <bytes> redis配置的最大内存容量;# maxmemory-policy noeviction 内存到达上限之后的处理策略(移除一些过期的key,或者报错等等)该行下面有具体的策略;
9.APPEND ONLY MODE  aof的配置,appendonly no  默认不开启aof模式,默认使用rdb方式持久化,大部分情况下rdb够用了;appendfilename "appendonly.aof" 持久化文件的名字;
# appendfsync always    # 每次修改都会同步,消耗性能
appendfsync everysec   # 每秒执行一次同步,但是可能会丢失1秒的数据
# appendfsync no         #每次都不同步,操作系统自己执行同步,速度最快

设置密码
在这里插入图片描述

三、RDB和AOF

1、RDB:

指定间隔内将内存数据快照写入磁盘,它恢复时是将快照文件直接读到内存里面。在主从复制中,rdb就是备份了在从机上面。

触发机制:
1.save的规则满足的情况下回自动触发rdb规则;
2.执行flushall命令,也会触发我们的rdb规则;
3.退出redis,也会产生rdb文件(dump.rdb)

恢复rdb文件:
1.rdb文件放在redis启动目录下即可,redis启动会自动检查dump.rdb恢复其中的数据
2.查看当前位置 config get dir 显示/usr/local/bin 这个位置存在dump.rdb文件的话,启动就会恢复其中数据

优点:适合大规模的数据恢复;对数据的完整性要求不高
缺点:一定时间间隔宕机,最后一次修改的数据就没了,fork进程占用资源
一般这边配置不需要改,默认配置就可以了

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

2、AOF:

将我们所有的写命令都记录下来(读命令不记录),history(只许追加文件,不可修改文件,在达到64MB的时候才会重写文件而不是 追加了),恢复的时候把这些命令再执行一遍;
优点:每一次修改都同步,文件的完整性会更好,设置中的默认的每秒同步一次,可能会丢失一秒的数据,另一种设置从不同步效率最高。
缺点:就数据文件来说,aof远大于rdb,修复速度也比rdb慢,aof运行效率也比rdb慢;

同时开启rdb和aof,恢复的时候会先加载aof文件(这个完整性更好)

在这里插入图片描述

四、Redis发布订阅

使用场景:
实时聊天、订阅关注、实时消息
稍微复杂的使用MQ来做

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


网站公告

今日签到

点亮在社区的每一天
去签到