11.Redis之zset类型

1.zset类型基本介绍

有序描述的是:升序/降序

Set 集合
1.唯一
2. 无序
孙行者,行者孙, 者行孙 =>同一只猴~~
List
有序的
孙行者,行者孙, 者行孙 =>不同的猴~~
zset 中的 member 仍然要求是唯一的!!(score 则可以重复)

  • 排序的规则是啥?

给 zset 中的 member 同时引入了一个属性分数(score),浮点类型

每个 member 都会安排一个分数
进行排序的时候, 就是依照此处的 分数 大小来进行升序/降序排序

 

2.zset相关命令 

2.1 zadd

添加或者更新指定的元素以及关联的分数到 zset 中,分数应该符合 double 类型,+inf/-inf 作为正负极限也是合法的。
ZADD 的相关选项:
XX:仅仅⽤于更新已经存在的元素,不会添加新元素。
NX:仅⽤于添加新元素,不会更新已经存在的元素。
CH:默认情况下,ZADD 返回的是本次添加的元素个数,但指定这个选项之后,就会还包含本次更
新的元素的个数。
INCR:此时命令类似 ZINCRBY 的效果,将元素的分数加上指定的分数。此时只能指定⼀个元素和分数。
语法:
ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member ...]
命令有效版本:1.2.0 之后
时间复杂度:O(log(N))
返回值:本次添加成功的元素个数。
⽰例:
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 1 "uno"
(integer) 1
redis> ZADD myzset 2 "two" 3 "three"
(integer) 2
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "one"
2) "1"
3) "uno"
4) "1"
5) "two"
6) "2"
7) "three"
8) "3"
redis> ZADD myzset 10 one 20 two 30 three
(integer) 0
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "uno"
2) "1"
3) "one"
4) "10"
5) "two"
6) "20"
7) "three"
8) "30"
redis> ZADD myzset CH 100 one 200 two 300 three
(integer) 3
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "uno"
2) "1"
3) "one"
4) "100"
5) "two"
6) "200"
7) "three"
8) "300"
redis> ZADD myzset XX 1 one 2 two 3 three 4 four 5 five
(integer) 0
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "one"
2) "1"
3) "uno"
4) "1"
5) "two"
6) "2"
7) "three"
8) "3"
redis> ZADD myzset NX 100 one 200 two 300 three 400 four 500 five
(integer) 2
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "one"
2) "1"
3) "uno"
4) "1"
5) "two"
6) "2"
7) "three"
8) "3"
9) "four"
10) "400"
11) "five"
12) "500"
redis> ZADD myzset INCR 10 one
"11"
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "uno"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
7) "one"
8) "11"
9) "four"
10) "400"
11) "five"
12) "500"
redis> ZADD myzset -inf "negative infinity" +inf "positive infinity"
(integer) 2
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "negative infinity"
2) "-inf"
3) "uno"
4) "1"
5) "two"
6) "2"
7) "three"
8) "3"
9) "one"
10) "11"
11) "four"
12) "400"
13) "five"
14) "500"
15) "positive infinity"
16) "inf"

2.2 ZRANGE

返回指定区间⾥的元素,分数按照升序。带上 WITHSCORES 可以把分数也返回。
语法:
ZRANGE key start stop [WITHSCORES]
此处的 [start, stop] 为下标构成的区间. 从 0 开始, ⽀持负数.
命令有效版本:1.2.0 之后
时间复杂度:O(log(N)+M)
返回值:区间内的元素列表。
⽰例
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
redis> ZRANGE myzset 0 -1
1) "one"
2) "two"
3) "three"
redis> ZRANGE myzset 2 3
1) "three"
redis> ZRANGE myzset -2 -1
1) "two"
2) "three"
  • 想要包含分数加withscores
  • 修改操作
  • nx
  • 添加不存在的元素成功了
  • 此时的修改操作失败了
  • xx
  • 修改成功了
  • 由于有xx修改没有的元素失败了

2.3 zcard 

获取⼀个 zset 的基数(cardinality),即 zset 中的元素个数。
语法:
ZCARD key
命令有效版本:1.2.0 之后
时间复杂度:O(1)
返回值:zset 内的元素个数。
⽰例:
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZCARD myzset
(integer) 2

2.4 zcount

返回分数在 min 和 max 之间的元素个数,默认情况下,min 和 max 都是包含的,可以通过 ( 排除。
语法:
ZCOUNT key min max
命令有效版本:2.0.0 之后
时间复杂度:O(log(N))
返回值:满⾜条件的元素列表个数。
⽰例:
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZCOUNT myzset -inf +inf
(integer) 3
redis> ZCOUNT myzset 1 3
(integer) 3
redis> ZCOUNT myzset (1 3
(integer) 2
redis> ZCOUNT myzset (1 (3
(integer) 1

2.5 ZREVRANGE(按照降序)

返回指定区间⾥的元素,分数按照降序。带上 WITHSCORES 可以把分数也返回。
备注:这个命令可能在 6.2.0 之后废弃,并且功能合并到 ZRANGE 中。
语法:
ZREVRANGE key start stop [WITHSCORES]
命令有效版本:1.2.0 之后
时间复杂度:O(log(N)+M)
返回值:区间内的元素列表。
⽰例:
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZREVRANGE myzset 0 -1 WITHSCORES
1) "three"
2) "3"
3) "two"
4) "2"
5) "one"
6) "1"
redis> ZREVRANGE myzset 0 -1
1) "three"
2) "two"
3) "one"
redis> ZREVRANGE myzset 2 3
1) "one"
redis> ZREVRANGE myzset -2 -1
1) "two"
2) "one"

2.6 ZRANGEBYSCORE

返回分数在 min 和 max 之间的元素,默认情况下,min 和 max 都是包含的,可以通过 ( 排除。
备注:这个命令可能在 6.2.0 之后废弃,并且功能合并到 ZRANGE 中。
语法:
ZRANGEBYSCORE key min max [WITHSCORES]
命令有效版本:1.0.5 之后
时间复杂度:O(log(N)+M)
返回值:区间内的元素列表。
⽰例:
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZRANGEBYSCORE myzset -inf +inf
1) "one"
2) "two"
3) "three"
redis> ZRANGEBYSCORE myzset 1 2
1) "one"
2) "two"
redis> ZRANGEBYSCORE myzset (1 2
1) "two"
redis> ZRANGEBYSCORE myzset (1 (2
(empty array)

2.7 zpopmax 

删除并返回分数最⾼的 count 个元素。

可以解决top-问题 

语法:
ZPOPMAX key [count]
命令有效版本:5.0.0 之后
时间复杂度:O(log(N) * M)
N 是有序集合的元素个数.
count 要删除的元素个数.
  • 此处删除的是 最大值 !!! 有序集合,最大值就相当于最后一个元素(尾删)
  • 既然是尾删,为什么我们不把这个最后一个元素的位置特殊记录下来~~ 后续删除不就可以 O(1)了嘛? 省去了查找的过程~~O(logN) =>0(1)
  • 这个事情是有可能的!!
  • 但是很遗憾,目前 redis 并没有这么做~
  • 事实上,redis 的源码中,针对有序集合, 确实是记录了 尾部 这样的特定位置~~但是在实际删除的时候,并没有用上这个特性,而是直接调用了一个"通用的删除函数"(给定一个 member 的值, 进行查找找到位置之后再删除~~)
返回值:分数和元素列表。
⽰例:
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZPOPMAX myzset
1) "three"
2) "3"

2.8 BZPOPMAX

ZPOPMAX 的阻塞版本。
语法:
BZPOPMAX key [key ...] timeout
命令有效版本:5.0.0 之后
时间复杂度:O(log(N))
返回值:元素列表。
⽰例:
redis> DEL zset1 zset2
(integer) 0
redis> ZADD zset1 0 a 1 b 2 c
(integer) 3
redis> BZPOPMAX zset1 zset2 0
1) "zset1"
2) "c"
3) "2"

2.9 ZPOPMIN

删除并返回分数最低的 count 个元素。
语法:
ZPOPMIN key [count]
命令有效版本:5.0.0 之后
时间复杂度:O(log(N) * M)
返回值:分数和元素列表。
⽰例:
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZPOPMIN myzset
1) "one"
2) "1"

2.10 BZPOPMIN

ZPOPMIN 的 阻塞版本
语法:
BZPOPMIN key [key ...] timeout
命令有效版本:5.0.0 之后
时间复杂度:O(log(N))
返回值:元素列表。
⽰例:
redis> DEL zset1 zset2
(integer) 0
redis> ZADD zset1 0 a 1 b 2 c
(integer) 3
redis> BZPOPMIN zset1 zset2 0
1) "zset1"
2) "a"
3) "0"

2.11 ZRANK

返回指定元素的排名, 升序。
语法:
ZRANK key member
命令有效版本:2.0.0 之后
时间复杂度:O(log(N))
返回值:排名。
⽰例:
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZRANK myzset "three"
(integer) 2
redis> ZRANK myzset "four"
(nil)

2.12 ZREVRANK

返回指定元素的排名, 降序。
语法:
ZREVRANK key member
命令有效版本:2.0.0 之后
时间复杂度:O(log(N))
返回值:排名。
⽰例:
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZREVRANK myzset "one"
(integer) 2
redis> ZREVRANK myzset "four"
(nil)

2.13 ZSCORE

返回指定元素的分数。
语法:
ZSCORE key member
命令有效版本:1.2.0 之后
时间复杂度:O(1)
返回值:分数。
⽰例:
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZSCORE myzset "one"
"1"

2.14 ZREM

删除指定的元素。
语法:
ZREM key member [member ...]
命令有效版本:1.2.0 之后
时间复杂度:O(M*log(N))
返回值:本次操作删除的元素个数。
⽰例:
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZREM myzset "two"
(integer) 1
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "one"
2) "1"
3) "three"
4) "3"

2.15 ZREMRANGEBYRANK

按照排序,升序删除指定范围的元素,左闭右闭。
//使用这个下标描述范围进行删除
语法:
ZREMRANGEBYRANK key start stop
命令有效版本:2.0.0 之后
时间复杂度:O(log(N)+M)
返回值:本次操作删除的元素个数。
⽰例:
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZREMRANGEBYRANK myzset 0 1
(integer) 2
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "three"
2) "3"

 2.16 ZREMRANGEBYSCORE

按照分数删除指定范围的元素,左闭右闭。
语法:
ZREMRANGEBYSCORE key min max
时间复杂度:O(log(N)+M)
返回值:本次操作删除的元素个数。
⽰例:
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZREMRANGEBYSCORE myzset -inf (2
(integer) 1
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "two"
2) "2"
3) "three"
4) "3"

2.17 ZINCRBY

为指定的元素的关联分数添加指定的分数值。
  • 不光会修改分数内容
  • 也能同时移动元素位置保持整个有序集合仍然是升序的
  • 也可以针对小数进行相关操作
语法:
ZINCRBY key increment member
命令有效版本:1.2.0 之后
时间复杂度:O(log(N))
返回值:增加后元素的分数。
⽰例:
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZINCRBY myzset 2 "one"
"3"
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "two"

 3.集合间操作

3.1 ZINTERSTORE

求出给定有序集合中元素的交集并保存进⽬标有序集合中,在合并过程中以元素为单位进⾏合并,元素对应的分数按照不同的聚合⽅式和权重得到新的分数。
语法:
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight
[weight ...]] [AGGREGATE <SUM | MIN | MAX>] (以什么规则进行合并,默认求和)
命令有效版本:2.0.0 之后
时间复杂度:O(N*K)+O(M*log(M))
N 是输⼊的有序集合中, 最⼩的有序集合的元素个数; K 是输⼊了
⼏个有序集合; M 是最终结果的有序集合的元素个数.
返回值:⽬标集合中的元素个数
⽰例:
redis> ZADD zset1 1 "one"
(integer) 1
redis> ZADD zset1 2 "two"
(integer) 1
redis> ZADD zset2 1 "one"
(integer) 1
redis> ZADD zset2 2 "two"
(integer) 1
redis> ZADD zset2 3 "three"
(integer) 1
redis> ZINTERSTORE out 2 zset1 zset2 WEIGHTS 2 3
(integer) 2
redis> ZRANGE out 0 -1 WITHSCORES
1) "one"
2) "5"
3) "two"
4) "10"

3.2 ZUNIONSTORE

求出给定有序集合中元素的并集并保存进⽬标有序集合中,在合并过程中以元素为单位进⾏合并,元素对应的分数按照不同的聚合⽅式和权重得到新的分数。
语法:
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight
[weight ...]] [AGGREGATE <SUM | MIN | MAX>]
命令有效版本:2.0.0 之后
时间复杂度:O(N)+O(M*log(M)) N 是输⼊的有序集合总的元素个数; M 是最终结果的有序集合的元素
个数.
返回值:⽬标集合中的元素个数
⽰例:
redis> ZADD zset1 1 "one"
(integer) 1
redis> ZADD zset1 2 "two"
(integer) 1
redis> ZADD zset2 1 "one"
(integer) 1
redis> ZADD zset2 2 "two"
(integer) 1
redis> ZADD zset2 3 "three"
(integer) 1
redis> ZUNIONSTORE out 2 zset1 zset2 WEIGHTS 2 3
(integer) 3
redis> ZRANGE out 0 -1 WITHSCORES
1) "one"
2) "5"
3) "three"
4) "9"
5) "two"
6) "10"

4.命令⼩结

命令时间复杂度
zadd key score member [score member ...]
O(k * log(n)),k 是添加成员的个数,n 是当前有序集合的元素个数
zcard keyO(1)
zscore key memberO(1)
zrank key member zrevrank key member
O(log(n)),n 是当前有序集合的元素个数
zrem key member [member ...]
O(k * log(n)),k 是删除成员的个数,n 是当前有序集合的元
素个数
zincrby key increment memberO(log(n)),n 是当前有序集合的元素个数

zrange key start end [withscores]

zrevrange key start end [withscores]

O(k + log(n)),k 是获取成员的个数,n 是当前有序集合的元素个数

zcount

O(log(n)),n 是当前有序集合的元素个数
zremrangebyrank key start end
O(k + log(n)),k 是获取成员的个数,n 是当前有序集合的元素个数
zremrangebyscore key min max
O(k + log(n)),k 是获取成员的个数,n 是当前有序集合的元素个数
zinterstore destination numkeys key [key ...]
O(n * k) + O(m * log(m)),n 是输⼊的集合最⼩的元素个数, k 是集合个数, m 是⽬标集合元素个数
zunionstore destination numkeys key [key
...]
O(n) + O(m * log(m)),n 是输⼊集合总元素个数,m 是⽬标集合元素个数

5.zset编码方式

有序集合类型的内部编码有两种:
ziplist(压缩列表):当有序集合的元素个数⼩于 zset-max-ziplist-entries 配置(默认 128 个), 同时每个元素的值都⼩于 zset-max-ziplist-value 配置(默认 64 字节)时,Redis 会⽤ ziplist 来作为有序集合的内部实现,ziplist 可以有效减少内存的使⽤。
skiplist(跳表):当 ziplist 条件不满⾜时,有序集合会使⽤ skiplist 作为内部实现,因为此时
ziplist 的操作效率会下降。
  • 简单来说, 跳表是一个"复杂链表!
  • 查询元素 时间复杂度 logN
  • 相比于树形结构,更适合按照范围获取元素~~

6.zset的应用场景 

6.1 排行榜系统

最关键的应用场景,排行榜系统
1.微博热搜
2.游戏天梯排行
3. 成绩排行行...
关键要点:
用来排行的"分数"是实时变化的~~
虽然是实时变化,也能够高
效的更新排行~~

使用 zset 来完成上述操作,就非常简单~~
比如游戏天梯排行,
只需要把玩家信息和对应的分数给放到有序集合中即可,
自动就形成了一个排行榜~~
随时可以按照 排行(下标),按照分数 进行范围查询~~
随着分数发生改变,也可以比较方便的,zincrby 修改分数,排行顺序也能自动调整 (logN) 

zset 是一个选择,不是说,非得用 redis 的 zset~~
有些场景确实可以用到有序集合,又不方便使用redis~~ 可以考虑使用其他方式的有序集合~~

 

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

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

相关文章

快速排序算法备考

快排模板 快速排序(快排) (C语言实现)_c语言快速排序_Brant_zero2022的博客-CSDN博客 快排使用递归来实现 关键思想:划分 //划分 int partion(int A[],int L,int R){int midA[L];while(L<R){//每一次划分:左边元素<枢轴元素<右边元素//R往前找&#xff0c;直到找到一…

SQL 语言:基本概述和数据定义

文章目录 1. 数据库语言2. SQL 概述2.1 SQL 的特点2.2 SQL 语言支持三级模式结构2.3 SQL 的基本组成 3. 数据定义3.1 数据类型3.2 创建表3.3 修改和删除表3.4 创建和删除索引3.5 创建和删除视图 1. 数据库语言 数据结构化语言 (Structured Query Language&#xff0c;SQL)&…

【机器学习】——线性模型

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

面试被问到不懂的东西,是直接说不懂还是坚持狡辩一下?

大家好&#xff0c;我是瑶琴呀。 面试被问到不懂的东西&#xff0c;是直接说不懂还是坚持狡辩一下&#xff1f;这个问题可以转变一下&#xff0c;如果你顺利拿到 offer&#xff0c;公司安排的工作跟你之前的技术和经验不匹配&#xff0c;你还愿意干下去吗&#xff1f; 转变一…

太速科技-FMC125-两路125Msps AD,两路160Msps DA FMC子卡

FMC125-两路125Msps AD&#xff0c;两路160Msps DA FMC子卡 一、板卡概述 板卡可实现2路14bit 125Msps AD 和2路16bit 160MspsDA功能&#xff0c;FMC LPC连接器用于扩展到xilinx用于模拟信号、中频信号采集&#xff0c;信号发出等应用。 二、性能指标 板卡功能 参…

幻影成像制作中,哪些技术细节不可忽视?

在当今多媒体展厅设计的潮流中&#xff0c;幻影成像技术以其立体的数字影像和卓越的视觉效果&#xff0c;脱颖而出&#xff0c;成为备受瞩目的焦点。它不仅吸引了众多参观者的目光&#xff0c;更在社交媒体上掀起了热烈的讨论。然而&#xff0c;要想在多媒体展厅中精心打造一场…

2024可信赖的企业级生成式 AI 白皮书

来源&#xff1a;COPU&IBM&#xff1a; 近期历史回顾&#xff1a;

k8s devops实战教程+生产实践+可就业

k8s devops实战教程 简介教程涉及到内容教程获取学习教程后的收货助学群 简介 越来越多的企业应用云原生化&#xff0c;催生很多应用的部署方式也发生了很多变化。 从物理机部署应用过度到虚机部署应用再到应用容器化&#xff0c;从单应用再到服务拆分为微服务&#xff0c;靠人…

是他将计算机从“一屋子”变成“一柜子”——量子前哨缅怀小型机之父 戈登·贝尔

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨浪味仙 排版丨沛贤 深度好文&#xff1a;6000字丨15分钟阅读 5 月 21 日&#xff0c; 美国贝尔实验室资深人士 John Mashey 发布消息称&#xff0c;计算机先驱戈登贝尔&#xff08;Gordon…

机器人系统ros2-开发学习实践15-模拟用 URDF 建模 步行机器人行走示例

目标&#xff1a; 本教程将向您展示如何建模行走机器人、将状态发布为tf2消息并在 Rviz 中查看模拟。首先&#xff0c;我们创建描述机器人组件的 URDF 模型。接下来&#xff0c;我们编写一个节点来模拟运动并发布 JointState 和变换。然后我们使用robot_state_publisher将整个…

spring cloud alibaba sentinel 配置过程 流控 降级热点 授权

目录 1.基础理论 2.配置 3.加入依赖和配置文件 4.流控 1.基础理论 Sentinel是阿里开源的项目&#xff0c;提供了流量控制、熔断降级、系统负载保护等多个维度来保障服务之间的稳定性。 丰富的应用场景 &#xff1a;Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心…

未授权访问:Jupyter Notebook 未授权访问漏洞

目录 1、漏洞原理 2、环境搭建 3、未授权访问 4、利用terminal命令执行 防御手段 今天继续学习各种未授权访问的知识和相关的实操实验&#xff0c;一共有好多篇&#xff0c;内容主要是参考先知社区的一位大佬的关于未授权访问的好文章&#xff0c;还有其他大佬总结好的文章…

cpolar内网穿透工具—无需部署,远程访问网址

文章目录 cpolar介绍安装教程隧道管理VIP客户cpolar介绍 cpolar是一种安全的内网穿透服务,它将局域网下面的本地服务器通过加密隧道暴露至公网,使得公网用户可以正常访问内网服务。 只需一行命令,就可以将内网站点发布至公网,方便给客户演示。高效调试微信公众号、小程序…

全域运营平台的优缺点各有哪些?听听使用者怎么说!

作为多个创业者交流群内的热点话题&#xff0c;关于全域运营平台优缺点的分析和点评不断涌现&#xff0c;为许多创业者更多信息的同时&#xff0c;也让他们的选择过程变得非常艰难。而在众多的全域运营平台中&#xff0c;被分析和点评次数最多的&#xff0c;当属全域运营平台。…

css3实现0.5px边框

效果图 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>css3实现0.5px边框</title><s…

电商API接口助力直播带货选品||助力电商平台搭建选品

如今&#xff0c;直播带货如火如荼。直播带货的核心是卖货、品牌盈利&#xff0c;那想要带货效果更好&#xff0c;选品及定价是最关键的环节。 事实上&#xff0c;品牌企业可以直接使用API接口工具来辅助自身选品及定价&#xff0c;这主要是因为比价工具在直播带货选品环节能起…

dubbo复习:(4) 和springboot 整合时,客户端负载均衡的配置

需要在DubboReference注解指定loadbalance属性。示例如下&#xff1a; package cn.edu.tju.service;import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Ser…

Java+IDEA+SpringBoot药物不良反应ADR智能监测系统源码 ADR智能化监测系统源码

JavaIDEASpringBoot药物不良反应ADR智能监测系统源码 ADR智能化监测系统源码 药物不良反应&#xff08;Adverse Drug Reaction&#xff0c;ADR&#xff09;是指在使用合格药品时&#xff0c;在正常的用法和用量下出现的与用药目的无关的有害反应。这些反应往往因药物种类、使用…

【全开源】排队叫号系统源码(FastAdmin+GatewayWorker)

一款基于FastAdminGatewayWorker开发的多项目多场景排队叫号系统&#xff0c;支持大屏幕投屏&#xff0c;语音播报叫号&#xff0c;可用于餐厅排队取餐、美甲店排队取号、排队领取、排队就诊、排队办理业务等诸多场景&#xff0c;助你轻松应对各种排队取号叫号场景。 ​打造高…

03. Spring 事务管理

文章目录 1. Spring 事务管理简介2. Transactional 注解属性信息3. Transactional 简单使用4. Transactional 使用注意事项4.1 正确指定事务回滚的异常类型4.1.1 Java 异常继承体系 4.2 Transactional 注解应用在 public 方法或类上才有效4.3 正确设置 Transactional 的 propag…