Redis缓存的使用

什么是缓存

缓存就是数据交换的缓冲区,是存储数据的临时地方,一般读写性能较高。

缓存的作用:

  • 降低后端负载
  • 提高读写效率,降低响应时间

缓存的成本:

  • 数据一致性成本
  • 代码维护成本
  • 运维成本

Redis特点

  • 键值型数据库,value支持多种不同数据结构,功能丰富
  • 单线程,每个命令具备原子性(在Redis6.0版本之后,采用多线程处理网络请求,核心部分仍是单线程)
  • 低延迟,速度快(基于内存,IO多路复用,采用C语言编写)
  • 支持数据持久化(定期将内存中的数据持久化到磁盘中)
  • 支持主从集群,分片集群
  • 支持多语言客户端

与MySQL的对比

MySQL

Redis

数据结构

结构化

非结构化

数据关联

关联的

无关联的

查询方式

SQL查询

非SQL

事务特性

ACID

BASE

存储方式

磁盘

内存

扩展性

垂直

水平

使用场景

数据结构固定,相关业务对数据安全性、一致性要求较大

数据结构不固定,对一致性,安全性要求不高,对性能有一定要求

Redis实现缓存

Redis缓存作用模型如下

缓存更新策略

内存淘汰

超时提出

主动更新

说明

不用自己维护,利用Redis的内存淘汰机制,当内存不足时自动淘汰部分数据。下次查询时更新缓存

给缓存添加TTL时间,到期后自动删除缓存,下次查询时更新缓存

编写业务逻辑,再修改数据库的同时,更新缓存

一致性

一般,取决于超时时间设置

维护成本

对于低一致性的需求我们可以采用内存淘汰

对于高一致行的需要我们需要主动更新并设置超时时间

主动更新策略

在解决一致性问题时,我们需要注意以下三个问题

1、在更新缓存时应该删除缓存还是直接更新缓存?

直接更新缓存:每次更新数据库时都会进行修改,当写多读少时,无效写操作过多。

删除缓存:更新数据库时,让缓存失效,查询时再更新缓存。

经过两种对比下,大多数场景都选择之间删除缓存。

2、如何保证缓存与数据库的操作同时成功或失败?

也就是说,如何保证更新缓存的原子性。

在单体系统中,将缓存与数据库操作放在同一个事物下。

在分布式系统中,利用TCC等分布式事务方案。

3、先操作数据库还是先操作缓存?

这涉及到多线程并发问题,接下来查看先删除缓存再操作数据库可能会出现的情况。正常情况下如下所示

但是如果在线程1更新数据时有其他线程开始执行查询操作,就会变成如下情况,这样会导致Redis中保存的数据仍然是旧数据,从而产生数据不一致问题。

那么,接下来查看先更新数据库再删除缓存可能会出现的情况。正常情况下如下图所示

但也可能存在如下一种情况,假设线程1先查询缓存,但是由于缓存已经失效,比如说过期或是Redis中不存在,但是就在从数据库写入缓存前线程2开始执行,从而导致写入缓存的仍然是旧数据。

即使这两种情况都会产生数据不一致的问题,但是总体来说先操作数据库后删除缓存出现数据不一致的概率要低于先删除缓存再更新数据库。因为如果先删除缓存的话,是一个微秒级别的操作,而更新数据库相对来说耗时比较久。在此之间可能会存在其他线程开始查询缓存并查询数据库写入缓存的问题。

但如果先更新数据库,期间即使有其他线程查询数据库并更新缓存执行,最后也会被更新数据库后的删除缓存操作将旧数据删除。其次,查询数据库操作耗时短,其他线程恰好开始更新数据库的概率低。

因此,更新缓存的最佳方案如下:

  1. 低一致性需求:使用Redis自带的内存淘汰机制
  2. 高一致性需求:主动更新,并以超时剔除作为兜底方案

读操作:

  • 缓存命中则直接返回
  • 缓存未命中则查询数据库,并写入缓存,设定超时时间

写操作:

  • 先写数据库,然后再删除缓存
  • 要确保数据库与缓存操作的原子性

缓存穿透

指查询一个数据库一定不存在的数据,最终导致所有请求打在数据库上,导致数据库压力变大。模型图如下

缓存空对象

模型图如下

即使查不到数据,也返回一个key为提交的数据,value为null的数据给缓存,并设置一个存活时间。

优点是实现简单,维护方便。

缺点是额外的内存消耗,可能造成短期的不一致,如果无法忍受数据不一致情况,可以在更新数据库时主动将数据更新到缓存当中。

布隆过滤器

模型图如下

查询时先通过布隆过滤器判断数据是否存在,如果不存在直接拒接,存在的话才会访问Redis或数据库,布隆过滤器实际上是一个算法,将数据库中存在的数据通过哈希算法得到哈希值然后转化为二进制位保存在布隆过滤器当作,当客户端请求发起时,通过判断请求的数据在布隆过滤器对应的位置是0还是1。

优点是内存占用少,没有多余的key。

缺点是实现复杂,存在误判。判断没有的数据一定没有,判断存在但不一定真的存在,还是存在一定穿透的问题。

以上是被动解决方案,我们也可以主动选择防止被穿透的方案。

设置id格式,然后进行基础格式校验,格式不对不进行查询。给用户进行权限设置。

缓存雪崩

指在一个时间段,缓存集中过期失效,在失效的时间段中,所有的访问查询都由数据库来操作,产生周期性的压力波峰。模型图如下

设置不同TTL:将缓存的数据设置不同的失效时间,避免在同一时间集中失效,对于热门的数据,存活时间长一点甚至可以设置永不过期。

设置Redis集群:为了防止Redis宕机造成的雪崩,要建立Redis集群,从而提高Redis的高可用性。

添加降级处理:当发现Redis出现故障时,应该进行快速失败,而不应该交给服务器处理。

添加多级缓存:在浏览器、Nginx或是JVM内部进行缓存,而不是单单只在Redis中进行缓存

缓存击穿

也叫热点key问题。是指一个key非常热点,在不停扛着大并发,大并发集中对于一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求到数据库上。模型图如下

互斥锁

模型图如下

同一时刻只需要一个线程对数据库访问就可以了,其他线程获取不到锁就休眠一会再去Redis进行查询。

缺点:线程需要等待,会影响性能。当一个线程需要获取多个锁时可能存在死锁风险。

优点:没有额外的内存消耗,保证了一致性,实现简单。

逻辑过期

模型图如下

不设置TTL的过期时间,而是存储再Value中,如果逻辑时间过期了,那么由一个线程拿到互斥锁后开辟一个新线程去进行数据库查询,重建缓存。其余线程仍然使用逻辑上的旧数据。

缺点:不保证一致性,有额外的内存消耗,实现复杂。

优点:性能上比较好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/208472.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Upsert 及冲突(GORM)

GORM支持了数据库的upsert操作 upsert操作对于插入一条数据而言的,如果插入数据之前,没有这条数据,则会插入该条数据;如果插入数据之前就存在这条数据(索引值),就更新这条记录。 创建结构体 …

基于景区智慧灯杆、智能指路牌基础设施的景区建设应用

智慧景区是指运用现代信息技术手段,将景区内的资源、服务、管理等进行数字化、网络化和智能化整合,打造出高效便捷、安全舒适、互动体验和可持续发展的景区。智慧景区可以从以下几个方面进行体现: 智慧导览:通过使用智能化的导览…

vue 解决响应大数据表格渲染崩溃问题

如果可以实现记得点赞分享,谢谢老铁~ 1.场景描述 发起请求获取上万条数据,进行表格渲染,使浏览器卡顿,导致网页崩溃。 2.分析原因 1.大量数据加载,过多操作Dom,消耗性能。 2.表格中包含其他…

Linux 基础认识

文章目录 前言Linux历史window历史Linux地位发行版本 前言 建议只看概述 Linux历史 概述: 由一个研究生受Minix操作系统启发编写的,因为功能实用,代码开源被世界人接收和开发 ,最终正式发布 。 详情: 1991年10月5日…

Azure Machine Learning - 在 Azure AI 搜索中创建全文查询

Azure AI搜索中如果要为全文搜索生成查询,本文提供了设置请求的步骤。 本文还介绍了查询结构,并说明了字段属性和语言分析器如何影响查询结果。 关注TechLead,分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&a…

【开源威胁情报挖掘1】引言 + 开源威胁情报挖掘框架 + 开源威胁情报采集与识别提取

基于开源信息平台的威胁情报挖掘综述 写在最前面摘要1 引言近年来的一些新型网络安全威胁类型挖掘网络威胁的情报信息威胁情报分类:内、外部威胁情报国内外开源威胁情报挖掘分析工作主要贡献研究范围和方法 2 开源威胁情报挖掘框架1. 开源威胁情报采集与识别2. 开源…

详解SpringAop开发过程中的坑

😉😉 学习交流群: ✅✅1:这是孙哥suns给大家的福利! ✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 🥭🥭3:QQ群:583783…

【Cisco Packet Tracer】DHCP/FTP/WEB/DNS实验

本文使用CiscoPacketTracer仿真软件实现了DHCP/FTP/WEB/DNS实验,拓扑中包含2个客户机和3个服务器(DHCP服务器、DNS服务器、FTP/WEB公用一个服务器),客户机的IP地址由DHCP服务器动态分配。 DHCP服务器IP地址:192.168.0…

renpy-renpy对话内容汉化

文章目录 前言思路实现1,提取对话内容2,汉化对话内容文件3,修改gui文件,使得renpy游戏支持中文显示 前言 最近下载了一些renpy视觉小说内容,发现对话都为英文,因此我在想能否提取出这些对话然后汉化后再封装回原文件,将其汉化 当然汉化过程是机器翻译,汉化其他语言同理,大概5分…

Wireshark使用详解

wireshark简介 wireshark是捕获机器上的某一块网卡的网络包,当你的机器上有多块网卡的时候,你需要选择一个网卡。   wireshark能获取HTTP,也能获取HTTPS,但是不能解密HTTPS,所以wireshark看不懂HTTPS中的内容&#…

自然语言处理 (NLP) 中的组合语义分析

埃弗顿戈梅德(Everton Gomede) 一、介绍 自然语言处理 (NLP) 中的组合语义分析是一个引人入胜且复杂的话题。为了充分理解它,将这个概念分解成它的基本组成部分是至关重要的:组合语义及其在NLP中的应用。组…

Java笔记

md5加密 spring框架我我们提供了一个工具类DigestUtils 调用类中的md5digestAsHes对密码进行加密 但是要将密码转成bytes数组 password DigestUtils.md5DigestAsHex(password.getBytes()); 对象的属性拷贝 BeanUtils.copyProperties(有数据的对象,空对象)&#…

LeetCode算法题解(动态规划)|LeetCode1143. 最长公共子序列、LeetCode1035. 不相交的线、LeetCode53. 最大子数组和

一、LeetCode1143. 最长公共子序列 题目链接:1143. 最长公共子序列 题目描述: 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一…

GitHub----使用记录

一、上传文件到仓库 1、首先新建一个github仓库 然后先记住这一句指令 2、下载git工具 https://git-scm.com/downloads 下载工具安装不用运行 3、使用git工具上传文件并推送 找到你想上传的文件的位置,右击git Bush here git init :初始化这个仓…

canvas基础:绘制贝塞尔曲线

canvas实例应用100 专栏提供canvas的基础知识,高级动画,相关应用扩展等信息。 canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重要的帮助。 文章目录 bez…

Xshell连接VMware虚拟机中的CentOS

Xshell连接VMware虚拟机中的CentOShttps://www.cnblogs.com/niuben/p/13157291.html 步骤: 1. 检查Linux虚拟机的网络连接模式,确保它是NAT模式。(由于只在本机进行连接,所以没有选择桥接模式。当然,桥接模式的配置会…

Python函数的高级用法

Python 的函数是“一等公民”,因此函数本身也是一个对象,函数既可用于赋值,也可用作其他函数的参数,还可作为其他函数的返回值。 使用函数变量 Python 的函数也是一种值:所有函数都是 function 对象,这意…

算法学习系列(三):汉诺塔

目录: 引言一、问题描述二、问题求解三、测试四、附录(所有代码) 引言 这个汉诺塔问题就是一个典型的递归问题,这篇博客也算是上一篇的一个扩展吧,都是递归问题,这个问题太大,而且牵扯到的问题…

第一类瑞利索末菲标量衍射模型的方孔衍射的空间像计算(附python计算代码)

记第一类瑞利索末菲标量衍射模型的方孔衍射的空间像计算(附python计算代码) RS type 1 衍射空间像计算傅里叶变换采样条件实际计算计算要求傅立叶变换法计算直接卷积方法计算代码傅立叶变换方法直接卷积https://zhuanlan.zhihu.com/p/624292239 Goodman, J. W. (2004). Intro…

Linux shell中的函数定义、传参和调用

Linux shell中的函数定义、传参和调用: 函数定义语法: [ function ] functionName [()] { } 示例: #!/bin/bash# get limit if [ $# -eq 1 ] && [ $1 -gt 0 ]; thenlimit$1echo -e "\nINFO: input limit is $limit" e…