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

【redis】set和zset常用命令

set 无序集合类型

sadd 和 smembers

SADD:将一个或者多个元素添加到set中。注意,重复的元素无法添加到set中。

语法:SADD key member [member]

把集合中的元素,叫做member,就像hash类型中,叫做field类似.

返回值表示本次操作,添加成功了几个元素.

时间复杂度:O(1)

SMEMBERS:获取一个set中的所有元素,注意,元素间的顺序是无序的。

语法:SMEMBERS key

返回值:所有元素的列表。

时间复杂度:0(N)

127.0.0.1:6379> flushall
OK
127.0.0.1:6379> sadd key 1 2 3 4
(integer) 4
127.0.0.1:6379> type key
set
127.0.0.1:6379> sadd key2 1 1 2 3 4
(integer) 4
127.0.0.1:6379> smembers key
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> smembers key2
1) "1"
2) "2"
3) "3"
4) "4"

sismember 和 scard

SISMEMBER:判断一个元素在不在set中。

语法:SISMEMBER key member

时间复杂度:0(1)

返回值:1表示元素在set中。0表示元素不在set中或者key不存在。

scard:获取一个set的基数(cardinality),即set中的元素个数。

语法:SCARD key

127.0.0.1:6379> sismember key 1
(integer) 1
127.0.0.1:6379> sismember key 100
(integer) 0
127.0.0.1:6379> scard key
(integer) 4
127.0.0.1:6379> scard key2
(integer) 4

spop和srandmember

spop:使用spop删除元素的时候其实是随机删除.

SPOP key [count]

返回值:取出的元素。

srandmember:随机获取集合中的元素

127.0.0.1:6379> flushall
OK
127.0.0.1:6379> sadd key 1 2 3 4
(integer) 4
127.0.0.1:6379> spop key
"3"
127.0.0.1:6379> spop key
"2"
127.0.0.1:6379> spop key
"4"
127.0.0.1:6379> spop key
"1"
-- 再次创建一个
127.0.0.1:6379> sadd key2 1 2 3 4
(integer) 4
127.0.0.1:6379> spop key2
"1"
127.0.0.1:6379> spop key2
"2"
127.0.0.1:6379> spop key2
"3"
127.0.0.1:6379> spop key2
"4"
-- 随机获取集合元素
127.0.0.1:6379> sadd key 1 2 3 4
(integer) 4
127.0.0.1:6379> srandmember key
"1"
127.0.0.1:6379> srandmember key
"4"
127.0.0.1:6379> srandmember key
"3"
-- 随机获取多个元素
127.0.0.1:6379> srandmember key 2
1) "3"
2) "2"

smove和srem

语法:SMOVE source destination member

smove含义:把member从source上删除,再插入到destination中

127.0.0.1:6379> flushall
OK
127.0.0.1:6379> sadd key 1 2 3 4
(integer) 4
127.0.0.1:6379> sadd key2 5 6 7 8
(integer) 4
127.0.0.1:6379> smove key key2 1
(integer) 1
127.0.0.1:6379> SMEMBERS key
1) "2"
2) "3"
3) "4"
127.0.0.1:6379> SMEMBERS key2
1) "1"
2) "5"
3) "6"
4) "7"
5) "8"
-- 给key里再添加一个1,再次把这个1移动给key2
-- 针对上述的情况,smove不会视为出错。
-- 也会按照删除-插入进行执行
127.0.0.1:6379> sadd key 1
(integer) 1
127.0.0.1:6379> smove key key2 1
(integer) 1
127.0.0.1:6379> SMEMBERS key
1) "2"
2) "3"
3) "4"
127.0.0.1:6379> SMEMBERS key2
1) "1"
2) "5"
3) "6"
4) "7"
5) "8"
-- 如果要移动的元素在source中不存在。
-- 此时就会返回0表示移动失败了。
127.0.0.1:6379> SMOVE key key2 100
(integer) 0

srem:可以一次删除一个member,也可以一次删除多个membeer .

语法:返回值表示删除成功的元素个数。

127.0.0.1:6379> flushall
OK
127.0.0.1:6379> sadd key 1 2 3 4
(integer) 4
127.0.0.1:6379> srem key 1
(integer) 1
127.0.0.1:6379> srem key 3 4
(integer) 2
127.0.0.1:6379> SMEMBERS key
1) "2"

集合间的操作

交集:sinter和sinterstore
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> sadd key  1 2 3 4
(integer) 4
127.0.0.1:6379> sadd key2  3 4 5 6
(integer) 4
127.0.0.1:6379> SINTER key key2
1) "3"
2) "4"
-- SINTERSTORE 把交集放到集合中
127.0.0.1:6379> SINTERSTORE key3 key key2
(integer) 2
127.0.0.1:6379> SMEMBERS key3
1) "3"
2) "4"
并集:sunion,sunionstore
127.0.0.1:6379> sunion key key2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
127.0.0.1:6379> SUNIONSTORE key4 key key2
(integer) 6
127.0.0.1:6379> SMEMBERS key4
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
差集:sdiff,sdiffstore
127.0.0.1:6379> SDIFF key key2
1) "1"
2) "2"
127.0.0.1:6379> SDIFF key2 key
1) "5"
2) "6"
127.0.0.1:6379> SDIFFSTORE key5 key key2
(integer) 2
127.0.0.1:6379> SMEMBERS key5
1) "1"
2) "2"
127.0.0.1:6379> SDIFFSTORE key6 key2 key
(integer) 2
127.0.0.1:6379> SMEMBERS key6
1) "5"
2) "6"

set类型的编码

127.0.0.1:6379> flushall
OK
127.0.0.1:6379> sadd key 1 2 3 4
(integer) 4
127.0.0.1:6379> OBJECT encoding key
"intset"
127.0.0.1:6379> sadd key hello
(integer) 1
127.0.0.1:6379> OBJECT encoding key
"hashtable"

zset 有序集合

zadd和zrange

zadd:往有序集合中,添加元素和分数。

ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member…]

member和score称为是一个"pair"。注意:添加的时候,既要添加元素,又要添加分数

有序集合:分数相同,再按照元素自身字符串的字典序来排列。分数不同,仍然按照分数来排。

XX:仅仅用于更新已经存在的元素,不会添加新元素。
NX:仅用于添加新元素,不会更新已经存在的元素。
CH:默认情况下,ZADD返回的是本次添加的元素个数,但指定这个选项之后,就会还包含本次更新的元素的个数。
INCR:此时命令类似ZINCRBY的效果,将元素的分数加上上指定的分数。此时只能指定一个元素和分数。

之前Hash,Set, List很多时候,添加一个元素,都是O(1)。此处,Zset则是logN。由于zset是有序结构,要求新增的元素,要放到合适的位置上(找位置)。

zrange查看有序集合中的元素详情了。类似于Irange,可以指定一对下标构成的区间。

时间复杂度:O(log(N)+M),start-stop区间的元素个数。此处要根据下标找到边界值。start对应的位置,接下来就需要遍历了。

-- 添加集合
127.0.0.1:6379> zadd key 99 吕布 98 赵云 96 典韦 95 关羽
(integer) 4
127.0.0.1:6379> zrange key 0 -1
关羽
典韦
赵云
吕布
127.0.0.1:6379> zrange key 0 -1 withscores
关羽
95
典韦
96
赵云
98
吕布
99
127.0.0.1:6379> zadd key 97 赵云
0
127.0.0.1:6379> zrange key 0 -1 withscores
关羽
95
典韦
96
赵云
97
吕布
99
-- 如果修改的分数,影响到了之前的顺序,就会自动的移动元素位置,保持原有的升序顺序不变
127.0.0.1:6379> zadd key 10 吕布
0
127.0.0.1:6379> zrange key 0 -1 withscores
吕布
10
关羽
95
典韦
96
赵云
97

nx和XX

-- nx 仅用于添加新元素,不会更新已经存在的元素。
127.0.0.1:6379> zadd key nx 94 张飞
1
127.0.0.1:6379> zrange key 0 -1 withscores
吕布
10
张飞
94
关羽
95
典韦
96
赵云
97
127.0.0.1:6379> zadd key nx 92  张飞
0
127.0.0.1:6379> zrange key 0 -1 withscores
吕布
10
张飞
94
关羽
95
典韦
96
赵云
97
-- XX: 仅仅用于更新已经存在的元素,不会添加新元素。
127.0.0.1:6379> zadd key XX 92 张飞
0
127.0.0.1:6379> zrange key 0 -1 withscores
吕布
10
张飞
92
关羽
95
典韦
96
赵云
97
127.0.0.1:6379> zadd key XX 90 马超
0
127.0.0.1:6379> zrange key 0 -1 withscores
吕布
10
张飞
92
关羽
95
典韦
96
赵云
97
-- zadd在默认情况下,返回值就是新增成功的元素个数.
-- 指定这个选项之后,就会还包含本次更新的元素的个数。
127.0.0.1:6379> zadd key CH  90 张飞
1
127.0.0.1:6379> zrange key 0 -1 withscores
吕布
10
张飞
90
关羽
95
典韦
96
赵云
97
-- INCR:此时命令类似ZINCRBY的效果,将元素的分数加上上指定的分数。此时只能指定一个元素和分数。
127.0.0.1:6379> zadd key incr 4 张飞
94
127.0.0.1:6379> zrange key 0 -1 withscores
吕布
10
张飞
94
关羽
95
典韦
96
赵云
97

zcard,zcount

zcard :获取一个zset的基数(cardinality),即zset中的元素个数。

语法:ZCARD key

zcount:返回分数在min和max之间的元素个数,默认情况下,min[max都是包含的,可以通过(排除

ZCOUNT key min max

zcount的时间复杂度O(logN)。

min和max是可以写成浮点数(zset分数本身就是浮点数)
在浮点数中,存在两个特殊的数值:

  • inf:无穷大.
  • -inf:负无穷大.

zset中分数也是支持使用 inf和-inf作为max和min的

-- 有序集合中元素的个数
127.0.0.1:6379> zcard key
5
-- 集合分数区间中的元素的个数
127.0.0.1:6379> zcount key 95 97
3
127.0.0.1:6379> zcount key (95 97
2
127.0.0.1:6379> zcount key (95 (97
1
127.0.0.1:6379> zcount key -inf inf
5

zrevrange,zrangebyscore

ZREVRANGE:reverse ==> 逆序。按照分数降序进行遍历并打印。
语法:ZREVRANGE key start stop [WITHSCORES]

此处的区间,两个参数的顺序是不需要变的

zrangebyscore:按照分数来找元素的.相当于和刚才的zcount类似

这个命令可能在6.2.0之后废弃,并且功能合并到ZRANGE中。

时间复杂度:O(logN + M)

127.0.0.1:6379> ZREVRANGE key 0 -1 withscores
赵云
97
典韦
96
关羽
95
张飞
94
吕布
10
127.0.0.1:6379> ZRANGEBYSCORE key 95 97
关羽
典韦
赵云
127.0.0.1:6379> ZRANGEBYSCORE key 95 97 withscores
关羽
95
典韦
96
赵云
97

zpopmax

zpopmax : 删除并返回分数最高的count个元素。

返回值就是被删除的元素(包括member和score).

如果存在多个元素,分数相同,同时为最大值,zpopmax删的时候,仍然只删除其中一个元素。分数虽然是主要因素。如果分数相同会按照member字符串的字典序决定先后

O(log(N) * M):M : count要删除的元素个数。N是有序集合的元素个数.

127.0.0.1:6379> zrange key 0 -1 withscores
吕布
10
张飞
94
关羽
95
典韦
96
赵云
97
127.0.0.1:6379> zpopmax key
赵云
97
127.0.0.1:6379> zpopmax key 2
典韦
96
关羽
95
-- 再次插入两个有序集合元素
127.0.0.1:6379> zadd key 96 关羽  96 典韦
2
127.0.0.1:6379> zpopmax key
典韦
96

bzpopmax

bzpopmax:ZPOPMAX的阻塞版本。

语法:BZPOPMAX key [key …] timeout

阻塞也是在有序集合为空的时候触发阻塞.阻塞到有其他客户端插入元素

timeout表示超时时间,最多阻塞多久。单位是s,支持小数形式。写作0.1就是100ms。

如果有序集合中已经有了元素了,直接就能返回不会阻塞了。

用法和blpop,brpop的用法一样。都可以同时阻塞多个key。

-- 客户端1
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> zadd key 10 zhangsan 20 lisi 30 wangwu
(integer) 3
-- 客户端2
-- 获取如果有序集合中有元素就获取,无元素就阻塞
127.0.0.1:6379> BZPOPMAX key 600
1) "key"
2) "wangwu"
3) "30"
127.0.0.1:6379> BZPOPMAX key 600
1) "key"
2) "lisi"
3) "20"
127.0.0.1:6379> BZPOPMAX key 600
1) "key"
2) "zhangsan"
3) "10"
127.0.0.1:6379> BZPOPMAX key 600
-- 客户端1
127.0.0.1:6379> zadd key 40 zhaoliu 50 zhangqi 60 laoba
(integer) 3
-- 客户端2
-- 客户端1,增加元素后。BZPOPMAX获取元素
127.0.0.1:6379> BZPOPMAX key 600
1) "key"
2) "laoba"
3) "60"
(115.58s)

zpopmin和bzpopmin

zpopmin : 删除有序集合中,最小的元素。

时间复杂度O(logN*M)

此处的zpopmin和上面的zpopmax的逻辑是一致的(同一个函数实现的)
虽然redis的有序集合记录了开头的元素,但是删除的时候使用的是通用的删除函数。导致出现了重新查找的过程。

bzpopmin:阻塞版本的zpopmin

语法:BZPOPMIN key [key …] timeout

用法和BZPOPMAX一样的。时间复杂度,也是O(logN)。

127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> zadd key 10 zhangsan 20 lisi 30 wangwu
3
127.0.0.1:6379> zrange key 0 -1 withscores
zhangsan
10
lisi
20
wangwu
30
127.0.0.1:6379> zpopmin key
zhangsan
10
127.0.0.1:6379> zpopmin key 2
lisi
20
wangwu
30
-- 客户端1
-- 没有元素进行阻塞等待
127.0.0.1:6379> BZPOPMIN key 600
-- 客户端2
127.0.0.1:6379> zadd key 10 zhangsan 20 lisi 30 wangwu
(integer) 3
-- 客户端1
-- 集合中有元素就立刻取出
-- 有元素后,获取元素不会阻塞等待
127.0.0.1:6379> BZPOPMIN key 600
1) "key"
2) "zhangsan"
3) "10"
(89.55s)
127.0.0.1:6379> BZPOPMIN key 600
1) "key"
2) "lisi"
3) "20"
127.0.0.1:6379> BZPOPMIN key 600
1) "key"
2) "wangwu"
3) "30"

zrank,zrevrank,zscore

zrank:返回指定元素的排名,升序。

语法:ZRANK key member

时间复杂度O(logN)

zrank得到的下标,是从前往后算的(升序)

zrevrank:也是获取到member的下标。但是是反着算的。rev => reverse

语法:ZREVRANK key member

时间复杂度O(logN)

zscore:返回指定元素的分数。

语法:ZSCORE key member

时间复杂度:0(1)

127.0.0.1:6379> flushall
OK
127.0.0.1:6379> zadd key 10 zhangsan 20 lisi 30 wangwu 40 zhaoliu
(integer) 4
127.0.0.1:6379> zrank key lisi
(integer) 1
127.0.0.1:6379> zrank key wangwu
(integer) 2
127.0.0.1:6379> zrank key aaa
(nil)
127.0.0.1:6379> zrevrank key lisi
(integer) 2
127.0.0.1:6379> zrevrank key wangwu
(integer) 1
127.0.0.1:6379> zrevrank key zhaoliu
(integer) 0
127.0.0.1:6379> zscore key zhangsan
"10"
127.0.0.1:6379> zscore key lisi
"20"

zrem,zremrangebyrank,zremrangebyscore

zrem:删除指定的元素。

语法:ZREM key member [member …]

O(logN * M):参数中member的个数。N是整个有序集合中元素个数。

zremrangebyrank:按照排序,升序删除指定范围(下标)的元素,左闭右闭。

语法:ZREMRANGEBYRANK key start stop

时间复杂度:O(logN + M) ,N整个有序集合的元素个数。M是start-stop区间中元素个数。此处查找位置,只需要进行一次(不需要重复进行)

zremrangebyscore:按照分数删除指定范围的元素,左闭右闭。

语法:ZREMRANGEBYSCORE key min max

时间复杂度:O(log(N)+M)

返回值:本次操作删除的元素个数。

127.0.0.1:6379> flushall
OK
127.0.0.1:6379> zadd key 10 zhangsan 20 lisi 30 wangwu 40 zhaoliu
(integer) 4
127.0.0.1:6379> ZRANGE key 0 -1 withscores
1) "zhangsan"
2) "10"
3) "lisi"
4) "20"
5) "wangwu"
6) "30"
7) "zhaoliu"
8) "40"
127.0.0.1:6379> zrem key zhangsan
(integer) 1
127.0.0.1:6379> zrem key lisi wangwu
(integer) 2
-- ZREMRANGEBYRANK
127.0.0.1:6379> flushall
OK
127.0.0.1:6379>  zadd key 10 zhangsan 20 lisi 30 wangwu 40 zhaoliu
(integer) 4
127.0.0.1:6379> ZREMRANGEBYRANK key 1 2
(integer) 2
127.0.0.1:6379> zrange key 0 -1
1) "zhangsan"
2) "zhaoliu"
-- ZREMRANGEBYSCORE
127.0.0.1:6379> flushall
OK
127.0.0.1:6379>  zadd key 10 zhangsan 20 lisi 30 wangwu 40 zhaoliu
(integer) 4
127.0.0.1:6379> ZREMRANGEBYSCORE key 20 30
(integer) 2
127.0.0.1:6379> zrange key 0 -1
1) "zhangsan"
2) "zhaoliu"

zincrby

zincrby:为指定的元素的关联分数添加指定的分数值。

语法:ZINCRBY key increment member

不光会修改分数内容。也能同时移动元素位置.保持整个有序集合仍然是升序的。

127.0.0.1:6379> flushall
OK
127.0.0.1:6379>  zadd key 10 zhangsan 20 lisi 30 wangwu 40 zhaoliu
(integer) 4
127.0.0.1:6379> ZINCRBY key 15 zhangsan
"25"
127.0.0.1:6379> zrange key 0 -1 withscores
1) "lisi"
2) "20"
3) "zhangsan"
4) "25"
5) "wangwu"
6) "30"
7) "zhaoliu"
8) "40"
127.0.0.1:6379> ZINCRBY key -15 zhangsan
"10"
127.0.0.1:6379> zrange key 0 -1 withscores
1) "zhangsan"
2) "10"
3) "lisi"
4) "20"
5) "wangwu"
6) "30"
7) "zhaoliu"
8) "40"
127.0.0.1:6379> ZINCRBY key 0.5 zhangsan
"10.5"
127.0.0.1:6379> zrange key 0 -1 withscores
1) "zhangsan"
2) "10.5"
3) "lisi"
4) "20"
5) "wangwu"
6) "30"
7) "zhaoliu"
8) "40"

集合间的操作

交集:zinterstore

zinterstore:求有序集合的交集,结果放到第三张表中

语法:ZINTERSTORE destination numkeys key [key …] [WEIGHTS weight] [weight …]] [AGGREGATE <SUM |MIN | MAX>]

numkeys:整数,描述了后续有几个key参与交集运算

WEIGHTS:权重

AGGREGATE:要把结果存储到哪个key,对应的zset中。

时间复杂度:O(NK)+O(Mlog(M))N是输入的有序集合中,最小的有序集合的元素个数;K是输入了几个有序集合;M是最终结果的有序集合的元素个数.

127.0.0.1:6379> flushall
OK
127.0.0.1:6379> zadd key 10 zhangsan 20 lisi  30 wangwu
(integer) 3
127.0.0.1:6379> zadd key2 15 zhangsan 25 lisi 35 zhaoliu
(integer) 3
127.0.0.1:6379> ZINTERSTORE key3 2 key key2
(integer) 2
127.0.0.1:6379> ZRANGE key3 0 -1 withscores
1) "zhangsan"
2) "25"
3) "lisi"
4) "45"
-- WEIGHTS 权重交集
127.0.0.1:6379> ZINTERSTORE key4 2 key key2 weights 2 3
(integer) 2
127.0.0.1:6379> zrange key4 0 -1 withscores
1) "zhangsan"
2) "65"
3) "lisi"
4) "115"
-- AGGREGATE:最大数交集
127.0.0.1:6379> ZINTERSTORE key5 2 key key2 AGGREGATE max
(integer) 2
127.0.0.1:6379> zrange key5 0 -1 withscores
1) "zhangsan"
2) "15"
3) "lisi"
4) "25"
-- AGGREGATE:最小数交集
127.0.0.1:6379> ZINTERSTORE key6 2 key key2 AGGREGATE min
(integer) 2
127.0.0.1:6379> zrange key6 0 -1 withscores
1) "zhangsan"
2) "10"
3) "lisi"
4) "20"
并集:zunionstore

zunionstore:求有序结合的并集

语法:ZUNIONSTORE destination numkeys key [key …] [WEIGHTS weight] [weight …]] [AGGREGATE <SUM | MIN | MAX>]

zunionstore用法和zinterstore基本一致.

127.0.0.1:6379> flushall
OK
127.0.0.1:6379> zadd key 10 zhangsan 20 lisi 30 wangwu
(integer) 3
127.0.0.1:6379> zadd key2 15 zhangsan 25 lisi 35 zhaoliu
(integer) 3
127.0.0.1:6379> ZUNIONSTORE key3 2 key key2 
(integer) 4
127.0.0.1:6379> zrange key3 0 -1 withscores
1) "zhangsan"
2) "25"
3) "wangwu"
4) "30"
5) "zhaoliu"
6) "35"
7) "lisi"
8) "45"
-- 根据权重求交集
127.0.0.1:6379> ZUNIONSTORE key4 2 key key2 weights 0.5 0.5
(integer) 4
127.0.0.1:6379> zrange key4 0 -1 withscores
1) "zhangsan"
2) "12.5"
3) "wangwu"
4) "15"
5) "zhaoliu"
6) "17.5"
7) "lisi"
8) "22.5"
-- 
127.0.0.1:6379> ZUNIONSTORE key5 2 key key2 aggregate min
(integer) 4
127.0.0.1:6379> zrange key5 0 -1 withscores
1) "zhangsan"
2) "10"
3) "lisi"
4) "20"
5) "wangwu"
6) "30"
7) "zhaoliu"
8) "35"
127.0.0.1:6379> ZUNIONSTORE key6 2 key key2 aggregate max
(integer) 4
127.0.0.1:6379> zrange key6 0 -1 withscores
1) "zhangsan"
2) "15"
3) "lisi"
4) "25"
5) "wangwu"
6) "30"
7) "zhaoliu"
8) "35"

数据类型

如果有序集合中的元素个数较少,或者单个元素体积较小。使用ziplist来存储。

如果当前元素个数比较多,或者单个元素体积非常大。使用skiplist来存储了。

127.0.0.1:6379> flushall
OK
127.0.0.1:6379> zadd key 10 zhangsan 20 lisi 30 wangwu
(integer) 3
127.0.0.1:6379> object encoding key
"ziplist"
127.0.0.1:6379> zadd key 40 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
(integer) 1
127.0.0.1:6379> object encoding key
"skiplist"

相关文章:

  • JavaScript 贪心算法(Greedy Algo)
  • 数据库索引的理解
  • Windows系统电脑本地部署AI音乐创作工具并实现无公网IP远程使用
  • Python实用代码片段分享(三)
  • Python3 函数参数
  • tongweb7049m1升级到tongweb7049m3,启动 报错:realm can not be null(by jjz+yjm+lqw)
  • 开窗函数!
  • Android实现无线连接ADB调试
  • STM32学习和实践笔记(33):待机唤醒实验
  • 操作系统 - 文件管理
  • LeetCode 算法:接雨水c++
  • 【刷题(16)】子串
  • 提莫攻击 ---- 模拟算法
  • 备战十一届大唐杯国赛预选赛
  • C# as运算符
  • [case10]使用RSQL实现端到端的动态查询
  • 【译】理解JavaScript:new 关键字
  • 5、React组件事件详解
  • Angular Elements 及其运作原理
  • CODING 缺陷管理功能正式开始公测
  • JAVA 学习IO流
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • PHP面试之三:MySQL数据库
  • Terraform入门 - 3. 变更基础设施
  • ubuntu 下nginx安装 并支持https协议
  • vue的全局变量和全局拦截请求器
  • 给第三方使用接口的 URL 签名实现
  • 和 || 运算
  • 基于 Babel 的 npm 包最小化设置
  • 简单易用的leetcode开发测试工具(npm)
  • 跳前端坑前,先看看这个!!
  • 新版博客前端前瞻
  • 在Mac OS X上安装 Ruby运行环境
  • 怎样选择前端框架
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 【干货分享】dos命令大全
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • MPAndroidChart 教程:Y轴 YAxis
  • ​香农与信息论三大定律
  • # 消息中间件 RocketMQ 高级功能和源码分析(七)
  • (11)MATLAB PCA+SVM 人脸识别
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (Note)C++中的继承方式
  • (Qt) 默认QtWidget应用包含什么?
  • (TOJ2804)Even? Odd?
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (独孤九剑)--文件系统
  • (黑马点评)二、短信登录功能实现
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (三十五)大数据实战——Superset可视化平台搭建
  • (四) Graphivz 颜色选择
  • (算法)Travel Information Center
  • (已解决)什么是vue导航守卫
  • (原創) 如何將struct塞進vector? (C/C++) (STL)