Redis面试问题缓存相关详解
Redis面试问题缓存相关详解
一、缓存三兄弟(穿透、击穿、雪崩)
1. 穿透
问题描述:
缓存穿透是指查询一个数据库中不存在的数据,由于缓存不会保存这样的数据,每次都会穿透到数据库,导致数据库压力增大。例如,用户请求一个不存在的用户ID,每次请求都会直接查询数据库。
解决方法:
1.1、存储特殊标记值:
当数据库中没有查询到数据时,可以将一个特殊标记值(如"not_found"
)存储到Redis中,并设置一个较短的过期时间(如5分钟)。这样,后续的请求可以直接返回"not_found"
,而不会再次查询数据库。
优点:实现简单,减少数据库压力。
缺点:如果数据库中后来插入了数据,而Redis中仍然缓存了"not_found"
,会导致查询结果不一致。
示例:
String value = redis.get(key);
if (value == null) {value = database.get(key);if (value == null) {redis.set(key, "not_found", 300); // 缓存5分钟return "not_found";} else {redis.set(key, value, 3600); // 缓存1小时}
}
return value;
1.2、布隆过滤器:
在缓存和数据库之间加入一个布隆过滤器,它可以预存储一些可能存在的键。如果查询的键不在布隆过滤器中,直接返回不存在,避免查询数据库。布隆过滤器通过哈希函数实现,误判率可以通过调整其大小和哈希函数的数量来控制。
优点:减少对数据库的无效查询。
缺点:实现复杂,有一定的误判率。
示例:
if (!bloomFilter.contains(key)) {return "not_found";
}
String value = redis.get(key);
if (value == null) {value = database.get(key);redis.set(key, value, 3600); // 缓存1小时
}
return value;
2. 击穿
问题描述:
缓存击穿是指一个热点数据的缓存过期后,大量请求同时查询数据库,导致数据库压力过大。例如,一个热门商品的详情页缓存过期,大量用户同时请求该页面。
解决方法:
2.1、互斥锁:
使用互斥锁确保只有一个线程可以查询数据库并更新缓存。其他线程等待锁释放后直接从缓存中获取数据。可以使用Redis的SETNX
命令实现分布式锁。
示例:
String lockKey = "lock:" + key;
if (redis.setnx(lockKey, "1", 30) == 1) { // 尝试获取锁,超时30秒String value = database.get(key);redis.set(key, value, 3600); // 更新缓存redis.del(lockKey); // 释放锁return value;
} else {// 等待锁释放Thread.sleep(100);return redis.get(key);
}
2.2、逻辑过期:
在缓存中存储一个额外的过期时间字段,每次读取时检查逻辑过期时间。即使Redis的物理过期时间到了,逻辑过期时间仍然有效,可以避免频繁更新缓存。
示例:
String value = redis.get(key);
if (value == null) {String lockKey = "lock:" + key;if (redis.setnx(lockKey, "1", 30) == 1) {value = database.get(key);redis.set(key, value, 3600); // 更新缓存redis.del(lockKey); // 释放锁} else {Thread.sleep(100);return redis.get(key);}
}
return value;
3. 雪崩
问题描述:
缓存雪崩是指大量缓存数据在同一时间过期,导致大量请求同时查询数据库,造成数据库压力过大。例如,多个热点数据的缓存同时过期。
解决方法:
3.1、随机过期时间:
为每个缓存设置不同的过期时间,避免大量缓存同时过期。例如,可以使用SETEX
命令为每个key设置随机的过期时间(如1-5分钟)。
示例:
int randomTTL = new Random().nextInt(300) + 60; // 随机过期时间1-5分钟
redis.setex(key, randomTTL, value);
3.2、本地缓存:
在应用层使用本地缓存(如Guava Cache)作为二级缓存,减轻Redis的压力。本地缓存可以快速响应,减少对Redis的依赖。
示例:
LoadingCache<String, String> localCache = CacheBuilder.newBuilder().expireAfterWrite(1, TimeUnit.MINUTES).build(new CacheLoader<String, String>() {@Overridepublic String load(String key) throws Exception {return redis.get(key);}});String value = localCache.get(key);
if (value == null) {value = database.get(key);redis.setex(key, 3600, value); // 更新Redis缓存localCache.put(key, value); // 更新本地缓存
}
return value;
3.3、降级限流:
降级和限流是应对高并发场景的通用策略。可以使用Guava RateLimiter或Redis的INCR
和EXPIRE
命令实现限流。例如,每秒最多允许100次请求:
示例:
RateLimiter rateLimiter = RateLimiter.create(100); // 每秒100次
if (rateLimiter.tryAcquire()) {return handleRequest();
} else {return "Too many requests";
}
二、双写一致
问题描述:
双写一致是指保持Redis和数据库的更新操作一致。如果操作顺序不当,可能会导致数据不一致。例如:
- 先更新Redis,再更新数据库:可能导致Redis中的数据丢失。
- 先更新数据库,再更新Redis:可能导致Redis中的旧数据覆盖新数据。
解决方法:
1、延迟双删:
先删除Redis中的缓存,然后更新数据库,最后再删除一次Redis中的缓存。这样可以确保Redis中的数据是最新的。
示例:
redis.del(key); // 删除缓存
database.update(key, value); // 更新数据库
Thread.sleep(300); // 延迟300毫秒
redis.del(key); // 再次删除缓存
2、分布式锁:
使用分布式锁确保同一时间只有一个线程可以更新数据。可以使用Redisson等库实现分布式锁。
示例:
RLock lock = redisson.getLock("lock:" + key);
try {lock.lock();database.update(key, value); // 更新数据库redis.del(key); // 删除缓存
} finally {lock.unlock();
}
3、共享锁和排它锁:
共享锁:当一个线程在读取数据时,其他线程可以同时读取,但不能写入。
排它锁:当一个线程在写入数据时,其他线程不能读取或写入。
示例:
// 使用Redis的SET命令实现共享锁和排它锁
String lockKey = "lock:" + key;
if (redis.set(lockKey, "1", 30, NX, EX)) { // 获取排它锁database.update(key, value); // 更新数据库redis.del(key); // 删除缓存redis.del(lockKey); // 释放锁
} else {// 等待锁释放Thread.sleep(100);
}
三、持久化
Redis提供了两种持久化方式:RDB和AOF。
1、RDB(快照模式):
优点:恢复速度快,数据完整性好,方便使用。
缺点:可能会丢失最后一次快照之后的数据,占用磁盘空间较大。
配置示例:
save 900 1 # 900秒内至少有1个键被修改时保存快照
save 300 10 # 300秒内至少有10个键被修改时保存快照
2、AOF(追加模式):
优点:数据不易丢失,恢复时可以逐条执行命令。
缺点:文件体积大,恢复速度慢。
配置示例:
appendonly yes
appendfsync everysec # 每秒同步一次
3、混合持久化:
Redis 4.0引入了混合持久化模式,结合了RDB和AOF的优点。可以同时使用两种持久化方式,提高数据安全性和恢复速度。
四、数据过期策略
Redis提供了两种主要的数据过期策略:惰性删除和定期删除。
1、惰性删除:
优点:占用CPU资源少。
缺点:可能会导致内存中积累大量过期数据。
原理:只有当访问某个键时,才会检查该键是否过期,如果过期则删除。
2、定期删除:
原理:Redis会定期扫描内存中的键,删除过期的键。
配置示例:
hz 10 # 设置Redis的事件循环频率,单位为每秒
五、数据淘汰策略
Redis支持多种数据淘汰策略,可以通过maxmemory-policy
配置。
策略 | 描述 | 适用场景 |
---|---|---|
noeviction | 不淘汰任何数据,当内存不足时返回错误 | 内存足够大,不需要淘汰数据 |
allkeys-lru | 对所有键使用LRU(最近最少使用)算法淘汰 | 通用缓存场景 |
volatile-lru | 对设置了过期时间的键使用LRU算法淘汰 | 热点数据缓存 |
allkeys-random | 随机淘汰所有键 | 对数据一致性要求不高的场景 |
volatile-random | 随机淘汰设置了过期时间的键 | 热点数据缓存 |
allkeys-lfu | 对所有键使用LFU(最不经常使用)算法淘汰 | 访问频率差异较大的缓存 |
volatile-lfu | 对设置了过期时间的键使用LFU算法淘汰 | 热点数据缓存 |
volatile-ttl | 优先淘汰TTL较短的键 | 临时数据缓存 |
相关文章:
Redis面试问题缓存相关详解
Redis面试问题缓存相关详解 一、缓存三兄弟(穿透、击穿、雪崩) 1. 穿透 问题描述: 缓存穿透是指查询一个数据库中不存在的数据,由于缓存不会保存这样的数据,每次都会穿透到数据库,导致数据库压力增大。例…...
Web三漏洞学习(其一:文件上传漏洞)
靶场:云曦历年考核题 一、文件上传 在此之前先准备一个一句话木马 将其命名为muma.txt 23年秋期末考 来给师兄上个马 打开环境以后直接上传muma.txt,出现js弹窗,说明有前端验证 提示只能上传.png .jpg 和 .gif文件,那就把muma.txt的后缀…...
冲刺高分!挑战7天一篇nhanes机器学习SCI!DAY1-7
医学生集合啦,继续挑战 7天一篇nhanes机器学习SCI! Day 1 进展:确定选题、期刊、文献 前面挑战了一期NHANES机器学习,大家使用NHANES的发文章的热情,火爆程度远超想象!我在下面的评论区看到大家的学习欲…...
高并发三剑客-本地缓存之王Caffeine-01缓存应用
1 分布式缓存使用及导致的问题 1.1 hotkey典型业务场景 常规性hotkey:可以提前评估出hotkey的场景,比如:重要节假日、促销活动等 突发性hotkey:没法提前评估,突发性行为,比如:突然新闻、爆炸信息…...
基于Java,SpringBoot,Vue,HTML家政服务预约系统设计
摘要 本文聚焦于基于Java、SpringBoot、Vue和HTML技术的家政服务预约系统的设计与实现。该系统旨在为家政服务的供需双方搭建一个便捷、高效的在线交互平台。后端采用Java语言结合SpringBoot框架,充分利用SpringBoot的自动配置和快速开发特性,实现系统业…...
系统架构设计师:系统架构概述知识体系、考点详解、高效记忆要点、练习题并提供答案与解析
一、系统架构概述知识体系、考点详解 系统架构概述、定义与作用 1. 系统架构的定义与核心要素 系统架构是复杂系统的高层次组织结构,包含硬件/软件组件、交互关系、设计原则及演进策略。其核心要素包括: 构件与模式:现代架构三要素为构件…...
汽配快车道解决chrome backgroud.js(Service Worker) XMLHttpRequest is not defined问题
Chrome 扩展开发:Service Worker 中如何优雅地发送 HTTP 请求 在 Chrome 扩展开发中,Service Worker 是一个非常重要的部分,它可以帮助我们实现很多强大的功能。然而,如果你在 Service Worker 中尝试使用 XMLHttpRequest 来发送 …...
VMware Ubuntu挂载Windows机器的共享文件
https://www.dong-blog.fun/post/2029 在VMware Ubuntu中访问Windows共享文件夹:完整指南 在使用VMware运行Ubuntu虚拟机时,访问Windows主机上的文件是常见需求。本文将详细介绍如何通过网络共享方式,让Ubuntu虚拟机直接访问Windows主机的文…...
LeNet神经网络
一、LeNet概述 1. 历史地位 开创性模型:首个成功应用的卷积神经网络(1998年)应用场景:手写数字识别(MNIST数据集)、银行支票识别提出者:Yann LeCun团队(论文《Gradient-Based Lear…...
Visio绘图工具全面科普:解锁专业图表绘制新境界[特殊字符]
Visio绘图工具全面科普:解锁专业图表绘制新境界🌟 在信息爆炸的时代,清晰、直观地呈现复杂信息变得至关重要。无论是绘制流程图📊、组织结构图👥,还是规划网络拓扑🖧,一款强大的绘图…...
ECharts散点图-散点图3,附视频讲解与代码下载
引言: ECharts散点图是一种常见的数据可视化图表类型,它通过在二维坐标系或其它坐标系中绘制散乱的点来展示数据之间的关系。本文将详细介绍如何使用ECharts库实现一个散点图,包括图表效果预览、视频讲解及代码下载,让你轻松掌握…...
D3路网图技术文档
在本文档中,我们将探讨如何使用 D3.js,结合 SVG(可缩放矢量图形)和 Canvas,来实现高效、交互性强的路网图效果。D3.js 是一个强大的 JavaScript 数据可视化库,可以基于数据驱动文档对象模型(DOM…...
Unity 一些小功能(屏幕画画,)
利用 Line Renderer 实现屏幕画画并保存图片 // 当前正在绘制的 LineRendererprivate LineRenderer currentLineRenderer;// 用于保存所有笔触的列表private List<LineRenderer> allLineRenderers new List<LineRenderer>();// 当前笔触顶点计数器private int ve…...
列表、字符串、heapq堆对列算法
1、列表 1.1 访问最后一个元素 list [1, 2, 3, 4, 5, 6] print(list[-1]) # 61.2 访问列表指定范围,例如第1-4个元素 print(list[0, 4]) # [1, 2, 3, 4]1.3 将字符列表以字符串形式输出 list [h, e, l, l, o] ls "".join(list) print(ls) # "…...
实战指南:封装Whisper为FastAPI接口并实现高并发处理
下面给出一个详细的示例,说明如何使用 FastAPI 封装 OpenAI 的 Whisper 模型,提供一个对外的 REST API 接口,并支持一定的并发请求。 下面是主要步骤和示例代码。 1. 环境准备 Python 环境: 建议使用 Python 3.8。依赖库&#x…...
Arm系统ubuntu20.04中自带的火狐浏览器打开网页B站视频和百度网盘网页视频,视频无法打开,并且没有声音——(本质上解决)
自己工作过程中有一台Orin nx arm设备,所以希望能够用这台设备看视频学习,发现自带的firefox打开网页版百度网盘和B站的时候无法打开视频,而且用有线耳机发现没有声音,最后换掉浏览器,用Chromium。 1、如果还想继续用…...
Qt 自定义控件
在 Qt 中,自定义控件是通过继承现有的 Qt 控件类(如 QWidget、QPushButton、QLabel 等)并重载相关的事件处理函数或绘制函数来实现的。自定义控件允许你根据需求添加特定的功能或样式。 自定义控件的基本步骤 1. 继承 Qt 控件类:…...
Java使用WebSocket视频拆帧进度处理与拆帧图片推送,结合Apipost进行调试
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>Configuration public class WebSocketConfig {/*** 启动 WebSocket 服务器*/Beanpublic ServerEndpointE…...
Java项目之基于ssm的QQ村旅游网站的设计(源码+文档)
项目简介 QQ村旅游网站实现了以下功能: 管理员权限操作的功能包括管理景点路线,板块信息,留言板信息,旅游景点信息,酒店信息,对景点留言,景点路线留言以及酒店留言信息等进行回复,…...
《 Reinforcement Learning for Education: Opportunities and Challenges》全文阅读
Reinforcement Learning for Education: Opportunities and Challenges 面向教育的强化学习:机遇与挑战 摘要 本综述文章源自作者在 Educational Data Mining (EDM) 2021 会议期间组织的 RL4ED 研讨会。我们组织了这一研讨会,作为一项社区建设工作的组…...
Apache Kafka UI :一款功能丰富且美观的 Kafka 开源管理平台!!
Apache Kafka UI 是一个免费的开源 Web UI,用于监控和管理 Apache Kafka 集群,可方便地查看 Kafka Brokers、Topics、消息、Consumer 等情况,支持多集群管理、性能监控、访问控制等功能。 1 特征 多集群管理: 在一个地方监控和管理…...
无参数RCE
无参数RCE(Remote Code Execution,远程代码执行) 是一种通过利用目标系统中的漏洞,在不直接传递用户可控参数的情况下,实现远程执行任意代码的攻击技术。与传统的RCE攻击不同,无参数RCE不依赖外部输入参数…...
设计模式之状态模式:优雅管理对象行为变化
引言 状态模式(State Pattern)是一种行为型设计模式,它允许对象在其内部状态改变时改变它的行为,使对象看起来似乎修改了它的类。状态模式将状态转移逻辑和状态相关行为封装在独立的状态类中,完美解决了复杂条件判断问…...
拖动滑块 代替验证码,识别机器人的方式,实验原理
拖动滑块验证是一种常见的人机验证技术,用于区分真实用户和自动化程序(如机器人)。其核心原理不仅在于用户是否能将滑块移动到正确位置,还包括对拖动行为的轨迹、速度、加速度等特征的分析。以下是其实现原理及识别机器人的方式&a…...
深度访谈:数据中台的本质不是技术堆砌,而是业务引擎的重构
在数字化转型进入深水区的今天,企业逐渐意识到单纯的技术堆砌无法解决业务核心痛点。数据的割裂、重复建设的烟囱式系统、滞后于业务的分析能力,正迫使企业寻找“系统性解法”。 “未来的竞争,本质是数据响应速度的竞争。当竞争对手还在讨论‘…...
Spark中Maven的用法
在IDEA中去创建项目,并编写java代码来操作集群中的文件 1.IDEA 中创建 Maven 项目 步骤一:点击 File -> New -> Project,在弹出的窗口左侧选择 Maven,点击 Next: 步骤二:填写项目的 GroupId、Arti…...
tomcat http 怎么改成 https
步骤 1:生成自签名证书 如果你没有可用的 SSL/TLS 证书,可以使用 Java 的 keytool 工具生成一个自签名证书。 bash复制代码 keytool -genkeypair -alias tomcat -keyalg RSA -keystore keystore.jks -keysize 2048 执行此命令后,系统会提…...
Playwright与Selenium详细对比及Playwright快速入门
Playwright 与 Selenium 详细对比及入门指南索引 简介 本文章旨在帮助测试工程师了解Playwright和Selenium这两个主流的UI自动化测试工具,并快速入门Playwright。文档分为多个部分,本文作为主要索引,提供核心对比和基本概念,而详…...
03 UV
04 Display工具栏_哔哩哔哩_bilibili 讲的很棒 ctrlMMB 移动点 s 打针 ss 批量打针...
hadoop执行sqoop任务找不到jar
sqoop:1.4.7 hadoop:3.4.1 数据:oracel-hdfs 2025-04-15 16:57:00,850 INFO sqoop.Sqoop: Running Sqoop version: 1.4.7 2025-04-15 16:57:00,901 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead. 2025-04-15 …...
【C#】Html转Pdf,Spire和iTextSharp结合,.net framework 4.8
🌹欢迎来到《小5讲堂》🌹 🌹这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解。🌹 🌹温馨提示:博主能力有限,理解水平有限,若有不对之处望指正!&#…...
Mac系统升级node.js版本和npm版本并安装pnpm
1.升级node.js版本 第一步:查询当前node.js版本 node -v第二步:清除node.js的缓存 sudo npm cache clean -f第三步:验证缓存是否清空 npm cache verify第四步:安装n工具,n工具是专门用于管理node.js版本的工具 su…...
记录分享《若依Spring Cloud本地开发部署教程》
若依Spring Cloud本地开发部署教程 若依(RuoYi)是一个基于Spring Boot和Spring Cloud的权限管理系统,提供了丰富的功能模块和开箱即用的解决方案。本文将详细介绍如何在本地环境中进行若依Spring Cloud的开发和部署。 一、环境准备 Java环境…...
(小白0基础) 微调deepseek-8b模型参数详解以及全流程——训练篇
本篇参考bilibili如何在本地微调DeepSeek-R1-8b模型_哔哩哔哩_bilibili 上篇:(小白0基础) 租用AutoDL服务器进行deepseek-8b模型微调全流程(Xshell,XFTP) —— 准备篇 初始变量 max_seq_length 2048 dtype None load_in_4bit True单批次最大处理模型大小dy…...
基于 PyGetWindow 获取窗口信息和控制窗口
PyGetWindow 是基于Python的一款简单、跨平台的模块,用来获取窗口信息和控制窗口。可以实现的功能有: 获取当前系统中所有打开窗口的列表。 根据窗口标题、窗口句柄等属性获取特定的窗口对象。 激活、最小化、最大化和关闭窗口。 获取和设置窗口的位置、…...
解锁动态规划的奥秘:从零到精通的创新思维解析(8)
前言: 小编在前几日讲述了关于动态规划的习题,下面小编继续跟着上次的步伐,继续进入多状态dp问题的讲解(但是今天这个题目不需要多状态),今天由于小编的精力有限,所以我就仅仅先讲述一个题目&am…...
使用RUN pip install flask和RUN pip install -r requirements.txt
在编写dockerfile文件的时候,有时候会遇上使用RUN pip install -r requirements.txt的情况,而且requirements.txt文件里面就一个包名,例如flask,那么不禁要问为什么不直接写成RUN pip install flask呢?其实不是不行&am…...
512天,倔强生长:一位技术创作者的独白
亲爱的读者与同行者: 我是倔强的石头_,今天是我在CSDN成为创作者的第512天。当系统提示我写下这篇纪念日文章时,我恍惚间想起了2023年11月19日的那个夜晚——指尖敲下《开端——》的标题,忐忑又坚定地按下了“发布”键。那时的我…...
【Java SE】Collections类详解
参考笔记:java Collections类 详解-CSDN博客 目录 一、Collections类简介 二、Collection类常用方法 1. 排序 ① static void reverse(List list) ② static void shuffle(List list) ③ static void sort(List list) ④ static void sort(List list, Comparator …...
Android LiveData学习总结(源码级理解)
LiveData 工作原理 数据持有与观察者管理:LiveData 内部维护着一个数据对象和一个观察者列表。当调用 observe 方法注册观察者时,会将 LifecycleOwner 和 Observer 包装成 LifecycleBoundObserver 对象并添加到观察者列表中。生命周期感知:L…...
RabbitMQ 为什么引入 Exchange 的概念, 交换机有什么作用.
RabbitMQ 引入 Exchange 的概念是为了实现消息的灵活路由和解耦生产者与消费者,这是 AMQP(Advanced Message Queuing Protocol)协议的核心设计之一。以下是 Exchange 存在的主要原因: 1. 解耦生产者与队列 问题:如果生…...
rabbitmq引入C++详细步骤
1. 安装RabbitMQ服务器 在Windows上:先安装Erlang,再安装RabbitMQ服务器。安装完成后,可通过访问http://localhost:15672来检查RabbitMQ服务器是否正常运行,默认的用户名和密码是guest/guest。 在Linux上:可使用包管理…...
Android 9.0系统源码定制:实现开机启动特定App的全面指南
在Android 9.0系统中,若需要通过修改系统源码实现开机启动特定应用(如系统预装应用或第三方应用),通常涉及对系统框架层(Framework)的深度定制开发。以下是详细的实现步骤和关键代码位置整理: 1…...
如何在不同版本的 Elasticsearch 之间以及集群之间迁移数据
作者:来自 Elastic Kofi Bartlett 当你想要升级一个 Elasticsearch 集群时,有时候创建一个新的独立集群并将数据从旧集群迁移到新集群会更容易一些。这让用户能够在不冒任何停机或数据丢失风险的情况下,在新集群上使用所有应用程序测试其所有…...
MySQL数据库精研之旅第六期:玩转数据库约束
目录 一、数据库约束的概念 二、约束类型 三、NOT NULL 非空约束 四、DEFAULT 默认值约束 五、UNIQUE 唯一约束 六、PRIMARY KEY 主键约束 七、FOREIGN KEY 外键约束 八、Check 约束 一、数据库约束的概念 数据库约束是指对数据库表中的数据所施加的规则或条件…...
【Java】面向对象程序三板斧——如何优雅设计包、封装数据与优化代码块?
🎁个人主页:User_芊芊君子 🎉欢迎大家点赞👍评论📝收藏⭐文章 🔍系列专栏:【Java】内容概括 【前言】 在Java编程中,类和对象是面向对象编程的核心概念。而包(Package&am…...
MCP、RAG与Agent:下一代智能系统的协同架构设计
一、智能系统架构的范式转移 1.1 传统架构的局限性 架构类型典型问题新架构需求单体架构扩展性差,维护成本高模块化解耦简单微服务缺乏智能决策能力认知能力嵌入纯LLM系统事实性错误,知识固化动态知识增强 1.2 三大核心组件的定位 #mermaid-svg-6tGuE…...
软件设计师2009-2022历年真题与答案解析(附pdf下载)
软考在即,现在给大家分享一下软件设计师2009-2022真题与答案解析 pdf全套,文末提供大家免费下载,大家都知道在软考备考过程中,拥有一套全面且实用的考试资料对于考生来说至关重要。目录如下: 历年真题及详解2004-2019 …...
前端 React 弹窗式 滑动验证码实现
目录 一、安装依赖 1、rc-slider-captcha 2、create-puzzle 二、个人封装好的组件拿去用 三、效果展示 一、安装依赖 这里需要引入两个依赖,若有后端图片接入,可以不引入第二个依赖 1、rc-slider-captcha 滑动验证码生成的库 国内网:…...
【触想智能】工业触摸一体机在金融智能设备领域上应用的优势
工业触摸一体机在金融智能设备领域上具有许多独特的优势。这些设备结合了工业级的强度和耐用性,以及先进的触控技术和高性能处理能力,为金融机构提供全面可靠的解决方案。下面将介绍工业触摸一体机在金融智能设备领域上的应用优势。 触想嵌入式工业触摸一…...