Redis技术分享——缓存常见应用场景问题?

news2024/11/26 9:28:13

什么是redis

RedisRemote Dictionary Server的简称,是一个由意大利人Salvatore Sanfilippo开发的key-value存储系统,具有极高的读写性能读的速度可达110000次/s写的速度可达81000次/s 。今天主要是分享redis的缓存功能。

为什么要使用缓存?

当互联网发展之初时,我们对于数据总量、需求都很小,我们的项目本身也很小,可以直接访问数据库;随着网络需求的不断增大,项目的不断扩大,数据库的压力剧增,增删改查需要频繁地在内存与外存之间交换数据,很费时间。

为了保证“有效、有限的请求”访问到数据库,我们放大前置环节的逻辑和成本,所以缓存应运而生。它是一种小巧而功能强大的存储结构,用于在内存中管理数据量不太大但是访问量特别大的热点数据。

缓存的优点:

1、提高接口的响应时间和并发量

2、减轻数据库的压力

Redis支持数据的持久化,周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,重启的时候可以再次加载进行使用。Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。

当我们正式使用redis时,需要考虑几个经典的场景:

1、缓存穿透:用户访问的key在数据库中一定不存在的数据,如果有人利用这个漏洞恶意系统,每次请求的压力都给到数据库,会压垮数据库,造成系统崩溃。

正常情况下,一个请求过来,首先判断key是否存在,如果key存在,直接返回;如果key不存在或者已过期,查询数据库,如果数据库中存在数据,则更新缓存并返回数据;如果不存在,则直接返回空。

参考解决方案:

1、缓存默认值:在数据库查询不存在时,可以将其缓存为默认值。不过设置的时间不宜过长(一般设置为60s),如果过了一会儿数据库新增了该数据,时间太长的话,就会出现数据不一致的情况。

2、业务逻辑前置判断:为避免有人为的恶意打击,用不合理的参数去请求系统。我们在接口处进行数据合法性校验,进行提前拒绝。比如:a接口只允许查询18+的成年人的数据,请求带有未成年人就明显不合适。

避免了因为新增了大量的不存在的key到内存中,极端情况下,缓存被撑爆。

3、使用布隆过滤器:如果通过前面两种方案也无法避免问题,可以使用布隆过滤器。当把数据写入数据库的时候,使用布隆过滤器进行标记;当有请求时,如果发现缓存消失,在去查询数据库前,先查询布隆过滤器该key是否存在;如果不存在,直接返回,不过布隆过滤器有一定的误判率,这个可以忽略。

4、加互斥锁或队列:基于高并发的场景,我们要加一个锁,只保证一个线程去创建缓存,其余的等待。避免高并发带来的大量的请求同一时刻都来请求同一个key,发现没有这个key,全都去访问数据库,以至于系统崩溃。

2、缓存击穿:指的是一个热点key,在不停的被大量的请求访问,当这个热点key缓存失效的瞬间,大量的请求访问到数据库,以至于系统崩溃。

参考解决方案:

1、设置永不过期:提前把热点数据不设置过期时间,后台异步更新缓存。不过面对真实场景时,也需要根据实际情况及时的调整,毕竟没有永不过时的热点,用户们的关注点每时每刻都在变化中。

2、加互斥锁或队列:加一个互斥锁,让一个线程正常请求数据库,其他线程等待即可(这里可以使用线程池来处理),都创建完缓存,让其他线程请求缓存即可。

3、缓存雪崩:当某一个时刻出现大规模的缓存失效,然后大量的请求直接访问到数据库,以至于压垮数据库,造成系统崩溃等情况。出现的原因主要包括:缓存采用相同的过期时间,或者缓存服务出现故障。

参考解决方案:

1、相对随机数过期时间:key的过期时间加上一个随机值,保证不是同一时间失效

2、分布式集群部署:单节点缓存服务容易宕机,那我们就部署个集群,然后把缓存均匀的分不到不同的服务器上。

3、服务限流、熔断、降级:当流量到一定的阈值或者服务出现异常、故障时,直接返回“请稍后再试”的友好性处理,让一部分用户正常使用,其他用户多重试几次,不过这样难免会降低用户体验,不过几个人有问题也总比整个系统崩溃好。

Redis作为我们北大青鸟Java课程必学内容之一,结合实际的商业项目,掌握技术的各种应用场景和解决方案,让学员能积累到真实有效的工作项目经验,提升竞争力!

了解更多开发技能、学习内容及就业情况等,可以持续关注我们成都基地!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Excel查找函数(VLOOKUP\SEARCH\FIND\MATCH)

文章目录查找纵向VLOOKUP函数eg1已知身份证查姓名eg2已知身份证查地区Find函数FindB函数SEARCH函数SEARCHBMATCH函数查找 纵向VLOOKUP函数 VLOOKUP(lookup_value,table_array,col_index_num,[range_lookup])lookup_value:要查找的值 table_array:要查找…

【测试】性能测试

努力经营当下,直至未来明朗! 文章目录目标一、性能测试概述二、常见的性能测试指标三、性能测试的分类四、loadrunner工具介绍(LR)一)VUG:虚拟用户发生器二)Controller三)Analysis小…

vector的使用及模拟实现

目录 一.vector的介绍及使用 1.vector的介绍 2.vector的使用 1.vector的定义 2.vector iterator的使用 3. vector 空间增长问题 4.vector 增删查改 3.vector 迭代器失效问题(重点) 1. 会引起其底层空间改变的操作 2.指定位置元素的删除操作--erase 3. Li…

python 从0到批量下载某站视频

简介:真实从0到1,童叟无欺~ 目标:用python批量下载某站搜索视频,以“CG 服装”为例 本章主要介绍如何用python把搜索到的视频直接下载到自己的本地文件夹中~ 介绍一下工作流1. 下载并安装python2. 测试pyt…

Ansible自动运维————实验

0、创建新的虚拟机,使用镜像RHEL8.5,要求/boot目录为512N,/home目录为1Gb,交换空间为2Gb,其他空间给)目录。1、将该主机作为 Ansible 控制节点,克隆该虚拟机,将克隆的虚拟机作为受控节点&#x…

Koa源码学习

前言 koa是一个非常流行的Node.js http框架。本文我们来学习下它的使用和相关源码 来自官网的介绍: Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。…

【数据分析】Excel必备函数汇总

文章目录求和单条件求和SUMIF多条件求和SUMIFS求平均AVERAGE单条件多条件查找纵向VLOOKUP函数eg1已知身份证查姓名eg2已知身份证查地区Find函数FindB函数SEARCH函数SEARCHBMATCH函数Subtotal函数最值小数点去小数点TRUNC四舍五入ROUND随机数求余奇偶统计条件多条件时间当前日期…

LearnOpenGL-光照-5.投光物

本人刚学OpenGL不久且自学,文中定有代码、术语等错误,欢迎指正 我写的项目地址:https://github.com/liujianjie/LearnOpenGLProject 文章目录投光物平行光点光源聚光不平滑的例子平滑例子投光物 前面几节使用的光照都来自于空间中的一个点 即…

IR 808 Alkyne,IR-808 alkyne,IR 808炔烃,近红外吲哚类花菁染料

【产品理化指标】:中文名:IR-808炔烃英文名:IR-808 alkyne,Alkyne 808-IR CAS号:N/AIR-808结构式:规格包装:10mg,25mg,50mg,接受各种复杂PEGS定制服务&#x…

Git的下载、安装、配置、使用、卸载

前言 我是跟着狂神老师学的。该博客仅用于笔记所用。 下面是老师的B站和笔记 B站:https://www.bilibili.com/video/BV1FE411P7B3?p1&vd_source9266cf72b1f398b63abe0aefe358d7d6 笔记:https://mp.weixin.qq.com/s/Bf7uVhGiu47uOELjmC5uXQ 一、准备工…

【18】组合逻辑 - VL18 实现3-8译码器①

VL18 实现3-8译码器① 1 题目 【这题我的思路非常绝境】奈斯 !! 看真值表的思路:Yi所在列【0仅一个其余全1】,故【以0为对象求解】 观察发现:E3 E2_n E1_n = 100 时 是 译码的使能信号 ; 并且E3 E2_n E1_n为其他值时,都不使能译码 然后就很简单,没有仿真就成功了 2 代…

Linux:文件流指针 与 文件描述符

目录一、文件描述符二、文件流指针三、缓冲区之前讲解过了IO库函数和IO接口,库函数是对系统调用接口的封装,也就是说实际上在库函数内部是通过调用系统调用接口来完成最终功能的。 库函数通过文件流指针操作文件,系统调用接口通过文件描述符操…

在一个web应用中应该如何完成资源的跳转

在一个web应用中通过两种方式,可以完成资源的跳转: 第一种方式:请求转发 第二种方式:重定向 转发和重定向的区别: 代码上的区别: 请求转发 // 获取请求转发器对象 RequestDispatcher dispatcher request.…

3-1 SpringCloud快速开发入门: Ribbon 是什么

接上一章节Eureka 服务注册中心自我保护机制,这里讲讲Ribbon 是什么 Ribbon 是什么 通常说的负载均衡是指将一个请求均匀地分摊到不同的节点单元上执行,负载均和分为硬件负载均衡和软件负载均衡: **硬件负载均衡:**比如 F5、深信…

C# 实现 key-value 结构自定义缓存 CustomCache

功能需求 使用 C# 编写一个 key-value 结构进程内缓存,实现数据的缓存操作,此处所用到的知识点如下: 线程安全的字典 ConcurrentDictionary;设计模式之单例模式(Singleton);缓存数据【主动 &a…

3.10多线程

一.常见锁策略1.悲观锁 vs乐观锁体现在处理锁冲突的态度①悲观锁:预期锁冲突的概率高所以做的工作更多,付出的成本更多,更低效②乐观锁:预期锁冲突的概率低所以做的工作少,付出的成本更低,更搞笑2.读写锁 vs 普通的互斥锁①普通的互斥锁,只有两个操作 加锁和解锁只有两个线程针…

HT32合泰单片机开发环境搭建和配置教程

HT32合泰(Holtek)单片机开发环境搭建安装教程 前言 最近在准备合泰杯的比赛,在看合泰官方的PPT和数据手册学习,顺便做个合泰单片机的开发环境搭建教程。 合泰杯比赛发放的开发板是ESK32-30501,用的单片机是HT32F52352。 合泰杯官网地址&a…

【C++】vector的使用及其模拟实现

这里写目录标题一、vector的介绍及使用1. vector的介绍2. 构造函数3. 遍历方式4. 容量操作及空间增长问题5. 增删查改6. vector二维数组二、vector的模拟实现1. 构造函数2. 迭代器和基本接口3. reserve和resize4. push_back和pop_back5. insert和erase5. 迭代器失效问题5. 浅拷…

Java中的 this 和 super

1 this 关键字 1.1 this 访问本类属性 this 代表对当前对象的一个引用 所谓当前对象,指的是调用当前类中方法或属性的那个对象this只能在方法内部使用,表示对“调用方法的那个对象”的引用this.属性名,表示本对象自己的属性 当对象的属性和…

IntelliJ IDEA 编码设置

1.场景 适用于配置idea文件编码 2.配置 对已经存在的项目设置文件编码 可以设置全局的编码 以及 项目的编码 一般没啥特殊要求 都建议设置为 UTF-8 以及 配置项目的目录的单独编码 也建议UTF-8 idea可以单独设置properties的编码 也建议改为 UTF-8,其中有一个重点…