当前位置: 首页 > news >正文

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

面试原题:你用过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);

相关文章:

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

面试原题&#xff1a;你用过Redis哪些数据结构&#xff1f;&#xff08;网易一面 2023&#xff09;(面试题来自牛客网) 参考答案 后面有 详细答案解析&#xff0c;帮助更快记忆~ 参考答案共652字符&#xff0c;阅读约需1分8秒&#xff1b;全文共8694字符&#xff0c;阅读约需…...

Log4Qt日志框架(1)- 引入到QT中

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

【算法刷题之哈希表篇(1)】

目录 1.哈希表基础理论2.leetcode-242. 有效的字母异位词&#xff08;1&#xff09;方法一&#xff1a;排序&#xff08;2&#xff09;方法二&#xff1a;哈希表 3.leetcode-349. 两个数组的交集&#xff08;1&#xff09;方法一&#xff1a;哈希表&#xff08;2&#xff09;方…...

uni-app 打包生成签名Sha1

Android平台打包发布apk应用&#xff0c;需要使用数字证书&#xff08;.keystore文件&#xff09;进行签名&#xff0c;用于表明开发者身份。 可以使用JRE环境中的keytool命令生成。以下是windows平台生成证书的方法&#xff1a; 安装JRE环境&#xff08;推荐使用JRE8环境&am…...

【Django】Django创建一个文件下载服务

当使用Django创建一个下载服务时&#xff0c;您可以设置一个视图来处理文件下载请求&#xff0c;并根据您的需求提供文件下载链接。以下是一个简单的示例&#xff0c;演示如何在Django中实现基本的文件下载服务&#xff1a; 创建Django项目和应用&#xff1a; 首先&#xff0c…...

Navicat for Mysql 显示 emoji 表情符号乱码问题 — 其它乱码情况都可参考

系统环境&#xff1a; 操作系统&#xff1a;MAC OS 10.11.6 MySQL&#xff1a;Server version: 5.6.21 MySQL Community Server (GPL) Navicat for MySQL: version 9.3.1 - standard 1、问题发现 在客户端执行用户注册&#xff0c;用户名包括 emoji 表情符号&#xff0c;注册完…...

《数字图像处理-OpenCV/Python》连载(2)目录

《数字图像处理-OpenCV/Python》连载&#xff08;2&#xff09;目录 本书京东优惠购书链接&#xff1a;https://item.jd.com/14098452.html 本书CSDN独家连载专栏&#xff1a;https://blog.csdn.net/youcans/category_12418787.html 第一部分 OpenCV-Python的基本操作 第1章 …...

Go学习-Day4

文章目录 Go学习-Day4函数值传递&#xff0c;引用传递常用的函数 异常处理数组Slice切片 Go学习-Day4 个人博客&#xff1a;CSDN博客 函数 值传递&#xff0c;引用传递 值传递直接拷贝值&#xff0c;一般是基本数据类型&#xff0c;数组&#xff0c;结构体也是引用传递传递…...

将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

近期&#xff0c;工作中经常安装、部署python生产、开发环境&#xff0c;比较麻烦&#xff0c;也没有心情去优化。突然&#xff0c;我的电脑崩溃了&#xff0c;在重新安装电脑的过程中&#xff0c;保留了原来的安装软件&#xff08;有的没有放在系统盘中&#xff09;&#xff0…...

统计学补充概念07-比较树

概念 在层次聚类中&#xff0c;聚类结果可以以树状结构表示&#xff0c;通常称为树状图&#xff08;Dendrogram&#xff09;。树状图展示了数据点如何被合并或分裂以形成聚类的层次结构。通过观察树状图&#xff0c;可以更直观地理解数据点之间的相似性和关系。 在比较树状图…...

设计原则 --《设计模式之美》总结篇

本文是阅读《设计模式之美》的总结和心得&#xff0c;跳过了书中对面试和工作用处不大或不多的知识点&#xff0c;总结总共分为三章&#xff0c;分别是面对对象编程范式、设计原则和设计模式。 设计模式是代码设计时的一些经验总结。相比于设计模式&#xff0c;设计原则更抽象。…...

Day16-蜗牛影城后端开发

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

axios / fetch 实现 stream 流式请求

axios 是一个支持node端和浏览器端的易用、简洁且高效的http库。本文主要介绍 axios 如何实现 stream 流式请求&#xff0c;注意这里需要区分 node 环境和浏览器环境。 一、node端 代码演示&#xff1a; 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&#xff1a;给你一个字符串s&#xff0c;将该字符串中的大写字母转换成相同的小写字母&#xff0c;返回新的字符串。 每个字母都是有确定的ASCII的&#xff0c;可以根据码表操作子字符串&#xff0c;常见的ASCII范围是&#xff1a; a-z: 97-122, …...

前端进阶Html+css09----BFC模型

1.什么是BFC模型 全称是&#xff1a;Block formatting context&#xff08;块级格式化上下文&#xff09;&#xff0c;是一个独立的布局环境&#xff0c;不受外界的影响。 2.FC,BFC,IFC 元素在标准流里都属于一个FC&#xff08;Formatting Context&#xff09;。 块级元素的布…...

重排链表(C语言)

题目&#xff1a; 示例&#xff1a; 思路&#xff1a; 这题我们将使用栈解决这个问题&#xff0c;利用栈先进后出的特点&#xff0c;从链表的中间位置进行入栈&#xff0c;寻找链表的中间位置参考&#xff1a;删除链表的中间节点&#xff0c;之后从头开始进行连接。 本题使用…...

el-table动态合并单元格

el-table使用这个方法合并单元格&#xff0c;: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基本单元就是元素&#xff0c;每个元素有标记和属性&#xff0c;如&#xff1a; <a href"...">www&…...

push github

一、生成密钥 打开git bash执行下面指令&#xff0c;Enter下一步Enter下一步..生成ssh key 密钥&#xff1b; ssh-keygen -t rsa 二、 复制公共密钥到git hub 登录github&#xff0c;在选项setting >> SSH and GPG key >> add new ssh添加刚才的公钥地址即可 验证…...

iFluor 594 Styramide是一种荧光染料,常用于生物分子标记和成像

试剂 | 基础知识概述&#xff08;部分&#xff09;: 中文名称&#xff1a;Alexa Fluor 594酪Styramide 分子量&#xff1a;1341.71 胺的优异替代品 100 Slides 英文名称&#xff1a;iFluor 594 Ex (nm)&#xff1a;588 Em (nm)&#xff1a;604 规格标准&#xff1a;1g&am…...

动态规划入门之01背包变形嗑药

P1802 5 倍经验日 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 嗑药固然可耻&#xff0c;但是能让你快速变强 --鲁迅 手动滑稽&#xff0c;话归正题 动态规划之背包入门01背包模板_爱莉我老婆的博客-CSDN博客 这是01背包的模板&#xff0c;没看的可以去看看。 我们把…...

数据结构——栈和队列OJ题

栈和队列小提升&#xff01; 前言一、用队列实现栈队列接口实现&#xff08;1&#xff09;栈的接口定义&#xff08;2&#xff09;栈的初始化&#xff08;3&#xff09;入栈函数的定义&#xff08;4&#xff09;出栈函数的定义&#xff08;5&#xff09;查找栈顶元素&#xff0…...

同态排序算法

参考文献&#xff1a; [Batcher68] Batcher K E. Sorting networks and their applications[C]//Proceedings of the April 30–May 2, 1968, spring joint computer conference. 1968: 307-314. [SV11] Smart, N.P., Vercauteren, F.: Fully homomorphic SIMD operations. IA…...

“深入探索JVM内部机制:解析Java虚拟机的工作原理“

标题&#xff1a;深入探索JVM内部机制&#xff1a;解析Java虚拟机的工作原理 摘要&#xff1a;本文将介绍Java虚拟机&#xff08;JVM&#xff09;的工作原理&#xff0c;包括类加载、内存管理、垃圾回收和字节码执行等方面。通过深入理解JVM的内部机制&#xff0c;开发人员可以…...

为应用程序接入阿里云CDN优化网站访问速度

文章目录 1.KodCloud云盘系统接入CDN之前的效果2.配置KodCloud云盘接入CDN加速器2.1.添加CDN域名2.2.配置域名信息2.3.CDN推荐配置设置2.4.CDN加速器配置完成 3.配置云解析DNS增加CDN域名的解析4.为CDN加速器配置HTTPS5.验证网站是否接入CDN6.访问应用程序观察请求速度7.观察CD…...

索引设计规范

索引是帮助数据库高效获取数据的数据结构。索引是加速查询的常用技术手段。在设计索引时&#xff0c;要遵循索引设计规范&#xff0c;避免不必要的踩坑。 【推荐】索引存储结构推荐BTREE InnoDB和MyISAM存储引擎表&#xff0c;索引类型必须为BTRER&#xff0c;MEMORY表可以根…...

Appium 2安装与使用java对Android进行自动化测试

文章目录 1、Appium 2.1安装1.1、系统要求1.2、安装Appium2.1服务1.3、安装UiAutomator2驱动1.4、安装Android SDK platform tools1.5、下载OpenJDK 2、Android自动代码例子2.1、安装Android自动化测试元素定位工具Appium Inspector2.2、编写android app自动化测试代码和使用ex…...

小程序运营方式有哪些?如何构建小程序运营框架?

​如今&#xff0c;每个企业基本都做过至少一个小程序&#xff0c;但由于小程序本身不具备流量、也很少有自然流量&#xff0c;因此并不是每个企业都懂如何运营小程序。想了解小程序运营方式方法有哪些&#xff1f; 在正式运营小程序前&#xff0c;了解小程序的功能与企业实际经…...

【golang】for语句和switch语句

使用携带range子句的for语句时需要注意哪些细节&#xff1f; numbers1 : []int{1, 2, 3, 4, 5, 6} for i : range numbers1 {if i 3 {numbers1[i] | i} } fmt.Println(numbers1)这段代码执行后会打印出什么内容&#xff1f; 答案&#xff1a;[1 2 3 7 5 6] 当for语句被执行…...

三、数据库索引

1、索引介绍 索引是一种用于快速查询和检索数据的数据结构&#xff0c;其本质可以看成是一种排序好的数据结构。 常见的索引结构有&#xff1a;B数&#xff0c;B树&#xff0c;Hash和红黑树等。在MySQL中&#xff0c;无论是 InnoDB还是MyISAM&#xff0c;都使用了B树作为索引…...

长时间带什么耳机最舒服,分享长时间佩戴舒服的耳机推荐

时代在进步&#xff0c;科技在不断革新。近年来&#xff0c;一种崭新的耳机——骨传导耳机&#xff0c;如火如荼地进驻耳机市场&#xff0c;引起一阵热潮。不论是平日里的工作出勤还是运动时的挥洒汗水&#xff0c;相比传统耳机&#xff0c;骨传导耳机无疑更加贴合现代生活的需…...

Yolov8小目标检测(1)

💡💡💡本文目标:通过原始基于yolov8的红外弱小目标检测,训练得到初版模型,进行问题点分析; 💡💡💡Yolo小目标检测,独家首发创新(原创),适用于Yolov5、Yolov7、Yolov8等各个Yolo系列,专栏文章提供每一步步骤和源码,带你轻松实现小目标检测涨点 💡💡…...

GPS定位漂移问题分析

有很多种因素会影响到GPS的准确率&#xff0c;以下是一个GPS误差引入简表&#xff1a; l 卫星时钟误差&#xff1a;0-1.5米 l 卫星轨道误差&#xff1a;1-5米 l 电离层引入的误差&#xff1a;0-30米 l 大气层引入的误差&#xff1a;0-30米 l 接收机…...

前端简介(HTML+CSS+JS)

学习Django过程中遇到一些前端相关的内容&#xff0c;于是整理了一下相关概念。 前端开发是创建WEB页面或APP等前端界面呈现给用户的过程。 如果只是想要入门前端&#xff0c;只要学习网页三剑客(HTML、CSS、JavaScript)即可。 如果把网页比喻成一个房子&#xff0c;HTML就是…...

List与String数组互转

一.List 转为 String 数组 1.使用toArray方法 public static void main(String[] args) {List<String> list Lists.newArrayList("1","2","3");// Java6以前版本String[] str1 list.toArray(new String[list.size()]);// Java6以后版本…...

MySQL中的数据类型

文章目录 1 常见的数据类型2 整数类型2.1 属性 M2.2 属性 UNSIGNED2.3 属性 ZEROFILL2.4 整数类型的适用场景 3 浮点类型4 定点类型5 位类型6 日期与时间类型6.1 YEAR 类型6.2 DATE 类型6.3 TIME 类型6.4 DATETIME 类型6.5 TIMESTAMP 类型 1 常见的数据类型 类型类型分类整数类…...

python多任务

​ 一、多任务 1.1 概念 多任务就是指&#xff1a;同一时间能执行多个任务。比方我们的电脑能一边QQ聊天&#xff0c;一边写论文&#xff0c;还能听歌。 1.2 多任务的优势&#xff1a; 多任务的最大好处是 充分利用CPU资源&#xff0c;提高程序的执行效率。 1.3 多任务的两种表…...

c语言 - inline关键字(内联函数)

概念 在编程中&#xff0c;inline是一个关键字&#xff0c;用于修饰函数。inline函数是一种对编译器的提示&#xff0c;表示这个函数在编译时应该进行内联展开。 内联展开是指将函数的代码插入到调用该函数的地方&#xff0c;而不是通过函数调用的方式执行。这样可以减少函数调…...

如何在Ubuntu 18.04上安装PHP 7.4并搭建本地开发环境

引言 PHP是一种流行的服务器脚本语言&#xff0c;用于创建动态和交互式web页面。开始使用你选择的语言是学习编程的第一步。 本教程将指导您在Ubuntu上安装PHP 7.4&#xff0c;并通过命令行设置本地编程环境。您还将安装依赖管理器Composer&#xff0c;并通过运行脚本来测试您…...

狭义相对论

文章目录 一、为什么光速不变&#xff1f;二、为什么爱因斯坦坚信“相对性原理”三、逻辑和数学显威力&#xff0c;狭义相对论时空变换&#xff08;洛伦兹变换&#xff09;推导四、新时空变换带来的新时空观1、有关相对论时间的“傻问题”2、关于相对论的“怪问题”3、关于“双…...

仓库使用综合练习

目录 1、使用mysql:5.6和 owncloud 镜像&#xff0c;构建一个个人网盘。 2、安装搭建私有仓库 Harbor 3、编写Dockerfile制作Web应用系统nginx镜像&#xff0c;生成镜像nginx:v1.1&#xff0c;并推送其到私有仓库。 4、Dockerfile快速搭建自己专属的LAMP环境&#xff0c;生…...

如何在前端实现WebSocket发送和接收TCP消息(多线程模式)

目录 第一步&#xff1a;创建WebSocket连接第二步&#xff1a;监听WebSocket事件第三步&#xff1a;发送消息第四步&#xff1a;后端处理函数说明 当在前端实现WebSocket发送和接收TCP消息时&#xff0c;可以使用以下步骤来实现多线程模式。本文将详细介绍如何在前端实现WebSoc…...

VB.NET通过VB6 ActiveX DLL调用PowerBasic及FreeBasic动态库

前面说的Delphi通过Activex DLL同时调用PowerBasic和FreeBasic写的DLL&#xff0c;是在WINDOWS基础平台上完成的。 而 .NET平台是架在WINDOWS基础平台之上的&#xff0c;它的上面VB.NET或C#等开发的APP程序&#xff0c;下面写一下用VB.NET&#xff0c;通过VB6注册的Activex DLL…...

怎样不引入图片实现前端css实现x关闭按钮

首先初始化一个dom节点 <span class"closeButton"></span>设置样式 .closeButton {width: 12px;height: 12px;margin-top: 5px;margin-right: 5px;float: right;cursor: pointer;color: #105c86;}通过伪元素before after画两条线 margin-left 的设置是…...

SpringBoot实现文件下载的多种方式

SpringBoot实现文件下载的几种方式 1. 将文件以流的形式一次性读取到内存&#xff0c;通过响应输出流输出到前端1.1 下载文件 2. 将输入流中的数据循环写入到响应输出流中&#xff0c;而不是一次性读取到内存&#xff0c;通过响应输出流输出到前端3. 下载网络文件到本地4. 网络…...

uniapp简单版语音播放

mounted() {this.ScanAudio(http://118.178.137.235:88/ipoker.mp3, 3); // 开始播放音频},ScanAudio(url, count) {// 递归终止条件&#xff1a;当循环次数小于等于 0 时&#xff0c;停止递归if (count < 0) return;// 创建内部音频上下文对象var music uni.createInnerAu…...

前端三剑客入门一文解决

文章目录 HTML快速开发网站Flask页面结构标签基础标签超链接图片列表下拉框表格input系列多行文本form表单 网络请求HTML案例 CSSCSS盒模型CSS样式定义CSS选择器 CSS样式使用1. 在标签上直接写2. 在head标签中写3.写到css文件中 标签样式1. 高度和宽度2. 块级和行内标签3.字体设…...

php curl apache 超时 500错误

web请求超过40s 就返回500错误 php的超时时间 set_time_limit无效 curl CURLOPT_TIMEOUT 设置请求时间 无效 设置apache Timeout 链接超时 无效 最后添加 Fcgid才可以 apache 配置文件 httpd.conf <IfModule mod_fcgid.c>FcgidProcessLifeTime 10000FcgidIOTimeout 1000…...