首页 > 数据库 >Redis事务和持久化

Redis事务和持久化

时间:2023-10-09 23:16:39浏览次数:45  
标签:AOF 事务 缓存 持久 Redis 查询 命令

Redis事务处理流程

  • Redis服务器接受客户端命令

  • 检查客户端是否处于事务状态

    • 是,则将命令放入事务队列中

      • 向客户端返回QUEUED字符串(表示命令已入事务列队)

    • 否,则直接执行命令

      • 向客户端返回命令执行结果

Redis事务错误

  • 调用EXEC之前的错误 (语法错误/事务回滚)

    • 有可能是由于语法有误导致,也可能是由于内存不足导致

    • 只要出现某个命令无法成功写入缓冲队列的情况,redis 都会进行记录,在客户端调用EXEC 时,redis 会拒绝执行这一事务

  • 调用EXEC之后的错误(数据类型错误/事务不回滚)

    • redis 不会理睬这些错误,而是继续向下执行事务中的其他命令

    • 对于应用层面的错误,并不是 redis 自身需要考虑和处理的问题,所以一个事务中如果某一条命令执行失败,并不会影响接下来的其他命令的执行

watch命令使用

Redis事务中watch命令的作用是监视key是否被改动(可同时监视多个key)

  • 如果 watch 监视的 key 在执行事务 exec 命令之前没有被改动,则 watch 命令不做任何操作,事务可以正常执行

  • 如果 watch 监视的 key 在执行事务 exec 命令之前有被改动过,则在执行事务 exec命令时就会返回 nil,事务无法执行

可以利用 watch 命令实现类似于数据库“乐观锁”的效果

Redis缓存系统常见问题及解决方案

缓存穿透问题

  • 什么是缓存穿透

    当用户在 Redis 缓存系统执行一条无效查询时,这条无效查询将穿透 Redis 缓存系统并MySQL 数据库请求数据,而 MySQL 数据库也获取不到数据

 

 

解决方案1>

缓存空对象

用户查询Redis缓存和MySQL数据库中都不存在的数据时,MySQL会返回一个空对象。并将这个空对象和用户请求关联起来存到 Redis 缓存中;当存在相同用户请求,这时 Redis 缓存就会命中,就直接从缓存中返回这个空对象,这样可以减少访问数据库的压力,提高当前数据库的访问性能。

  • 优点

    • 机制原理和实现比较简单

    • 代码修改维护容易

  • 缺点

    • 会带之Redis缓存中产生大量空对象

    • 会占用许多内存控件

    • 会浪费许多资源(可设置缓存空对象过期时间)

解决方案2>

布隆过滤器

的底层是一种基于概率的数据结构,主要使用来判断当前某个元素是否在该集合中,运行速度快。但布隆过滤器不是绝对精确,只要参数设置的合理,它的精确度可以控制的一个期望精确值

  • 解决方案

    采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的二进制 bitmap 中,一个一定不存在的数据会被这个 bitmap拦截掉,从而避免了对底层数据库的查询压力

布隆过滤器在空间效率和查询效率都非常高

缓存击穿

缓存击穿是指 Redis 缓存中有一些的热点数据 key 同时过期失效,或有一些非热点数据key 突然有大量并发访问请求,这样会导致大量并发请求直接穿透 Redis 缓存,涌入MySQL 数据库,瞬间增大数据库的访问压力,甚至导致数据库崩溃

解决方案

  • Redis高可用

    搭建 Redis 主从架构或集群架构

  • 限流降级

    在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量,对某个 key只允许一个线程查询数据和写缓存,其他线程等待

  • 数据预热

    将部分可能大量访问的热点数据提前加载到 Redis 缓存中,或在即将发生高并发请求访问前手动触发加载缓存不同的 key

  • 不同时期时间

    设置不同的过期时间让缓存失效的时间点尽量均匀

Redis持久化

为什么需要持久化

Redis对数据的操作基于内存,意外情况会导致Redis中的数据丢失,无法恢复。持久化机制使得Redis在下次重启时可以利用之前持久化的文件进行数据恢复。

以下二者同时使用

RDB

  • RDB(Redis DataBase)

    把当前数据生成快照保存在硬盘上

    可以手动触发:save和bgsave

    也可以自动触发:bgsave

  • 优点

    紧凑的二进制压缩文件,是Redis在某个时间点的全部数据快照。所以使用RDB恢复数据的速度远远比AOF的快。

  • 缺点

    每次进行bgsave操作都要执行fork操作创建子进程,属于重量级操作,频繁执行成本过高,所以无法做到实时持久化,或者秒级持久化。

AOF

AOF (Append Only File,即只允许追加不允许改写的文件) 方式就是将执行过的写指令记录下来 (在数据恢复时按照从前到后的顺序再将指令都执行一遍)

数据回复完整度高

通过配置 redis.conf 中的 appendonly yes 可以打开 AOF 功能 如有写指令 (如SET 等),redis 就会被追加到 AOF 文件的末尾;默认的 AOF 持久化策略是每秒钟fsync 一次 (fsync 是指把缓存中的写指令记录到磁盘中) 数据恢复完整度高 redis 提供 redis-check-aof 工具,可以用来进行 AOF 文件修复· redis 提供 AOF 文件重写 (rewrite) 机制 (AOF 文件压缩) 误操作执行 flushall 导致数据全部被清空,可以通过 AOF 文件恢复 (AOF 未被重写)

  • 不足

    AOF 文件要比 RDB 文件体积大,AOF 方式数据恢复速度要慢于 RDB 方式

  • 原理

 

 

 

 

Redis慢查询

慢查询就是系统在命令执行前后计算每条命令的执行时间,,当超过预设闽值就将这条命令的相关信息 (如发生时间、耗时、命令的详细信息)记录到慢查询日志中

慢查询的作用是帮助开发和运维人员定位和优化系统存在的慢操作 慢

  • 配置项

    • slowlog-log-slower-than (慢查询预设值)

      单位是微妙 (1秒=1000毫秒=1000000微秒) ,默认值 10000 微妙;假如执行了一条“很慢”的命令如果它的执行时间超过了10000 微秒,那么它将被记录在慢查询日志中。

    • slowlog-max-len (慢查询日志最大记录数)

      Redis 使用了一个列表来存储慢查询日志,当慢查询日志列表已经处于最大长度时,列表中最早插入的那条记录将被移除。

  • Redis慢查询日志管理命令

虽然慢查询日志存放在 Redis 内存列表中,但是 Redis 并没有暴露这个列表的键,而是通过一组命令来实现对慢查询日志的访问和管理

  • 获取慢查询日志

    slowlog get [n]

  • 获取慢查询日志列表当前长度

    slowlog len

  • 慢查询日志重置

    slowlog reset

标签:AOF,事务,缓存,持久,Redis,查询,命令
From: https://www.cnblogs.com/3-DG/p/17753431.html

相关文章

  • 分布式锁-实现原理(setnx,redisson)
         ......
  • 数据库事务的四大特性(ACID)
    ACIDACID是数据库事务的四个关键特性,分别是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。原子性(Atomicity):解释:事务是一个原子操作单元,要么全部执行成功,要么全部失败回滚,不存在部分执行的情况。例子:考虑银行转账操作,从一个账户扣除一定金......
  • 利用Redis生成实时排行榜
            ......
  • 点赞功能改进-定时任务持久化缓存数据
             ......
  • Redis 数据类型
    Redis数据类型---String数据类型----概述:String是redis最基本的类型,最大能存储512MB的数据,String类型是二进制安全的,即可以存储任何数据、比如数字、图片、序列化对象等SET/GET/APPEND/STRLEN:redis127.0.0.1:6379>existsmykey#判断该键......
  • SpringBoot之使用Redis和注解实现接口幂等性
    目录1接口幂等性1.1概念1.2实现思路1.3代码实现1.3.1pom1.3.2JedisUtil1.3.3自定义注解@ApiIdempotent1.3.4ApiIdempotentInterceptor拦截器1.3.5TokenServiceImpl1.3.6TestApplication1.4测试验证1.4.1获取token的控制器TokenController1.4.2TestController1.5注意......
  • redis 常用命令
    #查看版本号redis-server--version#连接redisredis-cli -h 10.10.1.1#登陆后查看信息10.10.1.1:6379>infoserver10.10.1.1:6379>inforedis有16个初始化库,编号0到15,默认使用0号库切换到1号库;>select1#查看当前库的key的数量>dbsize#删除当前库的全部数据>flushd......
  • wsl 部署php8.1+swoole+redis
    1.开启wsl2.apt换源sudomv/etc/apt/sources.list/etc/apt/sources.list.bak&&sudovim/etc/apt/sources.listdebhttps://mirrors.tuna.tsinghua.edu.cn/ubuntu/jammymainrestricteduniversemultiversedebhttps://mirrors.tuna.tsinghua.edu.cn/ubuntu/......
  • redis cluster增加和移除主从节点【转】
    Redis-Cluster集群之Cluster节点增减上篇我们了解了Redis的cluster集群的搭建,现在我们来说一下cluster集群的节点的增减集群增加主节点1.新建一个7006的一个节点,让其作为一个新的主节点加入,在/redis-cluster目录下,新建一个7006目录,配置相应的配置文件和数据目录,启动7006这个节......
  • SpringBoot+RabbitMQ+Redis 开发一个秒杀系统,细节打满(附源码)
    一、简易版秒杀SeckillProject系统简介开发技术二、实现细节记录1、用户密码两次MD5加密2、分布式session维持会话3、异常统一处理4、页面缓存+对象缓存5、页面静态化6、内存标记+Redis预减库存+RabbitMQ异步处理7、解决超卖8、接口限流三、效果展......