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

Redis五种数据类型及命令操作(二)

🎈个人公众号:🎈 :✨✨✨ 可为编程✨ 🍟🍟
🔑个人信条:🔑 知足知不足 有为有不为 为与不为皆为可为🌵
🍉本篇简介:🍉 本篇记录Redis五种数据类型及命令操作,如有出入还望指正。

Redis哈希(Hash)

简介

Redis中的Hash是一个键值对集合。Redis Hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。类似于java里面的Map<String,Object>集合一样,如果内存足够大的话,一个Redis的Hash结构可以存储2的32次幂-1个键值对,相当于40亿条数据,其实Hash类型的vlue在Redis中存储时其存储的还是String类型的字符串。下面就针对Hash的一些命令进行实战化演练。

常用命令

hset:设置多个field的值
hset key field value [field value ...]

将哈希表 key 中的域 field 的值设为 value 。

如果 key 不存在,一个新的哈希表被创建并进行 hset 操作。

如果域 field 已经存在于哈希表中,旧值将被覆盖。

返回值:

如果 field 是哈希表中的一个新建域,并且值设置成功,返回 1 。

如果哈希表中域 field 已经存在且旧值已被新值覆盖,返回 0 。

示例

hget:获取指定filed的值

hget key field

示例

  1. 127.0.0.1:6379> flushdb #清空db,方便测试

  2. OK

  3. 127.0.0.1:6379> hset user name kewei age 18#哈希表user中设置2个域:name和age,name的值为kewei,age的值为30

  4. (integer)2

  5. 127.0.0.1:6379> hget user name #获取user中的name

  6. "kewei"

hgetall:返回hash表所有的域和值

hgetall key

示例

  1. 127.0.0.1:6379> flushdb #清空db,方便测试

  2. OK

  3. 127.0.0.1:6379> hset user name kewei age 18#哈希表user中设置2个域:name和age,name的值为kewei,age的值为30

  4. (integer)2

  5. 127.0.0.1:6379> hgetall user #获取user所有信息

  6. 1)"name"

  7. 2)"kewei"

  8. 3)"age"

  9. 4)"18"

hmset:和hset类似(已弃用)

hmset key field value [field value ...]

hexists:判断给定的field是否存在,1:存在,0:不存在

hexists key field

查看哈希表 key 中,给定域 field 是否存在。

返回值:

如果哈希表含有给定域,返回 1 。

如果哈希表不含有给定域,或 key 不存在,返回 0 。

关注公众号【可为编程】回复【面试】领取年度最新面试题大全!!!

示例

  1. 127.0.0.1:6379> flushdb #清空db,方便测试

  2. OK

  3. 127.0.0.1:6379> hset user name kewei age 30#哈希表user中设置2个域:name和age,name的值为kewei,age的值为30

  4. (integer)2

  5. 127.0.0.1:6379> hexists user name #user中存在name域

  6. (integer)1

  7. 127.0.0.1:6379> hexists user address #user中不存在address域,返回0

  8. (integer)0

  9. 127.0.0.1:6379> hexists user1 address #user1这个key不存在,返回0

  10. (integer)0

hkeys:列出所有的filed

hkeys key

示例

  1. 127.0.0.1:6379> flushdb #清空db,方便测试

  2. OK

  3. 127.0.0.1:6379> hset user name kewei age 30#哈希表user中设置2个域:name和age,name的值为kewei,age的值为30

  4. (integer)2

  5. 127.0.0.1:6379> hkeys user #获取user中的所有filed

  6. 1)"name"

  7. 2)"age"

hvals:列出所有的value

hvals key

示例

  1. 127.0.0.1:6379> flushdb #清空db,方便测试

  2. OK

  3. 127.0.0.1:6379> hset user name kewei age 30#哈希表user中设置2个域:name和age,name的值为kewei,age的值为30

  4. (integer)2

  5. 127.0.0.1:6379> hvals user #获取user中的所有filed的值列表

  6. 1)"kewei"

  7. 2)"30"

hlen:返回filed的数量

HLEN key

返回哈希表 key 中域的数量。

返回值:

哈希表中域的数量。

当 key 不存在时,返回 0 。

示例

  1. 127.0.0.1:6379> flushdb #清空db,方便测试

  2. OK

  3. 127.0.0.1:6379> hset user name kewei age 30#哈希表user中设置2个域:name和age,name的值为kewei,age的值为30

  4. (integer)2

  5. 127.0.0.1:6379> hlen user

  6. (integer)2

hincrby:filed的值加上指定的增量

hincrby key field increment

为哈希表 key 中的域 field 的值加上增量 increment 。增量也可以为负数,相当于对给定域进行减法操作。如果 key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。如果域 field 不存在,那么在执行命令前,域的值被初始化为 0。如果对一个储存字符串值的域 field 执行 HINCRBY 命令将造成一个错误,因此只有当值为整型时才会起作用。

关注公众号【可为编程】回复【面试】领取年度最新面试题大全!!!

返回值:

执行 hincrby 命令之后,哈希表 key 中域 field 的值。

示例

  1. 127.0.0.1:6379> flushdb #清空db,方便测试

  2. OK

  3. 127.0.0.1:6379> hset siteInfo site kewei pv 1000#hash表siteInfo中有2个域:{site:"kewei",pv:1000}

  4. (integer)2

  5. 127.0.0.1:6379> hget siteInfo pv #获取siteInfo中pv的值

  6. "1000"

  7. 127.0.0.1:6379> hincrby siteInfo pv 10#siteInfo中的pv值增加10

  8. (integer)1010

  9. 127.0.0.1:6379> hget siteInfo pv #获取siteInfo中的pv

  10. "1010"

  11. 127.0.0.1:6379> hincrby siteInfo uv 500#siteInfo中的uv值增加500,uv这个域不存在,则会先添加,然后再执行hincrby

  12. (integer)500

hsetnx:当filed不存在的时候,设置filed的值

hsetnx key field value

将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在。

若域 field 已经存在,该操作无效。

如果 key 不存在,一个新哈希表被创建并执行 hsetnx 命令。

返回值:

设置成功,返回 1 。

如果给定域已经存在且没有操作被执行,返回 0 。

关注公众号【可为编程】回复【面试】领取年度最新面试题大全!!!

示例

  1. 127.0.0.1:6379> flushdb #清空db,方便测试

  2. OK

  3. 127.0.0.1:6379> hset user name kewei age 30#创建user,包含2个域:name、age

  4. (integer)2

  5. 127.0.0.1:6379> hsetnx user name tom #name已存在,设置失败,返回0

  6. (integer)0

  7. 127.0.0.1:6379> hget user name #name依旧是kewei

  8. "kewei"

  9. 127.0.0.1:6379> hsetnx user address shanghai #address不存在,设置成功

  10. (integer)1

  11. 127.0.0.1:6379> hget user address #输出address的值

  12. "shanghai"

数据结构

Hash类型对应的数据结构是2种:一种是ziplist(压缩列表),第二种时hashtable(哈希表)。当存储的数据不多时采用ziplist,当超过配置文件中的阈值时,采用hashtable进行存储。当field-vaklue长度较短个数较少时,使用ziplist,否则使用hashtable。

Redis有序集合(zset/sortedset)

简介

Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。不同之处是有序集合的每个成员都关联了一个分数(score),这个分数(score)被用来按照从最低分到最高分的方式排序集合中的成员。ZSet 有两种不同的实现,分别是ziplist(压缩表)和skiplist(跳表)。具体使用哪种结构进行存储,规则如下:

ziplist满足以下两个条件:

  1. [value,score] 键值对数量少于128个

  2. 每个元素的长度小于 64 字节

skiplist:不满足以上两个条件时使用跳表、组合了 hash 和 skiplist

  1. hash 用来存储 value 到 score 的映射,这样就可以在 O(1) 时间内找到 value 对应的分数。

  2. skiplist 按照从小到大的顺序存储分数。

  3. skiplist 每个元素的值都是 [value,score] 对。

因为元素是有序的,所以可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。

常用命令

zadd:添加元素

zadd <key><score1><member1><score2><member2>...

将一个或多个 member 元素及其 score 值加入到有序集 key 当中。

如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。

score 值可以是整数值或双精度浮点数。

如果 key 不存在,则创建一个空的有序集并执行 zadd 操作。

当 key 存在但不是有序集类型时,返回一个错误。

返回值:

被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员。

示例

  1. 127.0.0.1:6379> flushdb #清空db,方便测试

  2. OK

  3. 127.0.0.1:6379> zadd topn 100 java 80 c 90 c++50 php 70 js #创建名称为topn的zset,添加了5个元素

  4. (integer)5

zrange:score升序,获取指定索引范围的元素

zrange key start top [withscores]

  • 返回存储在有序集合key中的指定范围的元素。返回的元素可以认为是按score从最低到最高排列,如果得分相同,将按字典排序。

  • 下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。

    你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。

  • zrange key 0 -1:可以获取所有元素

  • withscores:让成员和它的 score 值一并返回,返回列表以 value1,score1, ..., valueN,scoreN 的格式表示

可用版本:

>= 1.2.0

时间复杂度:

O(log(N)+M), N 为有序集的基数,而 M 为结果集的基数。

返回值:

指定区间内,带有 score 值(可选)的有序集成员的列表。

示例

  1. 127.0.0.1:6379> flushdb #清空db,方便测试

  2. OK

  3. 127.0.0.1:6379> zadd topn 100 java 80 c 90 c++ 50 php 70 js #创建名称为topn的zset,添加了5个元素

  4. (integer)5

  5. 127.0.0.1:6379> zrange topn 0 -1#按score升序,返回topn中所有元素的值

  6. 1)"php"

  7. 2)"js"

  8. 3)"c"

  9. 4)"c++"

  10. 5)"java"

  11. 127.0.0.1:6379> zrange topn 0 -1 withscores #按score升序,返回所有元素的值以及score

  12. 1)"php"

  13. 2)"50"

  14. 3)"js"

  15. 4)"70"

  16. 5)"c"

  17. 6)"80"

  18. 7)"c++"

  19. 8)"90"

  20. 9)"java"

  21. 10)"100"

  22. 127.0.0.1:6379> zrange topn 24#返回索引范围[2,4]内的3个元素

  23. 1)"c"

  24. 2)"c++"

  25. 3)"java"

zrevrange:score降序,获取指定索引范围的元素

zrevrange key start stop [WITHSCORES]

  • 返回存储在有序集合key中的指定范围的元素。返回的元素可以认为是按score最高到最低排列, 如果得分相同,将按字典排序。

  • 下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。

    你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。

  • withscores:让成员和它的 score 值一并返回,返回列表以 value1,score1, ..., valueN,scoreN 的格式表示

示例

  1. 127.0.0.1:6379> flushdb #清空db,方便测试

  2. OK

  3. 127.0.0.1:6379> zadd topn 100 java 80 c 90 c++50 php 70 js #创建名称为topn的zset,添加了5个元素

  4. (integer)5

  5. 127.0.0.1:6379> zrevrange topn 0-1#按照score降序获取所有元素

  6. 1)"java"

  7. 2)"c++"

  8. 3)"c"

  9. 4)"js"

  10. 5)"php"

  11. 127.0.0.1:6379> zrevrange topn 02#按照score降序获取前3名

  12. 1)"java"

  13. 2)"c++"

  14. 3)"c"

zrangebyscore:按照score升序,返回指定score范围内的数据

zrangebyscore key min max [WITHSCORES][LIMIT offset count]

返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。

具有相同 score 值的成员按字典序来排列(该属性是有序集提供的,不需要额外的计算)。

可选的 LIMIT 参数指定返回结果的数量及区间(就像SQL中的 SELECT LIMIT offset, count ),注意当 offset 很大时,定位 offset 的操作可能需要遍历整个有序集,此过程最坏复杂度为 O(N) 时间。

可选的 WITHSCORES 参数决定结果集是单单返回有序集的成员,还是将有序集成员及其 score 值一起返回。

关注公众号【可为编程】回复【面试】领取年度最新面试题大全!!!

示例

  1. 127.0.0.1:6379> flushdb #清空db,方便测试

  2. OK

  3. 127.0.0.1:6379> zadd topn 100 java 80 c 90 c++50 php 70 js #创建名称为topn的zset,添加了5个元素

  4. (integer)5

  5. 127.0.0.1:6379> zrangebyscore topn 7090#score升序,获取score位于[70,90]区间中的元素值

  6. 1)"js"

  7. 2)"c"

  8. 3)"c++"

  9. 127.0.0.1:6379> zrangebyscore topn 7090 withscores #score升序,获取score位于[70,90]区间中的元素值及score

  10. 1)"js"

  11. 2)"70"

  12. 3)"c"

  13. 4)"80"

  14. 5)"c++"

  15. 6)"90"

  16. 127.0.0.1:6379> zrangebyscore topn 7090 withscores limit 12#相当于:select value,score from topn集合 where score>=70 and score<=90 order by score asc limit 1,2

  17. 1)"c"

  18. 2)"80"

  19. 3)"c++"

  20. 4)"90"

zrevrangebyscore:按照score降序,返回指定score范围内的数据

zrevrangebyscore key max min [WITHSCORES][LIMIT offset count]

返回有序集 key 中, score 值介于 max 和 min 之间(默认包括等于 max 或 min )的所有的成员。有序集成员按 score 值递减(从大到小)的次序排列。

具有相同 score 值的成员按字典序的逆序排列。

除了成员按 score 值递减的次序排列这一点外, zrevrangebyscore 命令的其他方面和 zrangebyscore 命令一样。

示例

  1. 127.0.0.1:6379> flushdb #清空db,方便测试

  2. OK

  3. 127.0.0.1:6379> zadd topn 100 java 80 c 90 c++50 php 70 js #创建名称为topn的zset,添加了5个元素

  4. (integer)5

  5. 127.0.0.1:6379> zrevrangebyscore topn 10090#score降序,获取score位于[70,90]区间中的元素值

  6. 1)"java"

  7. 2)"c++"

  8. 127.0.0.1:6379> zrevrangebyscore topn 10090 withscores #score降序,获取score位于[70,90]区间中的元素值及score

  9. 1)"java"

  10. 2)"100"

  11. 3)"c++"

  12. 4)"90"

zincrby:为指定元素的score加上指定的增量

zincrby key increment member

为有序集 key 的成员 member 的 score 值加上增量 increment 。

可以通过传递一个负数值 increment ,让 score 减去相应的值,比如 ZINCRBY key -5 member ,就是让 member 的 score 值减去 5 。

当 key 不存在,或 member 不是 key 的成员时, ZINCRBY key increment member 等同于 ZADD key increment member 。

当 key 不是有序集类型时,返回一个错误。

score 值可以是整数值或双精度浮点数。

示例

  1. 127.0.0.1:6379> flushdb #清空db,方便测试

  2. OK

  3. 127.0.0.1:6379> zadd topx 90 java 70 c 80 c++#集合topx中添加3个元素:java、c、c++,对应的score分别是:90、70、80

  4. (integer)3

  5. 127.0.0.1:6379> zrevrange topx 0-1 withscores #输出集合topx中的元素,包含score

  6. 1)"java"

  7. 2)"90"

  8. 3)"c++"

  9. 4)"80"

  10. 5)"c"

  11. 6)"70"

  12. 127.0.0.1:6379> zincrby topx 5 java #对topx中的元素java的score加5,变成95了

  13. "95"

  14. 127.0.0.1:6379> zrevrange topx 0-1 withscores # 输出集合元素,注意java的score是95了

  15. 1)"java"

  16. 2)"95"

  17. 3)"c++"

  18. 4)"80"

  19. 5)"c"

  20. 6)"70"

zrem:删除集合中多个元素

zrem key member [member ...]

移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。

当 key 存在但不是有序集类型时,返回一个错误。

示例

  1. 127.0.0.1:6379> flushdb #清空db,方便测试

  2. OK

  3. 127.0.0.1:6379> zadd topx 90 java 70 c 80 c++#集合topx中添加3个元素:java、c、c++,对应的score分别是:90、70、80

  4. (integer)3

  5. 127.0.0.1:6379> zrange topx 0-1#输出集合topx中所有元素

  6. 1)"c"

  7. 2)"c++"

  8. 3)"java"

  9. 127.0.0.1:6379> zrem topx c c++#删除集合topx中的2个元素:c、c++

  10. (integer)2

  11. 127.0.0.1:6379> zrange topx 0-1#输出集合topx中所有元素

  12. 1)"java"

zremrangebyrank:根据索引范围删除元素

zremrangebyrank key start stop

移除有序集 key 中,指定排名(rank)区间内的所有成员。

区间分别以下标参数 start 和 stop 指出,包含 start 和 stop 在内。

下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。

你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。

关注公众号【可为编程】回复【面试】领取年度最新面试题大全!!!

示例

  1. 127.0.0.1:6379> flushdb #清空db,方便测试

  2. OK

  3. 127.0.0.1:6379> zadd topx 90 java 70 c 80 c++#集合topx中添加3个元素:java、c、c++,对应的score分别是:90、70、80

  4. (integer)3

  5. 127.0.0.1:6379> zrange topx 0-1#输出集合topx中所有元素

  6. 1)"c"

  7. 2)"c++"

  8. 3)"java"

  9. 127.0.0.1:6379> zremrangebyrank topx 01#删除索引范围[0,1]的数据

  10. (integer)2

  11. 127.0.0.1:6379> zrange topx 0-1#输出topx中所有元素

  12. 1)"java"

zremrangebyscore:根据score的范围删除元素

zremrangebyscore key min max

移除有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员

示例

  1. 127.0.0.1:6379> flushdb #清空db,方便测试

  2. OK

  3. 127.0.0.1:6379> zadd topx 90 java 70 c 80 c++50 php #topx集合中添加4个元素

  4. (integer)4

  5. 127.0.0.1:6379> zrange topx 0 -1 withscores #输出topx中所有元素值、score

  6. 1)"php"

  7. 2)"50"

  8. 3)"c"

  9. 4)"70"

  10. 5)"c++"

  11. 6)"80"

  12. 7)"java"

  13. 8)"90"

  14. 127.0.0.1:6379> zremrangebyscore topx 7080#删除score位于[70,80]区间的元素

  15. (integer)2

  16. 127.0.0.1:6379> zrange topx 0 -1 withscores #输出剩下的元素

  17. 1)"php"

  18. 2)"50"

  19. 3)"java"

  20. 4)"90"

zcount:统计指定score范围内元素的个数

zcount key min max

返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量

示例

  1. 127.0.0.1:6379> flushdb #清空db,方便测试

  2. OK

  3. 127.0.0.1:6379> zadd topx 90 java 70 c 80 c++50 php #topx集合中添加4个元素

  4. (integer)4

  5. 127.0.0.1:6379> zcount topx 80100#统计score位于[80,100]区间中的元素个数

  6. (integer)2

zrank:按照score升序,返回某个元素在集合中的排名

zrank key member

返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。

排名以 0 为底,也就是说, score 值最小的成员排名为 0 。

关注公众号【可为编程】回复【面试】领取年度最新面试题大全!!!

示例

  1. 127.0.0.1:6379> flushdb #清空db,方便测试

  2. OK

  3. 127.0.0.1:6379> zadd topx 90 java 70 c 80 c++50 php #topx集合中添加4个元素

  4. (integer)4

  5. 127.0.0.1:6379> zrank topx c #获取元素c的排名,返回1表示排名第2

  6. (integer)1

  7. 127.0.0.1:6379> zrange topx 0-1#输出集合中所有元素,看一下c的位置确实是2

  8. 1)"php"

  9. 2)"c"

  10. 3)"c++"

  11. 4)"java"

zrevrank:按照score降序,返回某个元素在集合中的排名

返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递减(从大到小)排序。

排名以 0 为底,也就是说, score 值最大的成员排名为 0 。

示例

  1. 127.0.0.1:6379> flushdb #清空db,方便测试

  2. OK

  3. 127.0.0.1:6379> zadd topx 90 java 70 c 80 c++50 php #topx集合中添加4个元素

  4. (integer)4

  5. 127.0.0.1:6379> zrange topx 0-1

  6. 1)"php"

  7. 2)"c"

  8. 3)"c++"

  9. 4)"java"

  10. 127.0.0.1:6379> zrevrank topx java #score降序,得到java的排名,排在第1位

  11. (integer)0

zscore:返回集合中指定元素的score

zscore key member

返回有序集 key 中,成员 member 的 score 值。

如果 member 元素不是有序集 key 的成员,或 key 不存在,返回 nil 。

  1. 127.0.0.1:6379> flushdb #清空db,方便测试

  2. OK

  3. 127.0.0.1:6379> zadd topx 90 java 70 c 80 c++50 php #topx集合中添加4个元素

  4. (integer)4

  5. 127.0.0.1:6379> zrange topx 0-1#输出topx集合所有元素

  6. 1)"php"

  7. 2)"c"

  8. 3)"c++"

  9. 4)"java"

  10. 127.0.0.1:6379> zscore topx java #获取集合topx中java的score

  11. "90"

数据结构

SortedSet(zset)是redis提供的一个非常特别的数据结构,内部使用到了2种数据结构。

1、hash表

类似于java中的Map<String,score>,key为集合中的元素,value为元素对应的score,可以用来快速定位元素定义的score,时间复杂度为O(1)。

2、跳表

跳表(skiplist)是一个非常优秀的数据结构,实现简单,插入、删除、查找的复杂度均为O(logN)。类似java中的ConcurrentSkipListSet,根据score的值排序后生成的一个跳表,可以快速按照位置的顺序或者score的顺序查询元素。

这里我们来看一下跳表的原理:

首先从考虑一个有序表开始:

从该有序表中搜索元素 < 23, 43, 59 > ,需要比较的次数分别为 < 2, 4, 6 >,总共比较的次数为 2 + 4 + 6 = 12 次。有没有优化的算法吗? 链表是有序的,但不能使用二分查找。类似二叉搜索树,我们把一些节点提取出来,作为索引。得到如下结构:

   这里我们把 < 14, 34, 50, 72 > 提取出来作为一级索引,这样搜索的时候就可以减少比较次数了。我们还可以再从一级索引提取一些元素出来,作为二级索引,变成如下结构:

这里元素不多,体现不出优势,如果元素足够多,这种索引结构就能体现出优势来了。

Redis概述和安装

Redis五种数据类型及命令操作(一)

IOC容器创建bean实例的4种方式

由表及里分析Spring-IOC容器始末

Spring中的核心概念

关于高并发你必须知道的几个概念

线程的创建方式对比与线程池相关原理剖析

图片

相关文章:

Redis五种数据类型及命令操作(二)

&#x1f388;个人公众号:&#x1f388; :✨✨✨ 可为编程✨ &#x1f35f;&#x1f35f; &#x1f511;个人信条:&#x1f511; 知足知不足 有为有不为 为与不为皆为可为&#x1f335; &#x1f349;本篇简介:&#x1f349; 本篇记录Redis五种数据类型及命令操作&#xff0c;如…...

低代码信创开发核心技术(三):MDA模型驱动架构及元数据系统设计

前言 写最后一篇文章的时候&#xff0c;我本人其实犹豫了半年&#xff0c;在想是否发布出这篇文章&#xff0c;因为可能会动了很多人的利益。所以这篇文章既是整个低代码信创开发的高度总结&#xff0c;也是最为精华的一部分&#xff0c;它点明了低代码中最为核心的技术。虽然…...

HslCommunication模拟西门子读写数据

导入HslCommunication C#端代码&#xff08;上位机&#xff09; 这里要注意的是上位机IP用的当前电脑的IP。 using HslCommunication; using HslCommunication.Profinet.Siemens; using System; using System.Collections.Generic; using System.ComponentModel; using Syste…...

多测师肖sir_高级金牌讲师_ui自动化po框架版本02

ui自动化po框架版本02 一、 pages下的BasePage.py模块 此模块是封装所有用例的基类 比如说&#xff1a;所有用例要用到的元素定位&#xff0c;以及输入框输入&#xff0c;点击&#xff0c;下拉等等公共方法import unittest #导入unittest 框架 from time import *# 调试代码…...

线性判别分析(Linear Discriminant Analysis,LDA)

Linear Discriminant Analysis&#xff08;LDA&#xff09; 输入&#xff1a; 原始数据$D((x_1,y_1),(x_2,y_2),...,(x_m,y_m)$ 、​ 类别标签$Y[y_1,y_2,...,y_n]$、​ 降维到的维度d输出&#xff1a; 投影矩阵W、投影后的样本$Z$、算法步骤&#xff1a; 1.计算类内散度…...

git的分支及标签使用及情景演示

目录 一. 环境讲述 二.分支 1.1 命令 1.2情景演练 三、标签 3.1 命令 3.2 情景演示 ​编辑 一. 环境讲述 当软件从开发到正式环境部署的过程中&#xff0c;不同环境的作用如下&#xff1a; 开发环境&#xff1a;用于开发人员进行软件开发、测试和调试。在这个环境中…...

深度解析找不到msvcp120.dll相关问题以及解决方法

​在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcp120.dll丢失”。这个错误通常会导致某些应用程序无法正常运行&#xff0c;给用户带来很大的困扰。那么&#xff0c;如何解决msvcp120.dll丢失的问题呢&#xff1f;本文将为大家介绍…...

SQL Server 2022 安装步骤——SQL Server设置身份验证教程

目录 前言: 安装详细步骤: 第一步: 第二步: 第三步: 第四步: SQL Server 连接的方式: Window验证: SQL Server验证: 两者之间区别: 总结: SQL Server身份验证登录配置教程:​ 第一步: 第二步: 第三步: 番外篇: 前言: 本文讲解&#xff0c;如何安装SQL Server安…...

Maven各方面配置好了却无法显示版本

今天配置了maven环境&#xff0c;各方面都配置好了命令行却一直没办法显示maven的版本&#xff0c;原因 竟是两个JDK导致maven无法选择&#xff0c;因为maven依赖于JDK&#xff0c;导致在选择JDK的时候差生了二义 性&#xff0c;在环境变量里面删除不常用的JDK&#xff0c;只…...

Jdk 1.8 for mac 详细安装教程(含版本切换)

Jdk 1.8 for mac 详细安装教程&#xff08;含版本切换&#xff09; 官网下载链接 https://www.oracle.com/cn/java/technologies/downloads/#java8-mac 一、选择我们需要安装的jdk版本&#xff0c;这里以jdk8为例&#xff0c;下载 macOS 版本&#xff0c;M芯片下载ARM64版本…...

02MyBatisPlus条件构造器,自定义SQL,Service接口

一、条件构造器 1.MyBatis支持各种复杂的where条件&#xff0c;满足开发的需求 Wrapper是条件构造器&#xff0c;构建复杂的where查询 AbstractWrapper有构造where条件的所有方法&#xff0c;QueryWrapper继承后并有自己的select指定查询字段。UpdateWrapper有指定更新的字段的…...

c语言练习11周(6~10)

输入任意字串&#xff0c;将串中除了首尾字符的其他字符升序排列显示&#xff0c;串中字符个数最多20个。 题干 输入任意字串&#xff0c;将串中除了首尾字符的其他字符升序排列显示&#xff0c;串中字符个数最多20个。输入样例gfedcba输出样例gbcdefa 选择排序 #include<s…...

钉钉API与集简云无代码开发连接:电商平台与营销系统的自动化集成

连接科技与能源&#xff1a;钉钉API与集简云的一次集成尝试 在数字化时代&#xff0c;许多公司面临着如何将传统的工作方式转变为更智能、高效的挑战。某能源科技有限公司也不例外&#xff0c;他们是一家专注于能源科技领域的公司&#xff0c;产品包括节能灯具、光伏逆变器、电…...

C++算法:包含三个字符串的最短字符串

涉及知识点 有序集合 字符串 题目 给你三个字符串 a &#xff0c;b 和 c &#xff0c; 你的任务是找到长度 最短 的字符串&#xff0c;且这三个字符串都是它的 子字符串 。 如果有多个这样的字符串&#xff0c;请你返回 字典序最小 的一个。 请你返回满足题目要求的字符串。…...

华为开源carbondata中的使用问题处理

carbondata中的使用问题处理 Q&#xff1a;什么是不良记录&#xff1f; A&#xff1a;由于数据类型不兼容而无法加载到CarbonData中的记录或为空或具有不兼容格式的记录被归类为不良记录。 Q&#xff1a;CarbonData中的不良记录存储在哪里&#xff1f; A&#xff1a;不良记录…...

AI:76-基于机器学习的智能城市交通管理

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…...

区块链游戏,游戏开发

区块链游戏是一种基于区块链技术的新兴游戏类型&#xff0c;它具有去中心化、安全性高、透明度高、可追溯等特点。与传统的游戏开发相比&#xff0c;区块链游戏开发需要更多的技术和知识储备&#xff0c;同时也需要更加注重游戏本身的玩法和用户体验。 在区块链游戏中&#xff…...

单片机程序无法下载?

原因一&#xff1a;电源问题 电源可能是导致STM32微控制器无法下载程序的一个常见原因。确保电源稳定对于正常运行和下载程序至关重要。以下是一些电源问题&#xff1a; 1. 电源电压不足&#xff1a;如果STM32微控制器没有足够的电压供应&#xff0c;它可能无法正常工作或下载程…...

【数据库】【sql】如何用SQL实现跨行计算

【背景】 这里的跨行计算不是指整体聚合类的函数比如SUM等的功能&#xff0c;而是指递归算法。 比如我接到有需求&#xff0c;有一个结果字段需要是目前所有行该字段的和&#xff0c;这是属于递归类的算法&#xff0c;SQL中如何实现呢&#xff1f; 【方法】 可以使用窗口函数…...

Oracle(概念含安装)

Oracle是一种关系数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;是由美国甲骨文公司&#xff08;Oracle Corporation&#xff09;开发的。它是一个客户端/服务器系统&#xff0c;可以在各种操作系统上运行&#xff0c;包括Windows、Linux和Unix等。Oracle的设计重点…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...