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中的核心概念

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

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

图片

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言--前置++与后置++

:自增1 注意区分前置和后置 前置&#xff1a;先&#xff0c;后使用 后置&#xff1a;先使用&#xff0c;后 --:自减1 注意区分前置和后置 前置&#xff1a;先-- &#xff0c;后使用 后置&#xff0c;先使用&#xff0c;后-- int main() {int i 10;//int j i;//前置,先…

网络编程学习笔记

参考&#xff1a; 套接字通信部分 《TCP/IP 网络编程》以及《TCP/IP网络编程》学习笔记 socket 编程 1. 字节序 字节序&#xff0c;顾名思义字节的顺序&#xff0c;就是大于一个字节类型的数据在内存中的存放顺序&#xff0c;也就是说对于单字符来说是没有字节序问题的&…

如何使用PHPStudy本地快速搭建网站并实现远程访问

文章目录 [toc]使用工具1. 本地搭建web网站1.1 下载phpstudy后解压并安装1.2 打开默认站点&#xff0c;测试1.3 下载静态演示站点1.4 打开站点根目录1.5 复制演示站点到站网根目录1.6 在浏览器中&#xff0c;查看演示效果。 2. 将本地web网站发布到公网2.1 安装cpolar内网穿透2…

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

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

选购护眼台灯,全网都没有说清一个关键点!——照度均匀度

网上关于护眼台灯的选购推荐帖子多如牛毛&#xff0c;好台灯选购要点大体可归纳为以下五点&#xff1a; RG0无蓝光危害&#xff08;豁免级蓝光危害&#xff0c;RG1为低蓝光危害、RG2、RG3分别为中度和高危危害&#xff09; 无眩光&#xff0c;无可视频闪&#xff08;不刺眼…

matlab 多自由度的车辆垂向振动模型 车辆平稳性研究

1、内容简介 略 17-可以交流、咨询、答疑 多自由度的车辆垂向振动模型 多自由度的车辆垂向振动模型&#xff0c;包含四分之一车体模型、半车模型和整车模型 垂向振动模型、四分之一车体模型、半车模型和整车模型 2、内容说明 略 3、仿真分析 略 4、参考论文 略 链接&…

内存映射:PS和PL DDR3的一些区别

之前写的一些资料&#xff1a; PS与PL互联与SCU以及PG082-CSDN博客 参考别人的资料&#xff1a; PL读写PS端DDR的设计_pl读写ps端ddr数据-CSDN博客 xilinx sdk、vitis查看地址_vitis如何查看microblazed地址_yang_wei_bk的博客-CSDN博客 可见&#xff0c;PS端的DDR3需要从…

git push origin masterEverything up-to-date

按住这个看一下很简单的问题&#xff0c;我在网上看了很多就是没找到能用的&#xff0c;最后找到了这个看起来写的很简单的一个文章&#xff0c;但他写的真的有用。 出现的问题 解决步骤

JavaScript逆向之Hook技术

Hook技术&#xff1a; 背景&#xff1a; ​ 在js逆向的过程种&#xff0c;当我们遇到加密参数&#xff0c;可以使用关键字全局搜素&#xff0c;跟栈&#xff0c;还有一种就是hook技术。跟栈就是比较麻烦&#xff0c;需要我们一个个找&#xff0c;hook技术就比较厉害了&#x…

【Linux】Kali(WSL)基本操作与网络安全入门

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍WSL安装Kali及基本操作。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路…

信捷 XDH 输出点流水灯

本文以XDH 为例&#xff0c;实现输出点流水灯&#xff0c;测试输出点是否正常。 用到了FOR NEXT循环和偏移量实现。 程序下载链接如下&#xff1a; https://download.csdn.net/download/weixin_39926429/88527971

PyCharm因安装了illuminated Cloud插件导致加载项目失败

打开Pycharm时会有弹窗提示&#xff1a; The license for Illuminated Cloud is invalid or has expired. All Illuminated Cloud features will be disabled. 这个弹窗会导致你加载项目一直失败&#xff0c;close project 也关不掉&#xff0c;我都是用任务管理器杀死进程的…

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

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

统计分钟级别的视频在线用户数+列炸裂+repeat函数

统计分钟级别的视频在线用户数 1、原始数据如下&#xff1a; uid vid starttime endtime select aa as uid,v00l as vid,2023-10-25 12:00 as starttime,2023-10-2512:15 as endtime union select bb as uid,v002 as vid,2023-10-25 12:05 as starttime,2023-10-25 12:19 …

【计算机组成原理】

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

springboot苍穹外卖实战:九、缓存菜品(手动用redisTemplate实现缓存逻辑)+缓存套餐(Spring cache实现)

缓存菜品 缺点 缓存和数据库的数据一致性通常解决方案&#xff1a;延时双删、异步更新缓存、分布式锁。 该项目对于缓存菜品的处理较为简单&#xff0c;实际可以用管道技术提高redis的操作效率、同时cache自身有注解提供使用。 功能设计与缓存设计 建议这部分去看下原视频&…

LeetCode算法心得——高级访客(模拟枚举+小窗口)

大家好&#xff0c;我是晴天学长&#xff0c;今天的周赛第二题&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .高级访客 给你一个长度为 n 、下标从 0 开始的二维字符串数组 access_times 。对于每个 …

NetSuite 固定资产报表自定义原理及应用

NetSuite固定资产模块一直处于功能迭代更新中&#xff0c;目前23.2的版本能够支持报表的局部自定义&#xff0c;比如增加原值或已折旧期间&#xff0c;甚至固定资产自定义字段等。但是当我们在实际项目中&#xff0c;会遇到一些挑战&#xff0c;例如&#xff1a; 固定资产原值…

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

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

servlet 的XML Schema从哪边获取

servlet 6.0的规范定义&#xff1a; https://jakarta.ee/specifications/servlet/6.0/ 其中包含的三个XML Schema&#xff1a;web-app_6_0.xsd、web-common_6_0.xsd、web-fragment_6_0.xsd。但这个页面没有给出下载的链接地址。 正好我本机有Tomcat 10.1.15版本的源码&#…