初识Redis · list和hash类型
目录
前言:
哈希类型
基本命令
编码方式
应用场景
列表
基本命令
编码方式
应用场景
前言:
前文我们已经介绍了string的基本使用,以及对应的基本命令,最后也是简单的理解了一下string的应用场景,比如计数统计器啊,比如作为缓存的存放常用的数据啊什么的,当然也有通过设置key的过期时间,然后整个分布式锁什么的。
以上是对string类型的简单介绍,本文我们就来介绍列表和哈希类型,老实说,不管是对于string类型来说还是hash类型来说,咱们在C++的时候就有了相应的语言基础,所以我们理解起来还是非常容易的。
即我们对于一些常用的命令咱们是不用特意去记的,因为对应的函数我们已经在语言阶段学习过了,并且如果有过源码的一定实现,这里的简直就是小case。
那么话不多说,我们直接进入主题。
哈希类型
基本命令
首先对于哈希我们已经有了一定的认识,比如在位图的时候,在实现unordered_map的时候,在各种算法题的时候我们也是都有用过的。
在Redis里面,Redis里面的哈希其实和我们平常认为的hash没有两样,但是我们还是要记住一个点就是:Redis里面的k v结构,key一定是字符串,对于value可以是多种类型,所以如果我们创建一个键值对的话可以是:key field value。
这里的field不用key的原因是因为如果都使用key的话,就容易混淆了,所以在Redis中我们把key value中的value中的键值对的写成了field。
说了这么多,不会创建对应的value也百搭,我们就来看看第一个命令:Hset。
对于set来说我们已经算是老常客了,因为对于set来说我们碰到了好多,比如mset,setex,psetex,setbnx等,要不然咱也不能在Redis的第一篇就说set和get是一个多么重要且大众的命令。
对于Hset的使用:
那么这时候肯定会有聪明的同学来说,那是不是还有个命令是Hget,还真有,不过使用可不是直接使用hget key就可以了,因为对于hset还有一个功能,就是创建多个键值对,毕竟我们在前文提及到了,Redis是一种网络服务,既然是网络服务,那么我们为了减少网络开销,一定要是能一次性处理多个数据的。
所以hset还可以这么干:
这样就可以一次性创建了多个键值对了,那么我们也可以使用hget来查看,既然如果光使用hget key的话,它里面这么多键值对,你要查哪个呢?这你总得让redis知道吧?
所以真正的用法是使用hget 后面跟上key之后再跟上你想要查看键值对中的field。不过对于hget来说是没有办法一次性查看多个field的value的,这倒是有点怪了。
好了,我们现在能一次性创建多个键值对了,那如果用到的时候,我们不知道这个field是否存在,此时就可以用到对应的命令hexists:
和hget一样的,它也只能查询一个键值对。
能创建也就能删除是不是?在哈希中我们用到的是hdel,肯定就有人问了,hdel和del的区别是什么?
他们的区别如图,也是非常形象的:
对于del来说,是直接干掉key-value,对于hdel来说,是干掉key-value中value中的field-value。
那么删除的时候,你可就要小心了。
好了,如果使用hexists查看的话,一个一个的查看实在是太麻烦了,我们能不能一次性直接查看完呢?当然是可以的:
即使用的命令是hkeys,就能查看key-value中的所有的field了。不过这个命令的时间复杂度是O(N),你别一看是O(N)你就又害怕了,这个N并不是Redis中所有键值对的key,它明显是key-value中的field-value的数量。
所以到了这里我们已经可以清楚在Redis中时间复杂度是O(N)的话,这个N大多数都是当前命令中key的个数,如果是所有的key,那可太可怕了,咱们一般也不会用~比如keys *之类的。
但是实际上hkeys的可怕程度也是不亚于keys *的,因为如果有的时候我们不清楚有多少的field-value的话,也是容易让Redis阻塞住的。不过现在使用没事,我们之后在生产环境中是万万不敢轻易使用的。
不过既然都有hkeys了,我们再来一个hvals也不过分吧?
既然咱们有了能查key的,也有了能查val的,我们再来个能查全部的也不过分吧?命令为:
hgetall
这里我们可以发现它的顺序也是一一对应的,比如f2下一个就是222,两两配对的。
然后这里我们简单了解两条命令,分别为hmset和hmget,hmset命令相对来说比较冗余了,因为hmset无非就能一次性设置多个键值对,但是这个操作hset可以做呀,但是对于hmget来说相对来说就好了,因为它能一次查询多个的value,和hget不同。
不过我们这里要注意一个点,我们在Redis中最讲究的是效率,既然讲究效率,那么对于hgetall,hkeys,hvals都是有一定风险的,因为键值对一旦太多了,Redis阻塞住了,效率直线下降不说,系统崩溃了可就惨了。
那么有没有我们能够在查询之前看看有多少哈希键值对个数的命令呢?有的兄弟有的:
hlen用来查看有多少的哈希键值对。所以用上面的三个函数的时候,我们还是尽可能的先用hlen吧。
有意思的是,我们这里还有一些命令,和string那边的命令非常相似的:
hsetnx,hincr,hincrby,hincrbyfloat等命令,就不用博主解释了吧~~
编码方式
对于hash来说,它的编码方式一种是hashtable一种是ziplist,对于压缩来说,我们常见的压缩算法有zip,7z,gzip等,不过我们要清楚,压缩的本质是对数据重新编码,光这么说,你可能会觉得晦涩,比如aaabbbccc,假设要对这个字符串压缩,我们可以采取最粗糙的压缩算法,a3b3c3,3就代表有多少个字母。
当然了,咱也说了,这是最粗糙的,实际上的压缩算法远远不止这么简单,不过我们可以通过这个粗糙的压缩算法理解一下压缩算法也是不错的。
那么对于ziplist来说,它的初衷就是为了节省空间的,不过这实际上是一种空间换时间的做法,对于压缩之后的数据,它读取或者是使用的时候肯定是要重新转换,放回去的时候也要转换,即转化两次,相对来说肯定就慢了不少。如果数据元素多的时候,这慢的可就是雪上加霜了。
那么Redis会根据不同的情况,看实际的数据类型,来匹配相对来说最好的编码方式,这点其实在配置文件也是有相关的加载的。
不过我们没有必要专门去记,对吧~
应用场景
对于哈希来说,应用场景可以是存储用户的数据类型,当然,这个场景对于string来说也能做到,不过就需要用到json一类的东西了。相对来说麻烦一点,所以我们一般还是选择哈希。
其实从这个应用场景我们就可以看出来还是结构化数据存储的较多。
列表
基本命令
对于list来说它其实又像C++中的顺序表也像列表,它不同的点还有它支持负数下标,并且它有4个命令可以进行插入删除,即头删头插尾删尾插都涉及到了。
那么有意思的就来了,咱们可是记得栈的特点是后进先出,那么我们对list禁用尾插头删,那这个列表它不就是一个栈吗?那么我们还可以举一反三,如果这个列表我们想把它模拟成一个队列,那么同理,禁用对应的命令,不就成为了一个队列吗?
从上图,我们已经发现了对于list来说的一个端倪,它的命令好像都是分为了l和r,大多数命令中的l和r代表的都是left和right。所以对它来说,不管干啥,几乎都是成双成对的。
首先是创建,分为了lpush和rpush:
对于lpush来说,就是不断的头插,对于rpush来说就是不断的尾插,它们之后的结果肯定差的有点多,对于第一种情况,最后列表是4 3 2 1,对于第二种,最后列表是1 2 3 4,那么我们用什么来查看呢?
涉及到的命令是:lrange和lindex
这里也是非常好理解的,对于lrange来说,它需要一个区间,至于这个区间是怎么构成的,就看你自己了,不管是用正数也好,负数也好,只要你能构成一个区间就行。
对于lindex来说,就需要一个索引就像,其实从这里的这个点来看就非常像C++中的vector了,居然支持下标访问,你说神奇不神奇。
那么有意思的来了,在C++中,如果发生了越界访问,就会发生未定义的行为,如果在Redis中涉及到了“越界访问”的情况,那应该怎么办呢?
咱们记住:Redis会尽它自己最大的努力给我们一个正确的结果
就像这样,给我们这个区间中有的数据,所以面对这种情况,我们常常夸赞Redis的鲁棒性是不错的。
到这里,大概率同学会说,你是说list的命令都是成双成对的吗,是不是应该有rrange?不辛的是,这里的lrange的l并不是left的意思,而是list的意思,所以也就不存在rrange了。
这里我们还可以补充一个,lpushx,这里的x的意思是exist的意思,也就是如果key存在再插入,和string里面的set xx | nx是差不多的。
既然有了push,pop也是非常合理的出现了,我们直接看结果:
但是非常不幸,主播的Redis的版本是6.0.16,而在Redis6.2版本之后,才支持lpop rpop删除多个数据。
我们回想基本的增删改查,是不是我们还应该能在任意的地方增加数据?此时用的命令是linsert
这里的before可以替换成after,意思也就是在element的后面插入数据了。那么问题来了,列表不像哈希,列表可以有重复的数据,如果我的列表有两个3,怎么插入呢?
可以发现,好像是只对第一个元素生效。实际上就是这样的,它不会做特殊处理,只能咱们程序员自己想办法咯。它的时间复杂度是O(N),这个N的含义不用我多说了吧~
同样,常用的还有llen查看对应的长度:
然后刚才我们删除是只使用了l/r pop,一次性只能删除一个,那么如果我们想一次性多删除,也是有办法的,但是不能为所欲为的删除,涉及到的命令是lrem:
这样,从左往右,找到1就删,直到删除两个为止:
它的返回值就是删除的个数。
我们控制删除的方向,就控制中间count就行,count是正数,就从左边删除,count是负数,就从右边删除,count是0,就全部删除完:
就像这样,这里的rem代表的意思就是remove。
我们也可以通过命令来保存列表中的某一段数据,涉及的命令是ltrim
用到的是下标,而下标之外的元素就全部删除了。
在这里我们捎带一提,在Redis的官方文档中,我们看到ACL那一栏,后面带了点标签,可写的,list的,slow慢的,这其实是标签,因为ACL代表的是access control list即访问控制列表,就是权限的意思了,后续程序员们可以通过配置不同的权限,来决定哪些命令是否能执行,咱们先了解了解。
我们也能通过下标设置某个数据,这其实和数组使用下标访问很像的,涉及的命令是lset:
以上都是比较常用的命令,我们现在介绍两个比较特殊的命令,它们特殊就特殊在它们会阻塞,它们是blpop,brpop,其实就是lpop和rpop的另一个版本。
在介绍生产消费模型的时候,我们其实就已经对阻塞有了一个比较形象的认识了,所以这里我也不打算细讲,我们记住两个就行:如果队列为空,尝试出队列的时候就会阻塞,直到队列不为空;如果队列为满,尝试入队列的时候就会阻塞,直到队列不为满的时候解除。
在阻塞的时候,Redis是可以执行其他命令的,但是我们首先搞清楚一个问题,阻塞的时间是多久?欸~还是那句话,跟配置文件说去吧!!!这个阻塞时间在Redis6之后可以设置为小数,Redis5之前是只能整数的。
那么我们先试试:
对于非空的列表来说,它的返回值是对应的key和首先删除的元素,后面的阻塞时间我们也是可以设置的,那么我们操作空列表试试:
当列表为空的时候,直接阻塞,当我们插入数据的时候,直接就弹出,并且告诉我们阻塞的时间了。
这里我们要清楚的一点是blpop的参数是列表和timeout,所以我写个1实际上是迷惑你的,它的作用是监测两个列表,一个是key,一个是1,当谁先有数据的时候,就先删除谁的。
这就是阻塞的pop,你想想,它是不是非常像你买早饭的时候,谁有,我就去买谁的。
编码方式
对于它的编码方式来说,分为了ziplist和linkedlist和quicklist,还是那个观点,对于ziplist来说,是空间换时间的做法,而quickedlist是ziplist和linkedlist的结合。
所以quickedlist比较折中,保留了ziplist的空间节省也保留了linkedlist的效率。
同样的,它里面也是涉及了配置文件,我们是可以通过配置文件修改的。
应用场景
我们就举一个例子吧,列表为空的时候,消费者123都执行了brpop,当列表有元素的时候,正在阻塞的它们就根据谁先执行的命令,谁就获取到了列表里面的元素。
那么我们再上点强度,对于抖音来说,你看一个视频,你得接受弹幕,评论,音频,视频,图片,作者信息等各种信息,那么如果我们将这个信息一股脑的塞到一个管道里面,阻塞住了就完蛋了,如果我们采用多个列表存储,分列表消费。
我们就成功达到了解耦合的目的!!!
当然了,这么多应用场景,这个是非常经典的,还有更多的场景同学可以自行上网搜索。
感谢阅读!
相关文章:
初识Redis · list和hash类型
目录 前言: 哈希类型 基本命令 编码方式 应用场景 列表 基本命令 编码方式 应用场景 前言: 前文我们已经介绍了string的基本使用,以及对应的基本命令,最后也是简单的理解了一下string的应用场景,比如计数统计…...
golang-非orm数据库的操作与对比 database/sql、sqlx 和 sqlc
简单介绍 database/sql database/sql 是一个标准库软件包,负责与数据库(主要是 SQL 关系数据库)的连接和交互。 它为类 SQL 交互提供泛型接口、类型和方法。database/sql 在创建时将简单易用纳入考量,配置为支持与类 SQL 数据库…...
DeepSeek模型在非图形智能体的应用中是否需要GPU
答:不一定 概念 1、是否需要GPU与应用是否图形处理应用无关 2、文本内容智能体大多也需要GPU来提供更好的性能 3、DeepSeek模型在非图形智能体的应用中是否需要GPU取决于具体的模型版本和部署环境 不需要GPU的模型版本 DeepSeek-R1-1.5B: 这…...
RadioMaster POCKET遥控器进入ExpressLRS界面一直显示Loading的问题解决方法
RadioMaster POCKET遥控器进入ExpressLRS界面一直显示Loading的问题解决方法 问题描述解决方法 问题描述 有一天我发现我的 RadioMaster POCKET 遥控器进入 ExpressLRS 设置界面时,界面却一直停留在 “Loading” 状态,完全无法进入设置界面。 我并没有…...
idea的快捷键使用以及相关设置
文章目录 快捷键常用设置 快捷键 快捷键作用ctrlshift/注释选中内容Ctrl /注释一行/** Enter文档注释ALT SHIFT ↑, ALT SHIFT ↓上下移动当前代码Ctrl ALT L格式化代码Ctrl X删除所在行并复制该行Ctrl D复制当前行数据到下一行main/psvm快速生成入口程序soutSystem.o…...
【DDR 内存学习专栏 1.4 -- DDR 的 Bank Group】
文章目录 BankgroupBankgroup 与 Bank 的关系 DDR4 中的 BankgroupDDR4-3200 8Gb芯片为例组织结构访问场景 实际应用示例 Bankgroup Bankgroup是DDR4及后续标准(DDR5)中引入的一个更高层次的组织结构。它将多个Bank组合在一起形成一个Bankgroup,目的是为了进一步提…...
新晋前端框架技术:小程序容器与SuperApp构建
2025年,前端开发领域持续迭代,主流框架如Vue、React等纷纷推出新版本,在性能、开发效率及适用场景上实现突破,进一步巩固其技术地位。 1. Vue 3的全面普及与创新 Vue 3通过多项核心特性优化了开发体验: Teleport组件…...
强化学习:基于价值的方法做的是回归,基于策略的方法做的是分类,可以这么理解吗?
在强化学习领域,基于价值的方法(Value-based Methods)和基于策略的方法(Policy-based Methods)是两种核心范式。本文将从目标函数、优化机制以及与机器学习任务的类比角度,探讨这两种方法是否可以被分别理解为回归和分类任务,并深入分析其内在逻辑。 一、基于价值的方法…...
蓝耘元生代AIDC OS:一站式MaaS平台,助力AI应用快速落地
文章目录 引言1. 什么是MaaS平台?MaaS平台的典型特点 2. 蓝耘元生代AIDC OS 热门模型3. 快速入门:如何调用API?步骤1:注册并获取API Key步骤2:调用API(Python示例) 4. 与Chatbox搭配使用&#x…...
3.2.2.3 Spring Boot配置拦截器
在Spring Boot应用中配置拦截器(Interceptor)可以对请求进行预处理和后处理,实现如权限检查、日志记录等功能。通过实现HandlerInterceptor接口并注册到Spring容器,拦截器可以自动应用到匹配的请求路径。案例中,创建了…...
Python----机器学习(基于PyTorch的蘑菇逻辑回归)
Logistic Regression(逻辑回归)是一种用于处理二分类问题的统计学习方法。它基于线性回归 模型,通过Sigmoid函数将输出映射到[0, 1]范围内,表示概率。逻辑回归常被用于预测某个实 例属于正类别的概率。 一、数据集介绍 本例使用了…...
Python----机器学习(基于PyTorch的乳腺癌逻辑回归)
Logistic Regression(逻辑回归)是一种用于处理二分类问题的统计学习方法。它基于线性回归 模型,通过Sigmoid函数将输出映射到[0, 1]范围内,表示概率。逻辑回归常被用于预测某个实 例属于正类别的概率。 一、数据集介绍 在本例中&…...
如何配置AWS EKS自动扩展组:实现高效弹性伸缩
本文详细讲解如何在AWS EKS中配置节点组(Node Group)和Pod的自动扩展,优化资源利用率并保障应用高可用。 一、准备工作 工具安装 安装并配置AWS CLI 安装eksctl(EKS管理工具) 安装kubectl(Kubernetes命令…...
【C++ Qt】认识Qt、Qt 项目搭建流程(图文并茂、通俗易懂)
每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” 绪论: 本章将开启Qt的学习,Qt是一个较为古老但仍然在GUI图形化界面设计中有着举足轻重的地位,因为它适合嵌入式和多种平台而被广泛使用…...
用Python打造去中心化知识产权保护系统:科技驱动创作者权益新方案
用Python打造去中心化知识产权保护系统:科技驱动创作者权益新方案 近年来,区块链技术和去中心化系统的兴起为知识产权保护提供了新的可能性。在传统模式下,知识产权保护通常依赖于集中化管理机构,这种方式不仅成本高,还可能因不透明导致权益争议。于是,我们萌生了一个设…...
CVE重要漏洞复现-Fastjson1.2.24-RCE漏洞
本文仅供网络学习,不得用于非法目的,否则后果自负 1、漏洞简介 fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,也可以从JSON字符串反序列化到JavaBean。即fastjson的主要功能就是将Java Bean序列化成JSON字符…...
Windows 图形显示驱动开发-WDDM 1.2功能—显示设备硬件软件认证要求
一、容器技术id技术的硬件级实现要求 1.1 EDID规范深度适配 1.物理层要求: 必须使用EDID 2.0及以上版本数据结构 容器ID需写入VSDB区块的0x50-0x6F区域,采用Little-Endian格式存储 允许的最大传输延迟:I2C总线时钟频率≤100KHz时…...
Coze流搭建--写入飞书多维表格
目标 使用coze搭建一个业务流,将业务流生产出的数据写入飞书保存 测试业务流 使用图片生成插件,配置prompt生产图片,将生产的结果写入飞书文档 coze流 运行后最终效果 搭建流程 第一步:飞书创建多维表格 注册飞书创建多维表…...
4.14:计组第三章
一、数据的强制类型转换与存储 1、边界对齐与大端小端方式 2、真-强制类型转换 二、存储器的基本知识(不包含磁盘存储器) 1、主存储器 (1)...
Vue3+Vite前端项目部署后部分图片资源无法获取、动态路径图片资源报404错误的原因及解决方案
目录 Vue3vite前端项目部署后部分图片资源无法获取、动态路径图片资源报404错误的原因及解决方案 一、情景介绍 1、问题出现的场景 2、无法加载的图片写法 二、反向代理原理简介 三、造成该现象的原因 四、解决方案 1、放弃动态渲染 2、在页面挂载的时候引入图片资源 …...
Nacos操作指南
第一章:Nacos 概述 1.1 什么是 Nacos? 定义与定位 Nacos(Naming and Configuration Service)是阿里巴巴于2018年开源的动态服务发现、配置管理和服务管理平台,现已成为微服务生态中的重要基础设施。其核心价值在于帮…...
2025年常见渗透测试面试题-红队面试宝典下(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 一、Java反序列化过程及利用链示例 二、大型网络渗透经验 三、Cobalt Strike的两种Dump Hash区别 四…...
扩增子分析|基于R语言microeco包进行微生物群落网络分析(network网络、Zi-Pi关键物种和subnet子网络图)
一、引言 microeco包是福建农林大学姚敏杰教授团队开发的扩增子测序集成分析。该包综合了扩增子测序下游分析的多种功能包括群落组成、多样性、网络分析、零模型等等。通过简单的几行代码可实现复杂的分析。因此,microeco包发表以来被学界广泛关注,截止2…...
flutter-Text等组件出现双层黄色下划线的问题
文章目录 1. 现象2. 原因3. 解决方法 1. 现象 这天我正在写Flutter项目的页面功能,突然发现我的 Text 文字出现了奇怪的样式,具体如下: 文字下面出现了双层黄色下划线文字的空格变得很大,文字的间距也变得很大 我百思不得其解&a…...
优化运营、降低成本、提高服务质量的智慧物流开源了
智慧物流视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本可通过边缘计算技术…...
leetcode第二题
功能函数 typedef struct ListNode {int val;struct ListNode *next; } ListNode;struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {ListNode *dummy (ListNode *)malloc(sizeof(ListNode));ListNode *cur dummy;int carry 0; //carry是进位值…...
QT实现带快捷键的自定义 QComboBox 控件
在现代GUI应用程序中,用户界面的设计不仅要美观,还要提供高效的交互方式。本文将介绍一个自定义的QCComboBox类,它是一个基于Qt的组合框(QComboBox),支持为每个下拉项添加快捷键。通过这些快捷键࿰…...
聊聊类模板
我们来聊聊类模板,从基础到实际例子,让你更容易理解。 什么是类模板? 类模板是一种模板,允许我们定义一个可以处理任意数据类型的类。简单来说,就是我们可以编写一个类的“蓝图”,然后在需要的时候使用不…...
使用Python进行AI图像生成:从GAN到风格迁移的完整指南
AI图像生成是一个非常有趣且前沿的领域,结合了深度学习和计算机视觉技术。以下是一些使用Python和相关库进行AI图像生成的创意和实现思路: 1. 使用GAN(生成对抗网络) 基本概念:GAN由两个神经网络组成:生成…...
Java 设计模式:外观模式详解
Java 设计模式:外观模式详解 外观模式(Facade Pattern)是一种结构型设计模式,它为复杂的子系统提供一个简化的统一接口,隐藏子系统的复杂性,使客户端更方便地使用系统。外观模式就像一个“门面”ÿ…...
微信小程序中实现某个样式值setData改变时从350rpx到200rpx的平滑过渡效果
方案一:使用 CSS Transition(推荐简单场景) WXSS /* 在对应组件的WXSS中添加 */ .transition-effect {transition: all 0.4s ease-in-out;will-change: bottom; /* 启用GPU加速 */ }WXML <!-- 修改后的WXML --> <view class"…...
LINUX基础 [四] - Linux工具
目录 软件包管理器yum Linux开发工具vim vim的基本概念 vim的三种常用模式 vim的简单配置 vim常用模式的基本操作 命令模式 底行模式 处理vim打开文件报错的问题 Linux编译器-gcc/g使用 为什么我们可以用C/C做开发呢? 预处理(进行宏替换&#x…...
Spring Cloud之远程调用OpenFeign最佳实践
目录 OpenFeign最佳实践 问题引入 Feign 继承方式 创建Module 引入依赖 编写接口 打Jar包 服务提供方 服务消费方 启动服务并访问 Feign 抽取方式 创建Module 引入依赖 编写接口 打Jar包 服务消费方 启动服务并访问 服务部署 修改pom.xml文件 观察Nacos控制…...
【QT】 常用控件【输入类】
🌈 个人主页:Zfox_ 🔥 系列专栏:Qt 目录 一:🔥 输入类控件 🦋 Line Edit -- 单行输入框🎀 录入个人信息🎀 正则表达式验证输入框数据🎀 验证两次输入密码一致…...
【Python】读取xyz坐标文件输出csv文件
Python读取xyz坐标文件输出csv文件 import sys import numpy as np import pandas as pd from tqdm import tqdm import cv2 import argparsedef read_xyz(file_path):with open(file_path, "r") as f: # 打开文件data f.readlines() # 读取文件datas []for …...
深度解析Redis过期字段清理机制:从源码到集群化实践 (一)
深度解析Redis过期字段清理机制:从源码到集群化实践 一、问题本质与架构设计 1.1 过期数据管理的核心挑战 Redis连接池时序图技术方案 设计规范: #mermaid-svg-Yr9fBwszePgHNnEQ {font-family:"trebuchet ms",verdana,arial,sans-se…...
MapReduce实验:分析和编写WordCount程序(对文本进行查重)
实验环境:已经部署好的Hadoop环境 Hadoop安装、配置与管理_centos hadoop安装-CSDN博客 实验目的:对输入文件统计单词频率 实验过程: 1、准备文件 test.txt文件,它是你需要准备的原始数据文件,存放在你的 Linux 系…...
【中大厂面试题】腾讯云 java 后端 最新面试题
腾讯云(一面) 1. spring 和 springboot的区别是什么? 配置方式的区别:Spring 应用的配置较为繁琐,通常需要编写大量的 XML 配置文件或者使用 Java 注解进行配置。例如,配置数据源、事务管理器等都需要手动…...
Redis存储“大数据对象”的常用策略及StackOverflowError错误解决方案
Hi,大家好,我是灰小猿! 在一些功能的开发中,我们一般会有一些场景需要将得到的数据先暂时的存储起来,以便后面的接口或业务使用,这种场景我们一般常用的场景就是将数据暂时存储在缓存中,之后再…...
【Vue】v-if和v-show的区别
个人博客:haichenyi.com。感谢关注 一. 目录 一–目录二–核心区别三–使用场景四–性能对比五–总结 二. 核心区别 之前将css的显示隐藏的方式的时候,就已经提到过v-show和v-if了。忘记了的可以再回头去复习复习。 (2.1)…...
南瓜颜色预测:逻辑回归在农业分类问题中的实战应用
南瓜颜色预测:逻辑回归在农业分类问题中的实战应用 摘要 本案例通过预测南瓜颜色的分类问题,全面展示了逻辑回归在农业领域的实战应用。从数据预处理到模型评估,详细介绍了Seaborn可视化、模型构建、性能优化和结果解释等关键环节。案例不仅…...
【物联网-RS-485】
物联网-RS-485 ■ RS-485 连接方式■ RS-485 半双工通讯■ RS-485 的特点■ ModBus■ ModBus-ASCII■ ModBus-RTU ■ RS-485 连接方式 ■ RS-485 半双工通讯 一线定义为A 一线定义为B RS-485传输方式:半双工通信、(逻辑1:2V ~ 6V 逻辑0&…...
TDengine 语言连接器(Node.js)
简介 tdengine/websocket 是 TDengine 的官方 Node.js 语言连接器。Node.js 开发人员可以通过它开发存取 TDengine 数据库的应用软件。 Node.js 连接器源码托管在 GitHub。 Node.js 版本兼容性 支持 Node.js 14 及以上版本。 支持的平台 支持所有能运行 Node.js 的平台。 …...
Git分布式版本控制工具
一、工作流程 二、常用指令 1、配置git 配置环境变量 cmd打开命令行,输入git查看是否配置成功。 设置用户名和邮箱 git config --global user.name "用户名" git config --global user.email "邮箱" 查看用户名和邮箱 git config --glob…...
The first day of vue
关于小白直接接触vue3的第1天 首先我们需要一个脚手架node.js (这个可以从官网下载,免费的,安装也比较简单,后续我也会出一个相关的安装教程,方便大家和我一起讨论,互相学习) (不知道有没有人对…...
C语言超详细指针知识(三)
在经过前面两篇指针知识博客学习之后,我相信你已经对指针有了一定的理解,今天将更新C语言指针最后一篇,一起来学习吧。 1.字符指针变量 在指针类型的学习中,我们知道有一种指针类型为字符指针char*,之前我们是这样使用…...
无人机气动-结构耦合技术要点与难点
一、技术要点 1. 多学科耦合建模 气动载荷与结构响应的双向耦合:气动力(如升力、阻力、力矩)导致结构变形,而变形改变气动外形,进一步影响气流分布,形成闭环反馈。 建模方法: 高精度C…...
打造现代数据基础架构:MinIO对象存储完全指南
目录 打造现代数据基础架构:MinIO对象存储完全指南1. MinIO介绍1.1 什么是对象存储?1.2 MinIO核心特点1.3 MinIO使用场景 2. MinIO部署方案对比2.1 单节点单驱动器(SNSD/Standalone)2.2 单节点多驱动器(SNMD/Standalone Multi-Drive)2.3 多节点多驱动器(…...
SpringBoot条件注解全解析:核心作用与使用场景详解
目录 引言一、条件注解的核心机制二、SpringBoot内置条件注解详解1、ConditionalOnClass和ConditionalOnMissingClass2、ConditionalOnBean和ConditionalOnMissingBean3、ConditionalOnProperty4、ConditionalOnWebApplication和ConditionalOnNotWebApplication5、ConditionalO…...
智慧酒店企业站官网-前端静态网站模板【前端练习项目】
最近又写了一个静态网站,智慧酒店宣传官网。 使用的技术 html css js 。 特别适合编程学习者进行网页制作和前端开发的实践。 项目包含七个核心模块:首页、整体解决方案、优势、全国案例、行业观点、合作加盟、关于我们。 通过该项目,小伙伴们…...