Redis的8种数据结构和应用场景介绍,面试题答案
面试原题:你用过Redis哪些数据结构?(网易一面 · 2023)(面试题来自牛客网)
参考答案 后面有 详细答案解析,帮助更快记忆~
参考答案共652字符,阅读约需1分8秒;全文共8694字符,阅读约需7分14秒
参考答案
Redis是一种流行的内存数据库,支持多种数据结构,用于不同的用途。下面我将介绍Redis的5个基础数据结构和3个特殊数据结构:
基础数据结构:
-
String(字符串): 这是最基本的数据结构,用于存储文本或二进制数据。它可以存储任何类型的数据,比如字符串、整数、浮点数等。常用于缓存、计数器等场景。
-
List(列表): 列表是一个有序的字符串集合,可以在列表的头部或尾部添加、删除元素。它支持双向的插入和删除操作,可以用于实现队列、栈等数据结构。
-
Set(集合): 集合是一个无序的、不重复的字符串集合。可以进行交集、并集、差集等集合操作,适用于需要快速判断某个元素是否存在的场景。
-
Hash(哈希): 哈希存储了字段与值的映射关系,类似于一个关联数组。适用于存储对象的属性或者键值对。
-
Sorted Set(有序集合): 有序集合是一种在集合的基础上,为每个元素关联一个分数,然后根据分数对元素进行排序。适用于排行榜、范围查找等场景。
特殊数据结构:
-
HyperLogLog: HyperLogLog用于近似地计算一个集合中不重复元素的数量。它的内存占用非常小,适用于需要高效计数的场景,比如统计网站的UV(Unique Visitors)。
-
Bitmaps: 位图是一种特殊的数据结构,每个位代表一个状态。它可以用于存储某种状态的标记,比如用户的签到记录、在线状态等。
-
GeoSpatial(地理空间): Redis支持对地理位置信息的存储和查询,可以用来存储地理位置坐标,然后进行附近位置搜索等。
在面试中,对于每种数据结构,你可以结合实际项目经验,提供你是如何使用这些数据结构解决问题的例子,以展示你的理解和实际应用能力。
答案解析
5种基础类型
很多答案给的不全的大多只有五种,这五种也是我们最了解的类型。其中一些重要的特性(比如:SDS等)我们会在其他的文章有详细的介绍。
String类型
当在Redis中提到"String"类型时,它实际上是一种基本的数据结构,用于存储文本或二进制数据。尽管名字叫做"String",但它不仅仅限于存储字符串,还可以存储整数和浮点数等不同类型的数据。以下是一些关于Redis中String类型的重要特点和用法:
-
存储: Redis的String类型可以存储多种数据类型,包括纯文本字符串、整数、浮点数等。存储的数据可以是字节级别的二进制数据,这使得它在缓存和存储各种数据格式时非常有用。
-
高效操作: Redis中的String类型支持O(1)时间复杂度的基本操作,如获取、设置、追加、递增、递减等。这使得它在计数器、缓存、会话管理等方面非常高效。
-
过期时间: 你可以为存储在String类型中的数据设置过期时间。这为实现短期缓存、验证码过期等场景提供了便利。
-
位操作: Redis的String类型支持位级别的操作,包括位与、位或、位异或等,这使得它在处理位图(Bitmaps)等场景非常有用。
-
实时计算: 由于String类型支持递增和递减操作,你可以在Redis中执行原子性的计数操作,比如计数在线用户数、点赞数等。
-
分布式锁: 你可以使用String类型来实现分布式锁,利用其设置值时的原子性和过期时间特性,确保在分布式环境下的互斥操作。
-
应用场景: String类型在许多应用场景中都有用武之地,比如缓存、计数器、排行榜、临时会话存储、消息队列等。你可以根据具体需求选择合适的数据类型。
示例代码
Tips:了解即可,面试不会让手撸Redis相关代码的,目前各家是这样。如果遇到了就当我没说
// 存储字符串
redis.set("username", "john_doe");// 存储整数
redis.set("user:1:visits", "10");// 递增操作
redis.incr("user:1:visits"); // 计数增加1// 设置过期时间
redis.setex("otp:123456", 300, "code123"); // 5分钟内有效的验证码// 获取值
String username = redis.get("username");// 判断值是否存在
boolean exists = redis.exists("user:1:visits");
List类型
在Redis中,List(列表)是一种有序的数据结构,它允许你存储一系列的元素,并且可以按照插入顺序保持有序。List的实现方式采用了双向链表,这使得它在插入、删除、查找等操作上都具有良好的性能。以下是关于Redis中List类型的重要特点和用法:
-
有序存储: List类型中的元素按照插入顺序进行存储,保持元素的有序性。这使得List适用于需要保留顺序的数据集合,如消息队列、操作日志等。
-
支持重复元素: 不同于Set类型,List允许存储重复的元素。这在某些场景下是非常有用的,比如记录用户的历史操作。
-
灵活的插入和删除: List支持在头部和尾部插入、删除元素,而且这些操作的时间复杂度都是O(1)。这使得List可以模拟栈和队列等数据结构。
-
范围操作: 你可以对List执行范围操作,比如获取指定范围内的元素。这对于分页、获取最新的N条数据等场景非常有用。
-
阻塞操作: Redis的List还支持阻塞式的弹出操作,即当List为空时,阻塞等待直到有元素可用。这在实现消息队列等高级场景时很有用。
-
应用场景: List类型广泛应用于消息队列、操作日志、发布订阅系统、任务队列等需要有序存储的场景。
示例代码
Tips:了解即可,面试不会让手撸Redis相关代码的,目前各家是这样。如果遇到了就当我没说
// 在列表头部插入元素
redis.lpush("messages", "message1");
redis.lpush("messages", "message2");// 在列表尾部插入元素
redis.rpush("messages", "message3");// 获取列表长度
long length = redis.llen("messages");// 获取指定范围内的元素
List<String> messages = redis.lrange("messages", 0, -1); // 获取全部元素// 弹出并获取列表头部元素
String firstMessage = redis.lpop("messages");// 阻塞式弹出元素
List<String> poppedMessage = redis.blpop(30, "messages"); // 阻塞30秒,等待元素// 删除指定数量的元素
redis.ltrim("messages", 0, 1); // 保留前两个元素,删除其余元素
Set类型
在Redis中,Set(集合)是一种无序的、不允许重复元素的数据结构。它提供了高效的添加、删除、判断元素是否存在等操作,同时支持集合运算,如并集、交集、差集等。以下是关于Redis中Set类型的重要特点和用法:
-
无序性: Set类型的元素是无序的,与插入的顺序无关。这使得Set在判断元素是否存在、去重等操作时非常高效。
-
不允许重复元素: Set中不会存储重复的元素,确保数据的唯一性。这使得Set适用于存储标签、用户兴趣爱好等不重复数据。
-
快速的添加和删除: 向Set中添加元素或从Set中移除元素的时间复杂度都是O(1),这使得Set在需要动态增删元素的场景中表现出色。
-
集合运算: Redis的Set支持集合运算,包括并集、交集、差集等操作。这使得Set可以用来解决一些复杂的数据处理需求,如共同好友、数据筛选等。
-
应用场景: Set类型广泛应用于标签系统、社交网络中的好友关系、投票系统中的投票人、防重复提交等场景。
示例代码
Tips:了解即可,面试不会让手撸Redis相关代码的,目前各家是这样。如果遇到了就当我没说
// 添加元素
redis.sadd("tags", "java");
redis.sadd("tags", "redis");
redis.sadd("tags", "python");// 判断元素是否存在
boolean exists = redis.sismember("tags", "java"); // 返回true// 获取集合中的所有元素
Set<String> tags = redis.smembers("tags");// 移除元素
redis.srem("tags", "python");// 获取集合的大小
long size = redis.scard("tags");// 求两个集合的交集
Set<String> commonTags = redis.sinter("tags1", "tags2");// 求两个集合的并集
Set<String> allTags = redis.sunion("tags1", "tags2");// 求两个集合的差集
Set<String> differentTags = redis.sdiff("tags1", "tags2");
Hash类型
在Redis中,Hash(哈希)是一种用于存储字段与值之间映射关系的数据结构。Hash适用于存储对象的属性,以及需要存储多个键值对的场景。以下是关于Redis中Hash类型的重要特点和用法:
-
映射关系: Hash类型允许你在一个键下存储多个字段(field)和对应的值(value),类似于关联数组或字典。这使得Hash在存储对象的属性或键值对时非常有用。
-
快速访问: Hash的字段名(field)是唯一的,这使得你可以直接通过字段名来快速访问对应的值,时间复杂度是O(1)。
-
适用于存储对象: Hash类型特别适用于存储对象的属性。例如,你可以将用户信息存储在一个以用户ID为键名的Hash中,然后使用字段来存储用户名、年龄、性别等信息。
-
批量操作: Hash支持同时设置、获取、删除多个字段,这使得在一次操作中处理多个属性或键值对非常方便。
-
适用于缓存: 在某些情况下,Hash可以用作缓存数据的数据结构,将缓存键名作为Hash的键,将缓存内容作为字段。
-
应用场景: Hash类型广泛应用于存储用户信息、缓存数据、配置项、商品属性等需要存储键值对映射关系的场景。
示例代码
// 设置Hash字段值
redis.hset("user:1", "username", "john_doe");
redis.hset("user:1", "age", "30");// 获取Hash字段值
String username = redis.hget("user:1", "username");// 获取所有Hash字段和值
Map<String, String> userFields = redis.hgetAll("user:1");// 删除Hash字段
redis.hdel("user:1", "age");// 批量设置Hash字段值
Map<String, String> userInfo = new HashMap<>();
userInfo.put("email", "john@example.com");
userInfo.put("city", "New York");
redis.hmset("user:1", userInfo);// 获取Hash字段数量
long fieldCount = redis.hlen("user:1");// 获取Hash所有字段名
Set<String> fields = redis.hkeys("user:1");// 获取Hash所有字段值
List<String> values = redis.hvals("user:1");
ZSet类型(sorted set)
这里先解释一下Sorted Set(排序集合)为什么被称为Zset类型,这个问题在github上作者进行了解释:我们常规的坐标体系是XY坐标,通常我们加上一个新的维度会被称为Z,三个坐标形成空间坐标系。这里的排序集合比集合多一个维度,这个维度也被称为Z,实际上代指Sorted,所以被称为Zset。
在Redis中,Sorted Set(有序集合)是一种特殊的数据结构,它允许你存储一组元素,每个元素关联一个分数(score),并根据分数对元素进行排序。这使得Sorted Set适用于需要排序和范围查询的场景。以下是关于Redis中Sorted Set类型的重要特点和用法:
-
排序: Sorted Set的元素根据关联的分数进行排序,使得元素可以按照一定顺序存储和检索。
-
不允许重复元素: Sorted Set中的元素是唯一的,不允许重复。但不同元素可以有相同的分数。
-
分数操作: 你可以为Sorted Set中的元素设置分数,然后对元素的分数进行递增、递减操作。这使得Sorted Set可以用于排行榜、计数器等场景。
-
范围查询: Sorted Set支持按照分数范围查询元素,获取某个范围内的元素。这对于获取排行榜中的前N名、获取分数在某个区间的元素等非常有用。
-
集合运算: Sorted Set支持交集、并集、差集等集合运算,使得你可以在有序集合之间进行复杂的操作。
-
应用场景: Sorted Set类型广泛应用于排行榜、计数器、带权重的任务队列等需要有序存储和排序的场景。
示例代码
// 添加元素到有序集合
redis.zadd("leaderboard", 100, "player1");
redis.zadd("leaderboard", 200, "player2");// 获取有序集合中指定范围内的元素(按分数升序)
Set<String> topPlayers = redis.zrange("leaderboard", 0, 2);// 获取有序集合中指定范围内的元素(按分数降序)
Set<String> topPlayersDesc = redis.zrevrange("leaderboard", 0, 2);// 获取有序集合中指定分数范围内的元素
Set<String> highScorers = redis.zrangeByScore("leaderboard", 150, 300);// 获取有序集合中元素的分数
Double playerScore = redis.zscore("leaderboard", "player1");// 增加元素的分数
redis.zincrby("leaderboard", 50, "player1"); // player1的分数增加50// 获取有序集合中元素的排名(按分数从低到高)
Long playerRank = redis.zrank("leaderboard", "player1");// 删除有序集合中的元素
redis.zrem("leaderboard", "player2");
3中拓展类型
HyperLogLog
HyperLogLog是一种概率性的数据结构,用于近似地计数一个集合中不同元素的数量。它的特点是速度快,占用空间小(12KB)。但是计算存会在误差,标准误差为0.81%。它在内存占用方面非常高效,适用于需要大规模、高效地进行基数估计(distinct count estimation)的场景。以下是关于HyperLogLog的重要特点和用法:
-
基数估计: HyperLogLog主要用于估计一个集合中不同元素的数量,也被称为基数(cardinality)估计。它通过使用特定的算法和数据结构,能够以较小的内存占用获得接近准确的估计结果。
-
固定内存占用: HyperLogLog使用固定大小的内存来存储数据,不随集合大小线性增长。这使得它非常适合处理大规模数据集合的基数估计需求。
-
概率性估计: HyperLogLog提供的估计结果是概率性的,即其估计值在一定置信度下是准确的。通常情况下,HyperLogLog的估计误差可以控制在2%左右。
-
不支持元素的添加和删除: HyperLogLog不支持添加或删除元素,它仅用于计数元素的数量。如果需要动态变化的计数,需要结合其他数据结构来实现。
-
应用场景: HyperLogLog适用于需要统计独立元素数量的场景,如统计网站的独立访客数(UV)、统计用户兴趣标签数、统计搜索词的不同个数等。
示例代码
// 添加元素到HyperLogLog
redis.pfadd("visitors", "user1");
redis.pfadd("visitors", "user2");// 估计基数
long estimatedCount = redis.pfcount("visitors");// 合并多个HyperLogLog
redis.pfmerge("combined_visitors", "visitors1", "visitors2", "visitors3");
需要注意的是,虽然HyperLogLog在估计基数方面非常高效,但它不适用于需要精确计数的场景。如果你需要准确的基数计数,可能需要使用其他方法,如使用Set类型进行计数,但这会占用更多的内存。
Bitmaps
Bitmaps(位图)是一种非常紧凑的数据结构,用于存储二进制位的序列,其中每个位都可以是0或1。在Redis中,Bitmaps被用于表示一系列状态或标记,如用户的在线状态、用户的签到记录等。以下是关于Redis中Bitmaps的重要特点和用法:
-
紧凑存储: Bitmaps以非常紧凑的方式存储数据,每个位占用一个比特位(bit),因此在存储大规模数据时非常节省内存。
-
快速的位操作: Bitmaps支持位级别的操作,如设置位、获取位、位与、位或、位异或等操作。这使得Bitmaps在处理状态标记等操作时非常高效。
-
应用于标记和计数: Bitmaps常用于标记某些状态,如用户的在线状态(在线为1,离线为0)、用户的签到记录(签到为1,未签到为0)等。同时,你可以通过位操作来进行计数,比如计算一段时间内的签到次数。
-
非常适合大规模数据: 由于紧凑的存储方式,Bitmaps特别适用于处理大规模数据的状态标记和计数需求。
-
应用场景: Bitmaps广泛应用于在线状态的跟踪、用户签到记录、活跃用户的标记、访问控制列表(ACL)等场景。
示例代码
// 设置位(用户签到)
redis.setbit("user:123:signins", 5, 1); // 用户123在第5天签到// 获取位(检查用户是否签到)
boolean hasSignedIn = redis.getbit("user:123:signins", 5) == 1; // 用户123在第5天签到// 位操作(计算连续签到次数)
long consecutiveSignIns = redis.bitcount("user:123:signins", 0, -1); // 计算全部位中值为1的位数// 位操作(计算某段时间内的签到次数)
long signInsInLastWeek = redis.bitcount("user:123:signins", 0, 6); // 计算前7天内签到次数
GeoSpatial
在Redis中,GeoSpatial(地理空间)数据结构用于存储地理位置信息,并支持查询附近位置、计算距离等功能。GeoSpatial数据结构是通过ZSET(有序集合)类型来实现的,其中每个元素是一个地理位置,关联一个分数(score)作为该位置的权重。为了能高效地对经纬度进行比较,Redis 采用了业界广泛使用的 GeoHash 编码方法,有关GeoHash介绍可以看我之前的文章:Elasticsearch储存地理位置原理—GeoHash实现介绍_es geohash_程序员麻薯的博客-CSDN博客https://blog.csdn.net/qq_20051535/article/details/119582547以下是关于Redis中GeoSpatial的重要特点和用法:
-
地理位置存储: GeoSpatial数据结构允许你将地理位置信息(经度、纬度)作为元素存储在有序集合中。
-
距离计算: 你可以使用GeoSpatial数据结构来计算两个地理位置之间的距离,以及根据距离进行查询。
-
查询附近位置: 通过指定一个中心位置和一个半径,你可以查询距离该中心位置在指定半径内的地理位置。
-
位置范围查询: 除了半径查询,还可以进行矩形范围查询,查找在指定矩形区域内的地理位置。
-
应用场景: GeoSpatial数据结构广泛应用于地理位置服务、附近商家查询、地理位置消息推送等场景。
示例代码
// 添加地理位置
redis.geoadd("locations", 13.361389, 38.115556, "Palermo");
redis.geoadd("locations", 15.087269, 37.502669, "Catania");// 计算两个地理位置之间的距离(单位:米)
double distance = redis.geodist("locations", "Palermo", "Catania", GeoUnit.METERS);// 查询附近地理位置
List<GeoRadiusResponse> nearbyLocations = redis.georadius("locations", 15, 37, 200, GeoUnit.KILOMETERS);// 查询矩形范围内的地理位置
List<GeoRadiusResponse> locationsInRectangle = redis.georadiusByBox("locations", 13, 37, 15, 39, GeoUnit.KILOMETERS);
相关文章:

Redis的8种数据结构和应用场景介绍,面试题答案
面试原题:你用过Redis哪些数据结构?(网易一面 2023)(面试题来自牛客网) 参考答案 后面有 详细答案解析,帮助更快记忆~ 参考答案共652字符,阅读约需1分8秒;全文共8694字符,阅读约需…...

Log4Qt日志框架(1)- 引入到QT中
Log4Qt日志框架(1)- 引入到QT中 1 下载源码2 简介3 加入到自己的项目中3.1 使用库文件3.2 引入源文件 4 说明 1 下载源码 github:https://github.com/MEONMedical/Log4Qt 官方(版本较老):https://sourceforge.net/projects/log4q…...

【算法刷题之哈希表篇(1)】
目录 1.哈希表基础理论2.leetcode-242. 有效的字母异位词(1)方法一:排序(2)方法二:哈希表 3.leetcode-349. 两个数组的交集(1)方法一:哈希表(2)方…...

uni-app 打包生成签名Sha1
Android平台打包发布apk应用,需要使用数字证书(.keystore文件)进行签名,用于表明开发者身份。 可以使用JRE环境中的keytool命令生成。以下是windows平台生成证书的方法: 安装JRE环境(推荐使用JRE8环境&am…...
【Django】Django创建一个文件下载服务
当使用Django创建一个下载服务时,您可以设置一个视图来处理文件下载请求,并根据您的需求提供文件下载链接。以下是一个简单的示例,演示如何在Django中实现基本的文件下载服务: 创建Django项目和应用: 首先,…...

Navicat for Mysql 显示 emoji 表情符号乱码问题 — 其它乱码情况都可参考
系统环境: 操作系统:MAC OS 10.11.6 MySQL:Server version: 5.6.21 MySQL Community Server (GPL) Navicat for MySQL: version 9.3.1 - standard 1、问题发现 在客户端执行用户注册,用户名包括 emoji 表情符号,注册完…...

《数字图像处理-OpenCV/Python》连载(2)目录
《数字图像处理-OpenCV/Python》连载(2)目录 本书京东优惠购书链接:https://item.jd.com/14098452.html 本书CSDN独家连载专栏:https://blog.csdn.net/youcans/category_12418787.html 第一部分 OpenCV-Python的基本操作 第1章 …...
Go学习-Day4
文章目录 Go学习-Day4函数值传递,引用传递常用的函数 异常处理数组Slice切片 Go学习-Day4 个人博客:CSDN博客 函数 值传递,引用传递 值传递直接拷贝值,一般是基本数据类型,数组,结构体也是引用传递传递…...
将el-dialog封装成函数调用
1、 使用Vue实例化方法 // MyDialog.js import Vue from vue export const openFormDialog function ({ props {}, events {} }) {const vm new Vue({data () {return {form: {}}},render () {return (<el-dialogvisible{true}{...{ props }}{...{ on: events }}onClos…...

Windows10批处理命令行设置环境变量笔记,无需重新安装python与chrome
近期,工作中经常安装、部署python生产、开发环境,比较麻烦,也没有心情去优化。突然,我的电脑崩溃了,在重新安装电脑的过程中,保留了原来的安装软件(有的没有放在系统盘中)࿰…...
统计学补充概念07-比较树
概念 在层次聚类中,聚类结果可以以树状结构表示,通常称为树状图(Dendrogram)。树状图展示了数据点如何被合并或分裂以形成聚类的层次结构。通过观察树状图,可以更直观地理解数据点之间的相似性和关系。 在比较树状图…...
设计原则 --《设计模式之美》总结篇
本文是阅读《设计模式之美》的总结和心得,跳过了书中对面试和工作用处不大或不多的知识点,总结总共分为三章,分别是面对对象编程范式、设计原则和设计模式。 设计模式是代码设计时的一些经验总结。相比于设计模式,设计原则更抽象。…...

Day16-蜗牛影城后端开发
蜗牛影城后端开发 一 多表关联查询 电影集合movie的type(类别)字段关联到电影类别movieType表的_id(主键) 二 蜗牛影城后端开发 1 数据的导入导出 2 用户模块 UserModel.js //导入mongoose,并解构出Schema(类)和model(对象) const {Schema,model} =...

axios / fetch 实现 stream 流式请求
axios 是一个支持node端和浏览器端的易用、简洁且高效的http库。本文主要介绍 axios 如何实现 stream 流式请求,注意这里需要区分 node 环境和浏览器环境。 一、node端 代码演示: const axios require(axios);axios({method: get,url: http://tiven.c…...

Pytorch学习:torchvison.transforms常用包(ToTensor、Resize、Compose和RandomCrop)
torchvision.transforms常用包 1. torchvision.transforms.ToTensor2. torchvision.transforms.Resize3. torchvision.transforms.Compose4. torchvision.transforms.Normalize5. torchvision.transforms.RandomCrop 1. torchvision.transforms.ToTensor 将PIL Image或ndarray…...

算法通关村十二关 | 字符串转换
1. 转换小写字母 LeetCode709:给你一个字符串s,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。 每个字母都是有确定的ASCII的,可以根据码表操作子字符串,常见的ASCII范围是: a-z: 97-122, …...

前端进阶Html+css09----BFC模型
1.什么是BFC模型 全称是:Block formatting context(块级格式化上下文),是一个独立的布局环境,不受外界的影响。 2.FC,BFC,IFC 元素在标准流里都属于一个FC(Formatting Context)。 块级元素的布…...

重排链表(C语言)
题目: 示例: 思路: 这题我们将使用栈解决这个问题,利用栈先进后出的特点,从链表的中间位置进行入栈,寻找链表的中间位置参考:删除链表的中间节点,之后从头开始进行连接。 本题使用…...

el-table动态合并单元格
el-table使用这个方法合并单元格,:span-method“hbcell” <el-table size"small" :data"table.data" border empty-text"暂无数据" :cell-style"cellStyle" :header-cell-style"tableHeaderColor":span-meth…...
html元素
文章目录 html基本结构属性语义化为什么要语义化 示例head中属性样式一些概念块级元素与行级元素空白折叠 html编程没有css的html显示逻辑 html基本结构 html基本单元就是元素,每个元素有标记和属性,如: <a href"...">www&…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...
怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)
+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...

聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇
根据 QYResearch 发布的市场报告显示,全球市场规模预计在 2031 年达到 9848 万美元,2025 - 2031 年期间年复合增长率(CAGR)为 3.7%。在竞争格局上,市场集中度较高,2024 年全球前十强厂商占据约 74.0% 的市场…...