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

news2024/11/18 7:46:37

🎈个人公众号:🎈 :✨✨✨ 可为编程✨ 🍟🍟
🔑个人信条:🔑 知足知不足 有为有不为 为与不为皆为可为🌵
🍉本篇简介:🍉 本篇记录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中的核心概念

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

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

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1200341.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Oracle(2-1) Networking Overview

文章目录 一、基础知识1、Network Environ Challenges 网络环境挑战2、Simple Network :2-Tier 简单的两层网络3、Simple to Complex : N-Tier 简单到复杂&#xff1a;N层网络4、Oracle Network Solutions Oracle网络解决方案5、Key Features of Oracle Net Oracle Net的主要功…

[MySQL] MySQL表的基础操作

文章目录 一、创建表 1、1 SQL语法 1、2 实例演示 二、查询表 三、修改表 3、1 修改表名字 3、2 新增列&#xff08;字段&#xff09; 3、3 修改列类型 3、4 修改列名 3、5 删除表 四、总结 &#x1f64b;‍♂️ 作者&#xff1a;Ggggggtm &#x1f64b;‍♂️ &#x1f440; 专…

详解Redis持久化(上篇——RDB持久化)

Redis持久化的作用和意义 Redis 持久化是一种机制&#xff0c;用于将内存中的数据写入磁盘&#xff0c;以保证数据在服务器重启时不会丢失。持久化是为了解决内存数据库&#xff08;如 Redis&#xff09;在服务器关闭后&#xff0c;数据丢失的问题。 Redis 持久化的主要作用和…

如何判断一个角是否大于180度(2)

理论计算见上一篇&#xff1a; 如何判断一个角是否大于180度&#xff1f;_kv1830的博客-CSDN博客 此篇为代码实现 一。直接上代码&#xff1a; import cv2 as cv import numpy as np import mathdef get_vector(p_from, p_to):return p_to[0] - p_from[0], p_to[1] - p_from…

【第六章】软件设计师 之 数据结构与算法基础

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 1、数据结构与算法基础 2、数据 3、稀疏矩阵…

【第三章】软件设计师 之 数据库系统

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 1、数据库系统前言 2、三级模式 - 两级映射…

爬虫项目(12):正则、多线程抓取腾讯动漫,Flask展示数据

文章目录 书籍推荐正则抓取腾讯动漫数据Flask展示数据 书籍推荐 如果你对Python网络爬虫感兴趣&#xff0c;强烈推荐你阅读《Python网络爬虫入门到实战》。这本书详细介绍了Python网络爬虫的基础知识和高级技巧&#xff0c;是每位爬虫开发者的必读之作。详细介绍见&#x1f44…

Netty入门指南之NIO Selector写操作

作者简介&#xff1a;☕️大家好&#xff0c;我是Aomsir&#xff0c;一个爱折腾的开发者&#xff01; 个人主页&#xff1a;Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏&#xff1a;Netty应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言操作演…

transfomer模型——简介,代码实现,重要模块解读,源码,官方

一、什么是transfomer Transformer是一种基于注意力机制&#xff08;attention mechanism&#xff09;的神经网络架构&#xff0c;最初由Vaswani等人在论文《Attention Is All You Need》中提出。它在自然语言处理&#xff08;NLP&#xff09;领域取得了巨大成功&#xff0c;特…

自定义Graph Component:1.1-JiebaTokenizer具体实现

JiebaTokenizer类继承自Tokenizer类&#xff0c;而Tokenizer类又继承自GraphComponent类&#xff0c;GraphComponent类继承自ABC类&#xff08;抽象基类&#xff09;。本文使用《使用ResponseSelector实现校园招聘FAQ机器人》中的例子&#xff0c;主要详解介绍JiebaTokenizer类…

JavaScript_动态表格_添加功能

1、动态表格_添加功能.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>动态表格_添加功能</title><style>table{border: 1px solid;margin: auto;width: 100%;}td,th{text-align: ce…

Python:Unittest框架快速入门:用例、断言、夹具、套件、HTML报告、ddt数据驱动

快速看了套Unittest的入门教程 软件测试全套资料赠送_哔哩哔哩_bilibili软件测试全套资料赠送是快速入门unittest测试框架&#xff01;全实战详细教学&#xff0c;仅此一套&#xff01;的第1集视频&#xff0c;该合集共计11集&#xff0c;视频收藏或关注UP主&#xff0c;及时了…

ElasticSearch学习和使用 (使用head软件可视化es数据)

使用步骤 直接使用 Elasticsearch的安装和使用 下载Elasticsearch6.2.2的zip包&#xff0c;并解压到指定目录&#xff0c;下载地址&#xff1a;https://www.elastic.co/cn/downloads/past-releases/elasticsearch-6-2-2运行bin目录下的elasticsearch.bat启动Elasticsearch安…

【Python】python读取,显示,保存图像的几种方法

一、PIL&#xff1a;Python Imaging Library&#xff08;pillow&#xff09; PIL读取图片不直接返回numpy对象&#xff0c;可以用numpy提供的函数np.array()进行转换&#xff0c;亦可用Image.fromarray()再从numpy对象转换为原来的Image对象&#xff0c;读取&#xff0c;显示&…

Deepsort项目详解

一、目标追踪整体代码 代码目录如下图所示&#xff1a; 、 追踪相关代码&#xff1a; 检测相关代码和权重 调用 检测 和 追踪的代码&#xff1a; 首先代码分为三个部分&#xff1a; 目标追踪的相关代码和权重目标检测相关代码和权重&#xff0c;这里用的是yolov5.5目标检…

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

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

java--JDBC学习

文章目录 今日内容0 复习昨日1 JDBC概述2 JDBC开发步骤2.1 创建java项目2.2 导入mysql驱动包2.2.1 复制粘贴版本2.2.2 idea导入类库版本 2.3 JDBC编程 3 完成增删改3.1 插入3.2 更新3.3 删除 4 查询结果集ResultSet【重要】5 登录案例【重要】6 作业 今日内容 0 复习昨日 1 JDB…

数据结构:树的存储结构(孩子兄弟表示法,树和森林的遍历)

目录 1.树的存储结构1.双亲表示法&#xff08;顺序存储&#xff09;1.优缺点 2.孩子表示法&#xff08;顺序链式存储&#xff09;3.孩子兄弟表示法&#xff08;链式存储&#xff09;4.森林与二叉树的转换 2.树的遍历1.先根遍历2.后根遍历3.层序遍历 3.森林的遍历1.先序遍历2.中…

汉明距离(Java)

两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。 给你两个整数 x 和 y&#xff0c;计算并返回它们之间的汉明距离。 方法1:使用内置函数 class Solution {public int hammingDistance(int x, int y) {return Integer.bitCount(x ^ y);} }方法2:移位实…

Flutter:改变手机状态栏颜色,与appBar状态颜色抱持一致

前言 最近在搞app的开发&#xff0c;本来没怎么注意appBar与手机状态栏颜色的问题。但是朋友一说才注意到这两种的颜色是不一样的。 我的app 京东 qq音乐 这样一对比发现是有的丑啊&#xff0c;那么如何实现呢&#xff1f; 实现 怎么说呢&#xff0c;真不会。百度到的一些是…