redis基本介绍以及在node中使用
文章目录
- 引言
- 一、什么是redis
- 1. redis简介
- 2. redis的特点
- 3. redis的应用场景
- 二、redis在windows下安装
- 1. 下载安装
- 2.验证是否安装成功
- 3. 配置环境变量
- 三、redis-cli常用命令介绍
- 1. redis-cli
- 2. keys *
- 3. set key value
- 4. get key
- 5. exists key
- 6. del key
- 7. info
- 8. flushdb
- 9. ping
- 10. select index
- 11. move key 数据名【0-15】
- 四、redis数据类型和key的命名规范
- 1. redis数据类型
- 2. key命名规范
- 五、字符串操作
- 六、hash类型操作
- 七、列表类型操作
- 八、集合类型操作
- 九、有序集合类型操作
- 十、node中使用ioredis连接Redis
- 总结
引言
数据库在现代化的应用开发中起着至关重要的作用,它们为我们存储和检索大量的数据提供了便利。然而,在不断增长的数据海洋中,我们如何保持应用的性能并快速地存储和检索数据呢?答案是使用Redis。Redis是一种开源的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。在本文中,我们将介绍Redis的基本概念,以及如何在Node.js环境中使用Redis。我们将探索Redis的独特性能,并演示如何通过Node.js轻松地将其集成到您的应用中。 无论您是一名刚开始接触Redis的初学者,还是一名在寻找如何在Node.js中使用Redis的经验开发者,本文都将为您提供有价值的信息。
一、什么是redis
1. redis简介
redis中文网

Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。
2. redis的特点
-
速度快:
Redis是基于内存操作的,因此读写速度非常快,可以达到10万次/秒的读操作和8.1万次/秒的写操作。 -
支持多种数据结构:
Redis支持多种数据结构,如字符串(string)、列表(list)、集合(set)、有序集合(sorted set)、哈希(hashes)等,满足丰富的业务需求。 -
丰富的功能:
Redis还支持数据备份,即Master-Slave模式的备份。另外,Redis还支持事务、管道和分布式等功能。 -
支持持久化:可以将内存中的数据保存在磁盘中,重启后可以再次加载进行使用,从而达到持久化的效果。
-
高可用和分布式支持:通过
Redis Sentinel和Redis Cluster等实现服务器的高可用和分布式。 -
简单易用:
Redis有很多客户端,几乎所有的语言都有对应的客户端,且API使用也非常简单。 -
开源:
Redis是开源的,可以免费使用和修改。
3. redis的应用场景
-
缓存系统:
Redis通常用作内存数据存储系统作为NoSQL的键值数据库来实现内存缓存功能。在缓存应用中,Redis通常用于减少应用与慢速的磁盘数据源(如关系型数据库或传统的Web API)的交互。 -
消息队列系统:
Redis的发布订阅、阻塞队列等特性使得它可以作为消息中间件使用。 -
实时分析:如实时统计、计数、排行榜等,在这类场景下,
Redis的Set和Sorted Set常常能立大功。 -
分布式锁:
Redis可以实现对某些公共资源的访问限制,从而保证系统并发控制的效果。 -
会话缓存(
Session Cache):其实就是把用户的信息、用户权限、快捷信息等放在会话里。很多网站也是用的Redis来实现的。 -
网页访问分析:比如记录每个网页访问的次数、频率等等,这样可以为网站的热点推荐提供数据支持。
-
数据过期处理:可以通过Redis的键值对过期策略,处理某些过期数据。
-
应用排行榜:社交类、游戏类应用经常会有各种排行榜的需求,
Redis提供的Sorted Set可以非常方便的实现这个功能。 -
社区网站和合作工具:支持“发布/订阅”的消息模式可以帮助我们构建实时工作队列。
-
物流追踪和预定系统:
Redis可以通过状态更新来追踪物品或车辆的实时位置。
二、redis在windows下安装
这里只记录一下windows下的安装流程,其他系统的可以去redis官网查看教程
1. 下载安装
下载地址:https://github.com/tporadowski/redis/releases

下载zip压缩包,解压即可使用
2.验证是否安装成功
找到解压的目录,cmd



在这里输入
redis-cli.exe -h 127.0.0.1 -p 6379

再输入:
info server

当你看到上图,说明redis安装成功,可以使用。
3. 配置环境变量
建议将redis启动目录,配置环境变量,这样就可以在全局访问redis了





验证是否配置成功,win+R
输入
redis-server.exe redis.conf
后面的那个redis.conf可以省略,如果省略,会启用默认的

如上图所示redis启动成功,代表配置的环境变量生效。
三、redis-cli常用命令介绍
1. redis-cli
前面我们验证redis是否安装成功时用到了一行命令
redis-cli.exe -h 127.0.0.1 -p 6379
这个命令的作用是通过Redis的命令行工具redis-cli来连接本机(IP地址为127.0.0.1)上运行的Redis数据库服务,其中连接的端口号为6379(这是Redis的默认端口号)。在成功连接数据库后,你可以在命令行中输入Redis命令进行相应的数据库操作。
具体来说:
redis-cli.exe:这是Redis的命令行工具。-h 127.0.0.1:这指定了要连接的Redis服务器的IP地址(这里的127.0.0.1是本机的IP地址)。-p 6379:这指定了要连接的Redis服务器的端口号(Redis的默认端口号为6379)。\
其实可以直接输入
redis-cli
其他的会默认执行

2. keys *
列出所有keys:keys * 。这将返回数据库中所有的keys。

3. set key value
设置key-value:set key value。这会将key-value数据对存入数据库,例如 set mykey myvalue。

set username zhangsan
这就是在redis中存储了一个键值对,key是username, value是zhangsan
4. get key
获取key-value:get key。这将返回与指定key关联的value,例如 get mykey。

get username
获取key为username的value值,如上图就是zhangsan
5. exists key
检查key是否存在:exists key。如果key存在,该命令返回1,否则返回0。

6. del key
删除key:del key。这会从数据库中删除指定的key,例如 del mykey。

7. info
查看所有信息:info。获取Redis的统计信息

8. flushdb
清空数据库:flushdb。清空当前数据库所有数据
9. ping
测试连接:ping。测试客户端与Redis服务器的连通性。

10. select index
选择数据库:select index。Redis默认设置了16个数据库,编号从0开始,可以使用该命令选择你要操作的数据库。

如上图,我显示切换到1数据库,然后查看1中所有的key,显示空的,
然后我再次切换为0,查看key,有数据
Redis 默认提供了 16 个数据库,编号从 0 到 15。这些数据库之间相互独立,每个数据库都有自己的键值对,即一个数据库中的数据在另一个数据库中是不可见的。
这些数据库之间可以通过 SELECT 命令进行切换。如果没有明确指定,Redis 将默认使用 0 号数据库。试图访问一个不存在的数据库不会报错,而是创建这个数据库。你可以通过 CONFIG GET databases 命令查询 Redis 数据库的数量。
需要注意的是,尽管Redis提供了多个数据库,但这种机制并没有提供真正的数据库隔离。例如,所有数据库都共享同一个事件循环、后台任务(如过期、持久化等),并且同时只能有一个数据库被选中。
因此,这种多数据库的设计主要适用于将相关的数据保存在一起,而不必将所有数据混在一起,这样可以使得数据访问更加简单、便捷。而对于真正的多租户场景或需要严格的数据库隔离性,建议使用多个Redis实例。
11. move key 数据名【0-15】
在Redis中,我们可以使用MOVE命令将键值对从一个数据库移动到另一个数据库。例如,假设我们有两个数据库,数据库1和数据库2,我们在数据库1中有名称为key1的键值对,我们想将这个键值对移动到数据库2。
以下是操作步骤:
1.首先,我们需要确认当前所在的数据库,这可以通过SELECT命令完成。启动redis服务并进入redis-cli,输入以下命令:
127.0.0.1:6379> SELECT 1
这将切换到数据库1。这里,1是数据库的索引号。
2.然后,我们需要确认‘key1’确实在数据库1中。这可以通过EXISTS命令完成。输入以下命令:
127.0.0.1:6379> EXISTS key1
如果key1存在,它将返回1。如果不存在,它将返回0。
3.然后,我们可以使用MOVE命令,将key1从数据库1移动到数据库2(索引为2)。输入以下命令:
127.0.0.1:6379> MOVE key1 2
这将移动key1到数据库2。如果操作成功,它将返回1。如果失败,它会返回0。
4.最后,我们可以切换到数据库2,并确认key1是否在这个数据库中。输入以下命令:
127.0.0.1:6379> SELECT 2
127.0.0.1:6379> EXISTS key1
如果key1存在,它将返回1,表明我们已经成功地将键值对从一个数据库移动到了另一个数据库。
四、redis数据类型和key的命名规范
1. redis数据类型
| 数据类型 | 描述 |
|---|---|
| STRING | 字符串类型,可以包含任何数据,如jpeg图片或者序列化的对象 |
| LIST | Redis List的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销 |
| SET | SET是string类型的无序集合,集合成员是唯一的,这就意味着集合中重复的数据会被过滤掉 |
| ZSET (sorted set) | ZSET也是string类型的集合,另外每个元素都将关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。 |
| HASH | Redis hash 是一个键值对集合, 是一个string类型的field和value的映射表,所以他适合用于存储对象。 |
| BITMAPS | 位图数据类型,将字符串看作二进制位数组来使用,字符串的每一个 bit 位都只能存储 0 或者 1 两种状态的数字 |
| STREAMS | Redis 5.0 版本引入的新数据类型,主要用于处理实时的数据流。 |
2. key命名规范
在 Redis 中,Key 的命名是非常自由的,但为了保证良好的可读性和管理性,下面是一些关于 Key 命名的建议规范:
-
命名应简短且富有描述性。例如,用 user🆔123 更合适,而不是 type🆔value:123。如果 Key 过长,不仅会导致额外的内存开销,还可能影响内存的操作效率。
-
命名应保持一致性。例如,如果你使用 user🆔123,那么将来的所有关键字都必须遵循这种模式,如 product🆔456,而不是在一些地方使用 var🆔789。
-
可以使用字符集合,包括一部分 ASCII 码,其中一般字符,如字母,数字,“.”,“-”,“+”,“_”,“:” 等,用于保证 Key 的可读性和易于理解。
-
不要使用特殊保留字符。Redis 的一些模式匹配功能使用 “[]”,“()”,“*”,“?” 等字符,如果在 Key 中使用这些字符,可能会导致无法找到 Key。
-
避免 Key 冲突。尽量确保每个 Key 的名称是唯一的,特别是在数据量较大的情况下。
-
不推荐在 Key 名称中使用空格,这可能在使用某些命令时引入错误。
-
如果 Key 的数量很大,那么 Key 的命名规则应尽可能地反映出数据的结构,以便进行批量操作。例如,“object-type:id” 这种命名方式(如 “user:1000”)可以让你轻松地找到某个类型的所有对象。
总的来说,Redis 中 Key 的命名应尽可能做到语义化,方便理解和管理,同时也需要考虑内存和性能的影响。
五、字符串操作
Redis中的字符串类型是最基本的数据类型,其对应的操作有以下几种:
-
增加:
命令为set key value,例如:set name “jackson”。这条命令会将键值对{name, “jackson”}存储到redis中,如果键name已经存在,那么会将它对应的旧值替换为"jackson"。 -
修改:
修改可以通过set命令来进行,例如:set name "michael"。如果键name已经存在,那么这条命令会替换掉它的旧值,如果没有存在,那么就等同于增加一个新的键值对。 -
查询:
查询操作有两种,第一种是直接通过键查询,命令为get key,例如:get name,会返回"name"对应的值。
第二种是通过多个键查询,命令为mget keys,例如:mget name age,会返回"name"和"age"这两个键对应的值。 -
删除:
删除的命令为del key,例如:del name,这条命令会删除键为"name"的键值对。如果键不存在,那么这条命令不会生效。 -
追加:
追加的命令为append key value,例如:append name “jackson”,如果键"name"已经存在于redis中,那么这条命令会在它对应的值的后面追加"jackson",如果键不存在,那么这条命令等同于set name “jackson”。 -
长度:
获取键对应值的长度的命令为strlen key,例如:strlen name,这条命令会返回键"name"对应的值的长度。 -
子串:
获取键对应值的子串的命令为getrange key start end,例如:getrange name 0 1,这条命令会返回键"name"对应的值的第0位到第1位的子串。 -
替换:
替换键对应值的子串的命令为setrange key offset value,例如:setrange name 0 “Jack”,这条命令会将键"name"对应的值的从第0位开始的子串替换为"Jack"。 -
自增/自减:
对键对应的数值进行自增或自减的命令有incr key、decr key、incrby key increment、decrby key decrement,例如:incr age、decr age、incrby age 5、decrby age 2。这些命令分别会将键"age"对应的值增1、减1、增5、减2。
六、hash类型操作
Redis中的hash类型数据,可以理解为是字符串类型的field和value的映射表。hash适合用于存储对象。
增加操作:可以使用HSET命令
如,增加一个hash类型的数据,命令如下:
HSET hset_key field1 value1
这个命令意思是在键‘hset_key’中设置一个子键field1,并赋值value1,如果该子键已存在则覆盖其原来的值。
删除操作:可以使用HDEL命令
如,删除一个hash类型的数据,命令如下:
HDEL hset_key field1
这个命令意思是删除键‘hset_key’中的子键field1。
修改操作:使用HSET命令
在redis的hash类型中,如果键中的field已经存在,使用HSET命令会覆盖原来的值。所以修改操作同增加操作。
查找操作:可以使用HGET或HGETALL命令
如,获取一个hash类型中的一个字段,命令如下:
HGET hset_key field1
这个命令意思是获取键‘hset_key’中的子键field1的值。
如果想获取一个hash类型的所有字段以及字段值,命令如下:
HGETALL hset_key
这个命令意思是返回键‘hset_key’相关的所有键值对。
在使用hash类型时,如果对性能要求较高,可以使用HSETNX,此命令只有在字段不存在时设置值,能避免不必要的更新操作,提高性能。
实例说明:
例如有一个用户对象,包含id,name,age,gender等属性,可以如此存储:
HSET user:1000 id 1000
HSET user:1000 name "coder"
HSET user:1000 age 30
HSET user:1000 gender "male"
查看用户属性:
HGETALL user:1000
修改用户的年龄:
HSET user:1000 age 31
删除用户的name属性:
HDEL user:1000 name
七、列表类型操作
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)
一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
Redis中列表类型(list)的数据操作主要包括插入(lpush、rpush)、删除(lpop、rpop、lrem)、修改(lset)、查询(lindex、lrange等)等操作。
增加:
lpush key value [value ...]:将一个或多个值插入到列表头部,列表不存在时,会创建一个新的空列表,并进行lpush操作。当列表存在,key对应的值不是列表类型时,返回错误。
127.0.0.1:6379> lpush mylist "Redis"
(integer) 1
127.0.0.1:6379> lpush mylist "MongoDB"
(integer) 2
删除:
lpop key:移除并返回列表的第一个元素。
127.0.0.1:6379> lpop mylist
"MongoDB"
rpop key:移除并返回列表的最后一个元素。
127.0.0.1:6379> rpop mylist
"Redis"
lrem key count value:根据参数count的值,移除列表中与参数value相等的元素。
127.0.0.1:6379> lrem mylist 0 "Redis"
(integer) 1
查询:
lrange key start stop:返回列表的指定区间内的元素,区间以偏移量start和stop指定。
127.0.0.1:6379> lrange mylist 0 4
1) "MongoDB"
2) "Redis"
3) "MYSQL"
4) "Oracle"
5) "PostgreSQL"
lindex key index:返回列表中指定位置的元素。
127.0.0.1:6379> lindex mylist 1
"Redis"
修改:
lset key index value:通过索引位置来设置列表中的值。
127.0.0.1:6379> lset mylist 1 "MySQL"
OK
127.0.0.1:6379> lindex mylist 1
"MySQL"
以上就是在Redis中对于列表类型数据的一些基本操作,操作主要依靠各种不同的命令来进行。这些都是Redis很实用的基础命令,可以帮助我们更好地使用Redis对数据进行操作。
八、集合类型操作
Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
在Redis中,可以使用以下命令对集合类型的数据进行增删改查操作:
-
增加元素:
SADD:将一个或多个元素添加到集合中。
例如:SADD fruits apple banana orange
-
删除元素:
SREM:从集合中删除一个或多个指定元素。
例如:SREM fruits apple
-
修改元素:
Redis的集合类型并不支持修改元素的操作,只能通过删除和重新添加元素来实现更新。 -
查询元素:
-
SMEMBERS:返回集合中的所有元素。
例如:SMEMBERS fruits -
SISMEMBER:判断一个元素是否在集合中。
例如:SISMEMBER fruits apple -
SCARD:返回集合中的元素个数。
例如:SCARD fruits -
SRANDMEMBER:随机返回集合中的一个元素。
例如:SRANDMEMBER fruits -
SSCAN:迭代集合中的元素并返回匹配的元素。
例如:SSCAN fruits 0 MATCH *n*
-
需要注意的是,以上命令中的集合类型指的是Redis中的无序不重复元素的集合。例如,上述命令中的"fruits"表示一个集合,可以存储多个水果元素,且这些元素是无序的且不重复的。
举例说明:
假设我们使用SADD命令向fruits集合添加元素,然后使用SMEMBERS命令查询集合中的元素,如下所示:
> SADD fruits apple banana orange
(integer) 3
> SMEMBERS fruits
1) "banana"
2) "orange"
3) "apple"
可以看到,通过SADD命令将apple、banana和orange添加到了fruits集合中,并且通过SMEMBERS命令返回了集合中的所有元素。
另外,也可以使用SISMEMBER命令判断一个元素是否在集合中,例如:
> SISMEMBER fruits apple
(integer) 1
可以看到,通过SISMEMBER命令判断apple是否在fruits集合中,返回结果为1,表示存在。
需要注意的是,以上命令只是针对集合类型的数据,不能对其他类型的数据进行操作。
九、有序集合类型操作
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
Redis中对有序集合类型的数据常用操作有:
-
ZADD:将一个或多个成员元素及其分值加入到有序集合中。
示例命令:ZADD myset 1 member1 2 member2 3 member3
作用:将成员元素"member1"的分值设为1,"member2"的分值设为2,"member3"的分值设为3,并将它们加入到名为"myset"的有序集合中。 -
ZREM:从有序集合中移除一个或多个成员元素。
示例命令:ZREM myset member1 member2
作用:从名为"myset"的有序集合中移除成员元素"member1"和"member2"。 -
ZRANK:返回有序集合中指定成员元素的排名。
示例命令:ZRANK myset member2
作用:返回名为"myset"的有序集合中成员元素"member2"的排名,按照分值从小到大的顺序排列。 -
ZRANGE:返回有序集合中指定排名范围内的成员元素。
示例命令:ZRANGE myset 0 2
作用:返回名为"myset"的有序集合中排名在0到2之间的成员元素,按照分值从小到大的顺序排列。 -
ZSCORE:返回有序集合中指定成员元素的分值。
示例命令:ZSCORE myset member2
作用:返回名为"myset"的有序集合中成员元素"member2"的分值。 -
ZINCRBY:将有序集合中指定成员元素的分值增加指定值。
示例命令:ZINCRBY myset 2 member2
作用:将名为"myset"的有序集合中成员元素"member2"的分值增加2。 -
ZCOUNT:返回有序集合中分值处于指定范围的成员元素数量。
示例命令:ZCOUNT myset 1 3
作用:返回名为"myset"的有序集合中分值在1到3之间的成员元素数量。 -
ZCARD:返回有序集合中的成员元素数量。
示例命令:ZCARD myset
作用:返回名为"myset"的有序集合中的成员元素数量。
综合示例:
ZADD myset 1 member1 2 member2 3 member3
ZREM myset member1
ZRANK myset member2
ZRANGE myset 0 2
ZSCORE myset member2
ZINCRBY myset 2 member2
ZCOUNT myset 1 3
ZCARD myset
以上示例完成了以下操作:
- 创建了一个有序集合"myset",并添加了成员元素"member1"(分值为1)、“member2”(分值为2)和"member3"(分值为3)。
- 移除了有序集合"myset"中的成员元素"member1"。
- 返回了有序集合"myset"中成员元素"member2"的排名。
- 返回了有序集合"myset"中排名在0到2之间的成员元素。
- 返回了有序集合"myset"中成员元素"member2"的分值。
- 将有序集合"myset"中成员元素"member2"的分值增加了2。
- 返回了有序集合"myset"中分值在1到3之间的成员元素数量。
- 返回了有序集合"myset"中的成员元素数量。
十、node中使用ioredis连接Redis
在Node.js中使用ioredis连接Redis的步骤如下:
- 首先,安装
ioredis模块。可以使用npm在命令行中运行以下命令进行安装:
npm install ioredis
- 在代码中引入ioredis模块:
const Redis = require('ioredis');
- 使用ioredis创建Redis客户端对象:
const redis = new Redis({host: 'localhost', // Redis服务器的主机地址port: 6379, // Redis服务器的端口号password: 'password', //(可选)Redis服务器的密码db: 0 //(可选)选择指定的数据库,默认连接到"0"号数据库
});
- 监听是否链接成功
redis.on('error', err => {if (err) {console.log('Redis链接错误');console.log(err);redis.quit() // 链接失败退出链接}
})redis.on('ready', () => {console.log('Redis链接成功');
})
- 可以通过
Redis客户端对象执行一系列的Redis命令,例如set、get、hgetall等命令:
// 设置键名为"name"的值为"John"
redis.set('name', 'John');// 获取键名为"name"的值
redis.get('name', (err, result) => {console.log(result); // 输出:John
});
- 使用完Redis后,最好关闭Redis客户端连接,以释放资源:
redis.quit();
上述是一个基本的使用ioredis连接Redis的示例。根据具体的需求,可以使用ioredis提供的各种API进行更复杂的操作,例如哈希操作、发布/订阅等。
总结
总结来说,Redis是一款高性能的键值存储数据库,它具备快速读写能力和丰富的数据结构支持。在Node.js开发中,我们可以利用redis模块将其与应用程序进行集成,从而提升系统的性能和可靠性。
通过本文的介绍,我们了解了Redis的基本概念和特点,包括数据类型、集群架构和持久化机制等。我们还学习了如何在Node.js应用程序中使用redis模块进行数据操作,包括连接Redis服务器、设置和获取键值对。
通过使用Redis,我们可以轻松地实现数据的缓存、会话管理和消息队列等功能。它给我们带来了方便、高效和可靠的解决方案,对于构建高负载的实时应用程序非常有帮助。
总之,Redis是一款非常优秀的数据库,它在Node.js中的应用也是非常广泛的。希望本文的介绍能够帮助读者加深对Redis的理解,并在实际开发中能够灵活运用。如果你对Redis和Node.js的结合还有其他疑问或者想要深入了解,欢迎留言讨论。谢谢!
相关文章:
redis基本介绍以及在node中使用
文章目录 引言一、什么是redis1. redis简介2. redis的特点3. redis的应用场景 二、redis在windows下安装1. 下载安装2.验证是否安装成功3. 配置环境变量 三、redis-cli常用命令介绍1. redis-cli2. keys *3. set key value4. get key5. exists key6. del key7. info8. flushdb9.…...
React Native 文本输入基础知识
在 React Native 中提供了一个文本输入组件TextInput。此组件主要是监听键盘输入事件,并把对应的输入值显示在组件中,此组件还提供了很多功能配置参数,例如自动更正、自动大写、占位符文本和不同的键盘类型(例如数字键盘ÿ…...
qt显示图片并转换成灰度图及伪彩图
写了个程序,可在途图片,并切换成灰度图及伪彩图显示,主要代码如下: #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainW…...
oj在线编程输入输出
练习地址:校招笔试真题_C工程师、golang工程师_牛客网 1.读取多行内容 输入描述: 输入包括两个正整数a,b(1 < a, b < 1000),输入数据包括多组。 输出描述: 输出ab的结果输入例子: 1 5 10 20 输出例子: 6 30imp…...
【LeetCode 算法】Add Two Integers 两整数相加-位运算
文章目录 Add Two Integers 两整数相加问题描述:分析代码递归 Tag Add Two Integers 两整数相加 问题描述: 给你两个整数 num1 和 num2,返回这两个整数的和。 − 100 < n u m 1 , n u m 2 < 100 -100 < num1, num2 < 100 −1…...
企业网络日志安全与 EventLog Analyzer
企业的网络日志安全是一项至关重要的任务。随着信息技术的迅猛发展,网络攻击和数据泄露的威胁也与日俱增。为了应对这些威胁,企业需要强大的工具来监控、分析和保护其网络日志。而ManageEngine的EventLog Analyzer正是这样一款卓越的解决方案。 网络日志…...
清风数学建模——拟合算法
拟合算法 文章目录 拟合算法概念 确定拟合曲线最小二乘法的几何解释求解最小二乘法matlab求解最小二乘法如何评价拟合的好坏计算拟合优度的代码 概念 在前面的篇幅中提到可以使用插值算法,通过给定的样本点推算出一定的曲线从而推算出一些想要的值。但存在一些问题…...
单片机 (一) 让LED灯 亮
一:硬件电路图 二:软件代码 #include "reg52.h"#define LED_PORT P2void main() {LED_PORT 0x01; // 0000 0001 D1 是灭的 } #include "reg52.h" 这个头文件的作用:包含52 系列单片机内部所有的功能寄存器 三&#…...
c++——单例模式
c单例模式 1、概念: 单例模式确保一个类只有一个实例,并提供一个全局访问点以获取该实例。这通常通过让类的构造函数为私有,以防止外部直接实例化,然后提供一个静态方法来获取实例。 2、实现方法: 实现单例模式的主…...
C# 流Stream详解(2)——FileStream、BinaryReader、MemorySream、SreamReader等之间的关系
【文件流】 电脑上的文件有很多,文本文件、音频文件、视频文件、图片文件等,这些文件会被持久化存储在磁盘上,其本质都是一堆二进制数据。 FileStream用于读取二进制文件。电脑上的所有文件,不管是文本、音频、视频还是其他任意…...
【JavaSE】详解final关键字
在Java中,final可以用来修饰类、方法和变量。final修饰类,表示该类无法被继承,并且此类的设计已被认为很完美而不需要进行修改或扩展。final修饰类中的方法,表示不可以被重写;也就是把该方法锁定了,以防止继…...
问道管理:机器人概念走势活跃,新时达涨停,拓斯达、丰立智能等大涨
机器人概念17日盘中走势活跃,到发稿,拓斯达大涨18%,昊志机电涨近16%,丰立智能涨超13%,步科股份、优德精细涨超10%,新时达涨停,天玑科技、兆龙互联、中大力德涨逾9%。 消息面上,8月16…...
elementui 修改日期选择器el-date-picker样式
1. 案例: 2. css /* 最外层颜色 */ .el-popper.is-pure {background: url("/assets/imgList/memuBG.png") no-repeat;border: none;background-size:100% 100%}/* 日期 1.背景透明 */ .el-date-picker{background: transparent; }/* 日期 2.标题、左右图…...
自己实现 SpringMVC 底层机制 系列之-实现任务阶段 6-完成控制器方法获取参数-@RequestParam
😀前言 自己实现 SpringMVC 底层机制 系列之-实现任务阶段 6-完成控制器方法获取参数-RequestParam 🏠个人主页:尘觉主页 🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,…...
数据可视化:图表绘制详解
数据可视化是一种将抽象的数字和数据转化为直观图形的技术,使数据的模式、趋势和关系一目了然。本文将详细介绍如何绘制各种类型的图表,包括柱状图、折线图、饼图、散点图和热力图等。 第一部分:图表类型和选择 1. 柱状图 柱状图是用于比较类…...
【中危】Apache Ivy<2.5.2 存在XXE漏洞 (CVE-2022-46751)
漏洞描述 Apache Ivy 是一个管理基于 ANT 项目依赖关系的开源工具,文档类型定义(DTD)是一种文档类型定义语言,它用于定义XML文档中所包含的元素以及元素之间的关系。 Apache Ivy 2.5.2之前版本中,当解析自身配置、Ivy 文件或 Apache Maven 的 POM 文件…...
C#使用自定义的比较器对版本号(编码)字符串进行排序
给定一些数据,如下所示: “1.10.1.1.1.2”, “1.1”, “2.2”, “1.1.1.1”, “1.1.3.1”, “1.1.1”, “2.10.1.1.1”, “1.1.2.1”, “1.2.1.1”, “2.5.1.1”, “1.10.1.1”, “1.10.2.1”, “1.11.3.1”, “1.11.12.1”, “1.11.11.1”, “1.11.3.1”, “1”, “…...
AI在日常生活中的应用:从语音助手到自动驾驶
文章目录 AI的定义和发展AI在日常生活中的应用1. **智能语音助手**2. **智能家居**3. **智能医疗**4. **自动驾驶** 代码示例:使用Python实现基于机器学习的图片分类AI的未来前景结论 🎉欢迎来到AIGC人工智能专栏~探索AI在日常生活中的应用 ☆* o(≧▽≦…...
Windows10查看图片的分辨率
文章目录 查看方法 查看方法 鼠标悬停在想查看分辨率大小的图片上,稍等那么零点几秒,就会弹出图片的分辨率信息,如图所示:...
Spring事务和事务传播机制(2)
前言🍭 ❤️❤️❤️SSM专栏更新中,各位大佬觉得写得不错,支持一下,感谢了!❤️❤️❤️ Spring Spring MVC MyBatis_冷兮雪的博客-CSDN博客 在Spring框架中,事务管理是一种用于维护数据库操作的一致性和…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
