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框架中,事务管理是一种用于维护数据库操作的一致性和…...
计算机视觉 -- 图像分割
文章目录 1. 图像分割2. FCN2.1 语义分割– FCN (Fully Convolutional Networks)2.2 FCN--deconv2.3 Unpool2.4 拓展–DeconvNet 3. 实例分割3.1 实例分割--Mask R-CNN3.2 Mask R-CNN3.3 Faster R-CNN与 Mask R-CNN3.4 Mask R-CNN:Resnet1013…...
ubuntu18.04复现yolo v8之CUDA与pytorch版本问题以及多CUDA版本安装及切换
最近在复现yolo v8的程序,特记录一下过程 环境:ubuntu18.04ros melodic 小知识:GPU并行计算能力高于CPU—B站UP主说的 Ubuntu可以安装多个版本的CUDA。如果某个程序的Pyorch需要不同版本的CUDA,不必删除之前的CUDA,…...
Redis三种模式——主从复制,哨兵模式,集群
目录 一、主从复制 1.1主从复制的概念 1.2Redis主从复制作用 1.2.1数据冗余 1.2.2故障恢复 1.2.3负载均衡 1.2.4高可用基石 1.3Redis主从复制流程 1.4部署Redis 主从复制 1.4.1.环境部署 1.4.2.所有服务器都先关闭防火墙 1.4.3.所有服务器都安装Redis 1.4.4修改Master主节点R…...
mysql8.0.31新增只读远程普通用户
在 MySQL 8.0.31 中,可以通过以下步骤新增只读远程普通用户: 1、使用 root 用户登录 MySQL 数据库。 mysql -u root -p 2、创建用户: CREATE USER username% IDENTIFIED WITH mysql_native_password BY password ; 其中,username…...
揭开路由协议隐藏的风险
路由协议在互联网和基于其的服务的运行中发挥着至关重要的作用。然而,许多这些协议的开发都没有考虑到安全问题。 例如,边界网关协议 (BGP) 最初并未考虑对等点之间发生攻击的可能性。过去几十年来,BGP 中的起源和路径验证已投入了大量工作。…...
图片因固定宽高被拉伸了?object-fit:一个神奇的属性
一、问题产生的场景 近期在完成项目开发时,测试人员针对漫画长图上传后的展示提出了一个界面优化的点,因为其特点是长,但是我们展示图片的区域是固定的,如果我们按照正常思路将图片的宽高写死,确实占位大小的问题解决了…...
客户案例:中圣科技—CAC2.0防范盗号威胁,加固安全防线
客户背景 中圣科技(江苏)股份有限公司(以下简称“中圣科技”),是一家以技术研发为驱动,以清洁能源核心成套装备和节能环保工程服务为支撑的科技创新型企业。其以南京为核心运营基地,与当地政府…...
pandas数据分析40——读取 excel 合并单元格的表头
案例背景 真的很容易疯....上班的单位的表格都是不同的人做的,所以就会出现各种合并单元格的情况,要知道我们用pandas读取数据最怕合并单元格了,因为没规律...可能前几列没合并,后面几列又合并了....而且pandas对于索引很严格&am…...
Java后端开发面试题——微服务篇总结
Spring Cloud 5大组件有哪些? 随着SpringCloudAlibba在国内兴起 , 我们项目中使用了一些阿里巴巴的组件 注册中心/配置中心 Nacos 负载均衡 Ribbon 服务调用 Feign 服务保护 sentinel 服务网关 Gateway Ribbon负载均衡策略有哪些 ? RoundRobinRule&…...
第十一章MyBatis查询专题
返回单个Car 返回单个可以直接用Car接收返回参数 Car carCarMapper.getOne(100);返回多个Car 返回多个可以直接用List接收返回参数 List<Car> carCarMapper.getAll();用一个对象无法接受返回多个参数,用list可以接收返回一个参数 返回Map 如果没有合适的…...
网站建设推广优化招聘模板/百度在线
1、打开secureCRT,连接到数据库所在的linux机器。切换到了oracle用户下。 su - oracle 2、关掉oracle的监听进程 lsnrctl stop 这时外部没法连接到数据库了。 3、杀掉所有session。 ps -ef|grep $ORACLE_SID|grep -v ora_|grep LOCALNO|awk {print $2}|xargs …...
h5响应式网站建设方案/h5页面制作平台
现象:在模拟机中,二级菜单调用不出来 在真机中,二级菜单可以正常显示与使用 测试环境:android模拟机 android sdk 4.4 真机 samsung s4 android 4.2...
阿里云备案成功怎么建设网站/seo推广优化平台
转载于:https://www.cnblogs.com/ycxyyzw/archive/2012/07/04/2576148.html...
免费手机网站app/百度关键词搜索
https://stackoverflow.com/a/28090544/8025086 https://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/ 转载于:https://www.cnblogs.com/buxizhizhoum/p/10658122.html...
做英雄联盟网站的图片素材/淘宝指数查询
如果要进行客户端与服务器端之间的消息传递,我们可以使用HTTP协议请求进行。 HTTP协议请求主要分为6种类型,各类型的主要作用如下: GET请求:GET请求会通过URL网址传递信息,可以直接在URL中写上要传递的信息,…...
wordpress get_the_tag_list/今日新闻快讯
一、 1、 2路CAN接口(MCP2515的1路,STM32F103C8T6自带的1路CAN),可以实现两路CAN的通信; 2、供电范围宽(7-28v),采用可插拔式4位数码管模块进行显示,数码管模块采用2线…...