Redis的8种数据结构和应用场景介绍,面试题答案

news2024/11/16 1:55:09

面试原题:你用过Redis哪些数据结构?(网易一面 · 2023)(面试题来自牛客网)

参考答案 后面有 详细答案解析,帮助更快记忆~

参考答案共652字符,阅读约需1分8秒;全文共8694字符,阅读约需7分14秒


参考答案

Redis是一种流行的内存数据库,支持多种数据结构,用于不同的用途。下面我将介绍Redis的5个基础数据结构和3个特殊数据结构:

基础数据结构:

  1. String(字符串): 这是最基本的数据结构,用于存储文本或二进制数据。它可以存储任何类型的数据,比如字符串、整数、浮点数等。常用于缓存、计数器等场景。

  2. List(列表): 列表是一个有序的字符串集合,可以在列表的头部或尾部添加、删除元素。它支持双向的插入和删除操作,可以用于实现队列、栈等数据结构。

  3. Set(集合): 集合是一个无序的、不重复的字符串集合。可以进行交集、并集、差集等集合操作,适用于需要快速判断某个元素是否存在的场景。

  4. Hash(哈希): 哈希存储了字段与值的映射关系,类似于一个关联数组。适用于存储对象的属性或者键值对。

  5. Sorted Set(有序集合): 有序集合是一种在集合的基础上,为每个元素关联一个分数,然后根据分数对元素进行排序。适用于排行榜、范围查找等场景。

特殊数据结构:

  1. HyperLogLog: HyperLogLog用于近似地计算一个集合中不重复元素的数量。它的内存占用非常小,适用于需要高效计数的场景,比如统计网站的UV(Unique Visitors)。

  2. Bitmaps: 位图是一种特殊的数据结构,每个位代表一个状态。它可以用于存储某种状态的标记,比如用户的签到记录、在线状态等。

  3. GeoSpatial(地理空间): Redis支持对地理位置信息的存储和查询,可以用来存储地理位置坐标,然后进行附近位置搜索等。

在面试中,对于每种数据结构,你可以结合实际项目经验,提供你是如何使用这些数据结构解决问题的例子,以展示你的理解和实际应用能力。


答案解析

5种基础类型

很多答案给的不全的大多只有五种,这五种也是我们最了解的类型。其中一些重要的特性(比如:SDS等)我们会在其他的文章有详细的介绍。

String类型

当在Redis中提到"String"类型时,它实际上是一种基本的数据结构,用于存储文本或二进制数据。尽管名字叫做"String",但它不仅仅限于存储字符串,还可以存储整数和浮点数等不同类型的数据。以下是一些关于Redis中String类型的重要特点和用法:

  1. 存储: Redis的String类型可以存储多种数据类型,包括纯文本字符串、整数、浮点数等。存储的数据可以是字节级别的二进制数据,这使得它在缓存和存储各种数据格式时非常有用。

  2. 高效操作: Redis中的String类型支持O(1)时间复杂度的基本操作,如获取、设置、追加、递增、递减等。这使得它在计数器、缓存、会话管理等方面非常高效。

  3. 过期时间: 你可以为存储在String类型中的数据设置过期时间。这为实现短期缓存、验证码过期等场景提供了便利。

  4. 位操作: Redis的String类型支持位级别的操作,包括位与、位或、位异或等,这使得它在处理位图(Bitmaps)等场景非常有用。

  5. 实时计算: 由于String类型支持递增和递减操作,你可以在Redis中执行原子性的计数操作,比如计数在线用户数、点赞数等。

  6. 分布式锁: 你可以使用String类型来实现分布式锁,利用其设置值时的原子性和过期时间特性,确保在分布式环境下的互斥操作。

  7. 应用场景: 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类型的重要特点和用法:

  1. 有序存储: List类型中的元素按照插入顺序进行存储,保持元素的有序性。这使得List适用于需要保留顺序的数据集合,如消息队列、操作日志等。

  2. 支持重复元素: 不同于Set类型,List允许存储重复的元素。这在某些场景下是非常有用的,比如记录用户的历史操作。

  3. 灵活的插入和删除: List支持在头部和尾部插入、删除元素,而且这些操作的时间复杂度都是O(1)。这使得List可以模拟栈和队列等数据结构。

  4. 范围操作: 你可以对List执行范围操作,比如获取指定范围内的元素。这对于分页、获取最新的N条数据等场景非常有用。

  5. 阻塞操作: Redis的List还支持阻塞式的弹出操作,即当List为空时,阻塞等待直到有元素可用。这在实现消息队列等高级场景时很有用。

  6. 应用场景: 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类型的重要特点和用法:

  1. 无序性: Set类型的元素是无序的,与插入的顺序无关。这使得Set在判断元素是否存在、去重等操作时非常高效。

  2. 不允许重复元素: Set中不会存储重复的元素,确保数据的唯一性。这使得Set适用于存储标签、用户兴趣爱好等不重复数据。

  3. 快速的添加和删除: 向Set中添加元素或从Set中移除元素的时间复杂度都是O(1),这使得Set在需要动态增删元素的场景中表现出色。

  4. 集合运算: Redis的Set支持集合运算,包括并集、交集、差集等操作。这使得Set可以用来解决一些复杂的数据处理需求,如共同好友、数据筛选等。

  5. 应用场景: 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类型的重要特点和用法:

  1. 映射关系: Hash类型允许你在一个键下存储多个字段(field)和对应的值(value),类似于关联数组或字典。这使得Hash在存储对象的属性或键值对时非常有用。

  2. 快速访问: Hash的字段名(field)是唯一的,这使得你可以直接通过字段名来快速访问对应的值,时间复杂度是O(1)。

  3. 适用于存储对象: Hash类型特别适用于存储对象的属性。例如,你可以将用户信息存储在一个以用户ID为键名的Hash中,然后使用字段来存储用户名、年龄、性别等信息。

  4. 批量操作: Hash支持同时设置、获取、删除多个字段,这使得在一次操作中处理多个属性或键值对非常方便。

  5. 适用于缓存: 在某些情况下,Hash可以用作缓存数据的数据结构,将缓存键名作为Hash的键,将缓存内容作为字段。

  6. 应用场景: 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类型的重要特点和用法:

  1. 排序: Sorted Set的元素根据关联的分数进行排序,使得元素可以按照一定顺序存储和检索。

  2. 不允许重复元素: Sorted Set中的元素是唯一的,不允许重复。但不同元素可以有相同的分数。

  3. 分数操作: 你可以为Sorted Set中的元素设置分数,然后对元素的分数进行递增、递减操作。这使得Sorted Set可以用于排行榜、计数器等场景。

  4. 范围查询: Sorted Set支持按照分数范围查询元素,获取某个范围内的元素。这对于获取排行榜中的前N名、获取分数在某个区间的元素等非常有用。

  5. 集合运算: Sorted Set支持交集、并集、差集等集合运算,使得你可以在有序集合之间进行复杂的操作。

  6. 应用场景: 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的重要特点和用法:

  1. 基数估计: HyperLogLog主要用于估计一个集合中不同元素的数量,也被称为基数(cardinality)估计。它通过使用特定的算法和数据结构,能够以较小的内存占用获得接近准确的估计结果。

  2. 固定内存占用: HyperLogLog使用固定大小的内存来存储数据,不随集合大小线性增长。这使得它非常适合处理大规模数据集合的基数估计需求。

  3. 概率性估计: HyperLogLog提供的估计结果是概率性的,即其估计值在一定置信度下是准确的。通常情况下,HyperLogLog的估计误差可以控制在2%左右。

  4. 不支持元素的添加和删除: HyperLogLog不支持添加或删除元素,它仅用于计数元素的数量。如果需要动态变化的计数,需要结合其他数据结构来实现。

  5. 应用场景: 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的重要特点和用法:

  1. 紧凑存储: Bitmaps以非常紧凑的方式存储数据,每个位占用一个比特位(bit),因此在存储大规模数据时非常节省内存。

  2. 快速的位操作: Bitmaps支持位级别的操作,如设置位、获取位、位与、位或、位异或等操作。这使得Bitmaps在处理状态标记等操作时非常高效。

  3. 应用于标记和计数: Bitmaps常用于标记某些状态,如用户的在线状态(在线为1,离线为0)、用户的签到记录(签到为1,未签到为0)等。同时,你可以通过位操作来进行计数,比如计算一段时间内的签到次数。

  4. 非常适合大规模数据: 由于紧凑的存储方式,Bitmaps特别适用于处理大规模数据的状态标记和计数需求。

  5. 应用场景: 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的重要特点和用法:

  1. 地理位置存储: GeoSpatial数据结构允许你将地理位置信息(经度、纬度)作为元素存储在有序集合中。

  2. 距离计算: 你可以使用GeoSpatial数据结构来计算两个地理位置之间的距离,以及根据距离进行查询。

  3. 查询附近位置: 通过指定一个中心位置和一个半径,你可以查询距离该中心位置在指定半径内的地理位置。

  4. 位置范围查询: 除了半径查询,还可以进行矩形范围查询,查找在指定矩形区域内的地理位置。

  5. 应用场景: 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);

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

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

相关文章

vscode打开nvue,vue3语法文件爆红

由于之前一直是用的vue2&#xff0c;也没用过nvue文件&#xff0c;这次下了hbulider的vue3云模板练手&#xff0c;图快直接在vscode的设置里的关联语言加上了 "files.associations": {// 文件关联语言的优先级配置"*.vue": "vue","*.nvue&…

解决多模块开发中的问题(聚合继承)

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaweb 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 Maven 一、聚合1.1创建Maven模块&#xff0c;设置打包类型…

特斯拉Cybertruck卡车实物照流出,今年 9月可交付?配置报价待定

根据最新的消息&#xff0c;特斯拉的Cybertruck目前正在冰岛的一座冰川上进行路测&#xff0c;并且据称特斯拉的团队还在利用这辆车拍摄相关的广告海报。这进一步表明特斯拉已经进入了Cybertruck的最后测试阶段&#xff0c;并且准备在今年9月底开始交付。然而&#xff0c;有外媒…

MyBatis的基本入门及Idea搭建MyBatis坏境且如何一步骤实现增删改查(CRUD)---详细介绍

一&#xff0c;MaBatis是什么&#xff1f; 首先是一个开源的Java持久化框架&#xff0c;它可以帮助开发人员简化数据库访问的过程并提供了一种将SQL语句与Java代码进行解耦的方式&#xff0c;使得开发人员可以更加灵活地进行数据库操作。 1.1 Mabatis 受欢迎的点 MyBatis不仅是…

使用 OpenTelemetry 构建可观测性 04 - 收集器

在之前的博文中&#xff0c;我们讨论了如何使用 SDK 和链路追踪生产者来导出进程中的遥测数据。尽管有多种类型的导出器可供选择&#xff0c;但其中一个常见的目标是将数据导出到 OpenTelemetry Collector。本篇文章将深入探讨收集器以及如何使用它。 选 OTel Collector 还是…

激活函数总结(十五):振荡系列激活函数补充(SQU、NCU、DSU、SSU)

激活函数总结&#xff08;十五&#xff09;&#xff1a;激活函数补充 1 引言2 激活函数2.1 Shifted Quadratic Unit (SQU) 激活函数2.2 Non-Monotonic Cubic Unit (NCU) 激活函数2.3 Decaying Sine Unit (DSU) 激活函数2.4 Shifted Sinc Unit (SSU) 激活函数 3. 总结 1 引言 在…

豪越科技受邀出席2023中国算力大会

2023年8月17日-8月20日&#xff0c;“算汇银川 数创未来”创新中国行走进银川暨2023中国算力大会在银川中关村创新中心召开。政府领导、行业领袖、专家学者、以及大型科技企业负责人齐聚大会现场&#xff0c;围绕算力基础设施建设、创新应用和产业发展成果等方面开展广泛交流与…

NSF拨款3800万美元让更多机构参与量子科学与工程

近日&#xff0c;美国国家科学基金会&#xff08;National Science Foundation&#xff0c;NSF&#xff09;宣布对“量子信息科学与工程扩展能力”&#xff08;Expanding Capacity in Quantum Information Science and Engineering&#xff0c;ExpandQISE&#xff09;计划拨款3…

好消息,微信又有免费提现活动了

​明天就是一年一度的七夕佳节&#xff0c;微信推出了「浪漫七夕&#xff0c;情寄明灯」活动&#xff0c;凡参与活动都可获得免费提现券等奖励。 01 活动时间 8 月 21 日 10 点至 8 月 24 日 24 点。 02 如何参与 活动入口&#xff1a; 在「微信支付有优惠」小程序专属入口…

解读2023年上半年财报:继续押注儿童业务的361°,有着怎样的野心?

“足球热”的风还是吹到了青少年身边&#xff0c;近日&#xff0c;济南历城二中女足问鼎2023世界中学生足球锦标赛女子组冠军&#xff0c;中国球队时隔16年再次获得世界中学生足球锦标赛冠军&#xff0c;点燃了不少足球爱好者的热情。 少儿体育热之下&#xff0c;与之相关的运…

Php“牵手”淘宝商品销量数据采集方法,淘宝API接口申请指南

淘宝天猫商品销量接口 API 是开放平台提供的一种 API 接口&#xff0c;它可以帮助开发者获取商品的详细信息&#xff0c;包括商品的标题、描述、图片&#xff0c;月销量&#xff0c;总销量等信息。在电商平台的开发中&#xff0c;销量接口API是非常常用的 API&#xff0c;因此本…

20英镑以上免费吗?英国亚马逊上调当日达订单免配送费门槛!

据外媒报道&#xff0c;英国亚马逊向Prime会员发送了一封电子邮件&#xff0c;通知他们从下个月开始必须为小额当日达订单支付运费。 亚马逊在向Prime用户发送的电子邮件中称&#xff0c;目前&#xff0c;其向符合条件的邮政编码内的Prime会员提供免费当日送达服务。 不过&am…

机器学习,过拟合与欠拟合,正则化与交叉验证

目录 机器学习 过拟合与欠拟合 正则化与交叉验证 正则化 交叉验证 机器学习 的目的是使学到的模型不仅对已知数据而且对未知数据都能有很好的预测能力。 不同的机器学习方法会给出不同的模型。当损失函数给定时&#xff0c;基于损失函数的模型的训练误差&#xff08;tra…

Gear_Of_War靶机

靶场下载 https://www.vulnhub.com/entry/gears-of-war-ep1%2C382/ 一、信息收集 发现主机 nmap -sP 192.168.16.0/24获取开放端口等信息 nmap -sV -sC -A -p 1-65535 192.168.16.207扫描目录没有发现 二、445端口利用 工具一&#xff1a;smbma 扫描共享状态信息 smbm…

Qbytearray:从十六进制字符串转字节一些注意事项

1、从十六进制字符串转字节后&#xff0c;按字节使用时 QByteArray data QByteArray::fromHex("cc94");printf("%x %x\n",data.at(0),data.at(0)&0xff);//若超过127&#xff0c;会不一样printf("%d %d\n",data.at(0),data.at(0)&0xff);…

Redis Lua脚本执行原理和语法示例

Redis Lua脚本语法示例 文章目录 Redis Lua脚本语法示例0. 前言参考资料 1. Redis 执行Lua脚本原理1.1. 对Redis源码中嵌入Lua解释器的简要解析&#xff1a;1.2. Redis Lua 脚本缓存机制 2. Redis Lua脚本示例1.1. 场景示例1. 请求限流2. 原子性地从一个list移动元素到另一个li…

matlab使用教程(18)—多项式的定义和运算

1.创建并计算多项式 此示例说明如何在 MATLAB 中将多项式表示为向量以及根据相关点计算多项式。 1.1 表示多项式 MATLAB 将多项式表示为行向量&#xff0c;其中包含按降幂排序的系数。例如&#xff0c;三元素向量 p [p2 p1 p0]; 表示多项式 创建一个向量以表示二次多项式…

一文看懂!数据管道和数据流在数据分析中的作用

当我们谈论数据分析时&#xff0c;我们通常会想到一系列的步骤&#xff0c;包括数据收集、数据清洗、数据分析和数据可视化等。然而&#xff0c;在这些步骤中&#xff0c;有两个非常重要的概念&#xff1a;数据管道和数据流。这两个概念在数据分析过程中起着至关重要的作用。本…

Vue3组合式API详解 - 大型应用的高端写法

目录 01-setup方法与script_setup及ref响应式02-事件方法_计算属性_reactive_toRefs03-生命周期_watch_watchEffect04-跨组件通信方案provide_inject05-复用组件功能之use函数06-利用defineProps与defineEmits进行组件通信 01-setup方法与script_setup及ref响应式 在Vue3.1版本…

图片怎么转换成pdf格式?可以试试这样转换

图片怎么转换成pdf格式&#xff1f;图片转换成PDF格式是一个常见的需求&#xff0c;无论是为了方便存储还是为了分享文件&#xff0c;将图片转换成PDF格式都是一个不错的选择。有许多软件和在线工具可以帮助你完成这个任务&#xff0c;下面就给大家介绍一款转换工具。 【迅捷PD…