技术总结(二十二)

news/2024/11/8 17:17:42 标签: spring, mybatis, java

一、Redis缓存更新

在更新Redis缓存时,通常有两种策略:

  1. 更新缓存(Cache-Aside Pattern):先从缓存获取数据,如果缓存中没有数据或数据已经过期,则从数据库中获取最新数据,并更新到缓存中。

  2. 使用缓存替换(Read-Through/Write-Through Pattern):应用程序只需要关注数据的读写,缓存层负责同步数据。

二、Redis缓存降级

一、缓存更新的时机

  1. 数据变更时
    • 当数据库中的数据被插入、更新或删除时,与之对应的 Redis 缓存中的数据也需要更新。例如,在一个电商系统中,当商品的价格在数据库中被修改后,Redis 缓存中存储的该商品价格信息也应该立即更新,否则可能会导致用户获取到错误的价格信息。
  2. 缓存过期后
    • Redis 可以为每个缓存键设置过期时间(TTL - Time To Live)。当缓存过期后,再次访问该数据时,需要从原始数据源(如数据库)重新获取数据并更新缓存。比如,设置用户登录会话缓存的过期时间为 1 小时,1 小时后缓存过期,用户再次进行操作时,系统会重新验证用户信息并更新缓存。

二、缓存更新策略

  1. LRU(Least Recently Used)算法
    • 原理:当缓存空间不足时,Redis 会根据 LRU 算法淘汰最近最少使用的缓存数据。在更新缓存时,新的数据会替换掉 LRU 算法确定的那些不常使用的数据。
    • 示例:假设 Redis 缓存有固定的容量为 100 个缓存项,当第 101 个数据需要存入缓存时,Redis 会计算出最近最少使用的缓存项(比如,一个很久没有被访问过的用户历史订单缓存)并将其淘汰,然后存入新的数据。
  2. LFU(Least Frequently Used)算法
    • 原理:该算法以数据的访问频率为依据进行缓存淘汰和更新。访问频率最低的数据在缓存空间不足或需要更新时会被优先淘汰。
    • 示例:如果有一个商品详情页面的缓存,某个商品的详情缓存很少被访问,而另一个热门商品的详情缓存经常被访问。当需要更新缓存空间时,LFU 算法会优先淘汰那个很少被访问的商品详情缓存。
  3. 手动更新策略
    • 实时更新:在数据发生变化的代码逻辑中,立即更新 Redis 缓存。例如,在一个内容管理系统中,当管理员更新了一篇文章的内容后,在数据库事务提交成功后,马上调用 Redis 的 SET 操作来更新缓存中的文章内容。
    • 延迟更新:将缓存更新操作放入消息队列或任务队列中,延迟一段时间后进行更新。这种策略适用于对实时性要求不是特别高的场景,比如统计数据的缓存更新。例如,在一个网站流量统计系统中,用户访问次数的缓存更新可以稍微延迟,通过消息队列异步处理,减轻数据库和缓存系统的即时压力。

三、Redis相关事务的命令

  1. MULTI(开启事务)
    • 作用:用于标记事务块的开始。在 MULTI 命令之后,后续的命令将被放入一个事务队列中,直到执行 EXEC 命令才会一起执行这些命令。
    • 示例:
MULTI
SET key1 value1
SET key2 value2
EXEC
  • 在这个示例中,SET key1 value1 和 SET key2 value2 这两个命令在 MULTI 命令之后被加入事务队列,当执行 EXEC 命令时,这两个命令会按照顺序依次执行。
  1. EXEC(执行事务)
    • 作用:在一个事务块中,用于触发事务中所有命令的执行。如果在事务块中没有出现语法错误,那么所有的命令都会被执行;如果出现错误,具体的执行情况取决于错误的类型。
    • 示例:
MULTI
SET key3 value3
INCR key4
EXEC
  • 假设 key4 之前存储的是一个可以被递增的数值类型(如整数),那么 SET key3 value3 和 INCR key4 这两个命令会依次执行。
  1. DISCARD(取消事务)
    • 作用:用于取消一个事务块,清除事务队列中的所有命令,并且不会执行任何操作。通常在开启事务后,还没有执行 EXEC 命令之前,如果发现事务中有一些不需要执行的命令或者出现错误,可以使用 DISCARD 命令取消事务。
    • 示例:
MULTI
SET key5 value5
SET key6 wrong_command  // 假设这是一个错误的命令
DISCARD
  • 在这个例子中,由于出现了一个可能导致事务执行出错的命令,在执行 DISCARD 命令后,事务被取消,SET key5 value5 和错误命令都不会被执行。
  1. WATCH(监视一个或多个键)
    • 作用:用于在事务开始之前监视一个或多个键。如果在事务执行之前,被监视的键的值被其他客户端修改了,那么这个事务将会被打断。
    • 示例:
WATCH key7
MULTI
GET key7
SET key7 new_value
EXEC
  • 假设另一个客户端在 MULTI 命令之后、EXEC 命令之前修改了 key7 的值,那么当前事务中的命令将不会被执行,这样可以保证事务的隔离性,避免数据不一致的情况。
  1. UNWATCH(取消监视)
    • 作用:用于取消对所有键的监视。通常在使用 WATCH 命令后,如果不再需要监视这些键或者由于某些原因需要重新开始事务而不考虑之前的监视情况时,可以使用 UNWATCH 命令。

http://www.niftyadmin.cn/n/5744197.html

相关文章

【RabbitMQ】04-发送者可靠性

1. 生产者重试机制 spring:rabbitmq:connection-timeout: 1s # 设置MQ的连接超时时间template:retry:enabled: true # 开启超时重试机制initial-interval: 1000ms # 失败后的初始等待时间multiplier: 1 # 失败后下次的等待时长倍数,下次等待时长 initial-interval…

数据结构:七种排序及总结

文章目录 排序一插入排序1直接插入排序2希尔排序二选择排序3直接选择排序4堆排序三 交换排序5冒泡排序6快速排序四 归并排序7归并排序源码 排序 我们数据结构常见的排序有四大种,四大种又分为七小种,如图所示 排序:所谓排序,就是…

YOLOv6-4.0部分代码阅读笔记-figure_iou.py

figure_iou.py yolov6\utils\figure_iou.py 目录 figure_iou.py 1.所需的库和模块 2.class IOUloss: 3.def pairwise_bbox_iou(box1, box2, box_formatxywh): 1.所需的库和模块 #!/usr/bin/env python3 # -*- coding:utf-8 -*- import math import torch2.class IOUlo…

【热门主题】000027 React:前端框架的强大力量

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【热…

◇【论文_20160610】Generative Adversarial Imitation Learning 【附录 A】

文章目录 A 证明Section 3 的证明引理 3.1 证明命题 3.2 的证明 A.2 Section 5 的证明命题 A.1推论 A.1.1引理 A.1 因果熵的策略梯度公式 A 证明 Section 3 的证明 引理 3.1 证明 Proof of Lemma 3.1. 首先,我们证明 H ˉ \bar H Hˉ 是严格凹的。 令 ρ \rho ρ…

阿里云多端低代码开发平台魔笔使用测评

文章目录 前言一、魔笔是什么?二、测评1.基本组件布局2.前端逻辑3.事件绑定 总结 前言 最近对于低代码平台挺感兴趣的,了解到很多云服务,国内有很多的这种平台,最近阿里云推出了他们的多端低代码开发平台魔笔,目前还在…

qt QTextCursor详解

1、概述 QTextCursor是Qt框架中用于在QTextDocument或QTextEdit中编辑和导航文本的类。它提供了对文本选择和编辑操作的低级控制,允许插入、删除、修改文本以及改变文本的格式。QTextCursor可以看作是一个在文本中移动的插入点或选择区域,通过它可以执行…

uniapp实现H5和微信小程序获取当前位置(腾讯地图)

之前的一个老项目,使用 uniapp 的 uni.getLocation 发现H5端定位不准确,比如余杭区会定位到临平区,根据官方文档初步判断是项目的uniapp的版本太低。 我选择的方式不是区更新uniapp的版本,是直接使用高德地图的api获取定位。 1.首…