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

Redis 10 大数据类型

1. which 10

1. redis字符串

2. redis 列表

3. redis哈希表

4. redis集合

5. redis有序集合

6. redis地理空间

7. redis基数统计

8. redis位图

9. redis位域

10. redis流

2. 获取redis常见操作指令

官网英文:https://redis.io/commands

官网中文:https://www.redis.cn/commands.html

3. redis键(key)

3.1 常用

3.2 案例

Keys * 查看当前库所有的key
exists keyU 判断某个key是否存在
type key 查看你的key是什么类型
del key 删除指定的key数据
unlink key非阻塞删除,仅仅将keys从keyspace元数据中删除,真正的删除会在后续异步中操作。
ttl key查看还有多少秒过期,-1表示永不过期,-2表示已过期
expire key 秒钟  为给定的key设置过期时间 D
move key dbindex [0-15]将当前数据库的 key移动到给定的数据库 db 当中
select dbindex  切换数据库[0-15],默认为0
dbsize  查看当前数据库key的数量
flushdb 清空当前库
flushall 通杀全部库

4. 数据类型命令及落地运用

4.2 备注

命令不区分大小写,而key是区分大小写的

帮助命令 help @类型

help @string

help @list

help @hash

help @hyperloglog

4.3 Redis字符串(String)

4.3.1 常用

4.3.2 单值单value

4.3.4 案例

1. 最常用
set key value
get key

2. 同时设置/获取多个键值

MSET key value [key value ....]

MGET key [key ....]

mset/mget/msetnx



3. 获取指定区间范围内的值


 

4. 数值增减

一定要是数字才能进行加减

递增数字  INCR key

增加指定的整数 INCRBY key increment

递减数值 DECR key

减少指定的整数 DECRBY key decrement

5. 获取字符串长度和内容追加

STRLEN key

APPEND key value


6. 分布式锁

setnx key value

setex( set with expire)键秒值/setnx(set if not exist)

 
7. getset(先get再set) 


 

8. 应用场景

比如说抖音无线点赞某个视频或者商品,点一下加一次

 是否喜欢的文章

 点击rest地址,直接可以使用incr key命令增加一个数字1,完成记录数字。


4.4 Redis列表(List) 

4.4.1 常用

4.4.2 单key多value

4.4.3 简单说明

单key多value

一个双端链表的结构,容量是2的32次方减1个元素,大概40多亿,主要功能有push/pop等,一般用在栈、队列、消息队列等场景。

left、right都可以插入添加;

如果键不存在,创建新的链表;

如果键已存在,新增内容;

如果值全移除,对应的键也就消失了。

  • 它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。

 

4.4.4 案例

1. lpush/rpush/lrange
2. lpop/rpop 


3. lindex,按照索引下标获得元素(从上到下)


4. llen 获取列表中元素的个数


5. lrem key 数字N 给定值v1 解释(删除N个值等于v1的元素)

6. ltrim key 开始index 结束index,截取指定范围的值后再赋值给key

7. rpoplpush 源列表 目的列表

8. lset key index value

9. linsert key before/after 已有值 插入的新值

10 .应用场景

微信公众号订阅的消息 

1 大V作者李永乐老师和CSDN发布了文章分别是 11 和 22

2 阳哥关注了他们两个,只要他们发布了新文章,就会安装进我的List

   lpush likearticle:阳哥id    11 22

3 查看阳哥自己的号订阅的全部文章,类似分页,下面0~10就是一次显示10条

  lrange likearticle:阳哥id 0 9


4.5 Redis哈希(Hash)

4.5.1 常用

4.5.2 kv模式不变,但V是一个键值对

Map<String ,Map<object,object>>

4.5.3 案例

1. hset/hget/hmset/hmget/hgetall/hdel


2. hlen
获取某个key内的全部数量


3. hexists key 在key里面的某个值的key
4. hkeys/hvals


5. hincrby/hincrbyfloat


6. hsetnx 


7. 应用场景


4.6 Redis集合(Set)

4.6.1 常用

4.6.2 单值多value,且无重复

4.6.3 案例

1. SADD key member [member...]        添加元素
2. SMEMBERS key          遍历集合中的所有元素

3. SISMEMBER key member       判断元素是否在集合中
4. SREM key member [member ....]         删除元素
5. scard       获取集合里面的元素个数 

6. SRANDMEMBER key [数字]          从集合中随机展现设置的数字个数元素,元素不删除

7. SpOP key [数字]            从集合中随机弹出一个元素,出一个删一个

8. smove key1 key2 在key1里已存在的某个值          将key1里已存在的某个值赋给key2

9. 集合运算

A, B

~ abc12
~ 123ax


集合的差集运算 A-B

~ 属于A但不属于B的元素构成的集合

~ SDIFF key [key ...]


集合的并集运算 A U B
~ 属于A或者属于B的元素合并后的集合

~ SUNION key [key ...]
 

集合的交集运算 AnB
~ 属于A同时也属于B的共同拥有的元素构成的集合
~ SINTER key [key ...]
~ SINTERCARD numkeys key [key ...] [LIMIT limit]

10. 应用场景

微信抽奖小程序

 

1 用户ID,立即参与按钮
sadd key 用户ID
2 显示已经有多少人参与了,上图23208人参加
SCARD key
3 抽奖(从set中任意选取N个中奖人)
SRANDMEMBER key 2       随机抽奖2个人,元素不删除
SPOP  key 3                         随机抽奖3个人,元素 会删除

微信朋友圈点赞查看同赞朋友 


QQ内推可能认识的人 


4.7 Redis有序集合Zset(sorted set)

4.7.1 常用

4.7.2 案例

1. 向有序集合中加入一个元素和该元素的分数
2. ZADD key score member [score member ...]         添加元素


3. ZRANGE key start stop [WITHSCORES]           照元素分数从小到大的顺序,返回索引从start到stop之间的所有元素
4. zrevrange


5. ZRANGEBYSCORE key min max [WITHSCORES][LIMIT offset count]       

获取指定分数范围的元素 

~ withscores

~ (不包含

~  limit 作用是返回限制limit 开始下标步 多少步

6. ZSCORE key member          获取元素的分数

zcard :获取集合中元素个数

zcount :获取分数区间内元素个数,zcount key 开始分数区间 结束分数区间

zrank: 获取value在zset中的下标位置

zscore:按照值获得对应的分数


7. ZCARD key         获取集合中元素的数量
8. zrem key 某score下对应的value值,作用是删除元素

删除元素,格式是zrem zset的key 项的值,项的值可以是多个

zrem key score某个对应值,可以是多个值



9. ZINCRBY key increment member            增加某个元素的分数
10. ZCOUNT key min max           获得指定分数范围内的元素个数
11. ZMPOP         从键名列表中的第一个非空排序集中弹出一个或多个元素,它们是成员分数对


12. zrank key values值,作用是获得下标值
13. zrevrank key values值,作用是逆序获得下标值 

正序、逆序获得下标索引值


14. 应用场景
根据商品销售对商品进行排序显示

思路:定义商品销售排行榜(sorted set集合),key为goods:sellsort,分数为商品销售数量。

商品编号1001的销量是9,商品编号1002的销量是15
zadd goods:sellsort 9 1001 15 1002
有一个客户又买了2件商品1001,商品编号1001销量加2
zincrby goods:sellsort 2 1001
求商品销量前10名
ZRANGE goods:sellsort 0 9 withscores


4.8 Redis位图(bitmap)

4.8.1 由0和1状态表现的二进制位的bit数组

4.8.2 看需求

用户是否登陆过Y、N,比如京东每日签到送京豆

电影、广告是否被点击播放过

钉钉打卡上下班,签到统计

4.8.3 是什么

说明:用String类型作为底层数据结构实现的一种统计二值状态的数据类型

位图本质是数组,它是基于String数据类型的按位的操作。该数组由多个二进制位组成,每个二进制位都对应一个偏移量(我们称之为一个索引)。

 

Bitmap支持的最大位数是2^32位,它可以极大的节约存储空间,使用512M内存就可以存储多达42.9亿的字节信息(2^32 = 4294967296)

4.8.4 能干啥

用于状态统计

Y, N, 类似AtomicBoolean

4.8.5 基本命令

1. setbit

setbit key offset value
偏移位 只能零或者1setbit 键
Bitmap的偏移量是从零开始算的


2. getbit

getbit key offset


3. strlen

统计字节数占用多少


4. bitcount

全部键里面含有1的有多少个字节

 
5. bitop

 连续2天都签到的用户

加入某个网站或者系统,它的用户有1000W,做个用户id和位置的映射

比如0号位对应用户id:uid-092iok-lkj

比如1号位对应用户id:uid-7388c-xxx

。。。。。。  

6. setbit和getbit案例说明    按照天

4.8.6 应用场景

一年365天,全年天天登录占用多少字节

按照年

按年去存储一个用户的签到情况,365 天只需要 365 / 8 ≈ 46 Byte,1000W 用户量一年也只需要 44 MB 就足够了。

 

假如是亿级的系统,

每天使用1个1亿位的Bitmap约占12MB的内存(10^8/8/1024/1024),10天的Bitmap的内存开销约为120MB,内存压力不算太高。

此外,在实际使用时,最好对Bitmap设置过期时间,让Redis自动删除不再需要的签到记录以节省内存开销。


4.9 Redis基数统计(HyperLogLog)

4.9.1 看需求

1. 统计某个网站的UV、统计某个文章的UV
2. 什么是UV

~ Unique Visitor,独立访客,一般理解为客户端IP
~ 需要去重考虑
3. 用户搜索网站关键词的数量
4. 统计用户每天搜索不同词条个数

4.9.2 是什么

1. 去重复统计功能的基数估计算法-就是HyperLogLog


2. 基数
~ 是一种数据集,去重复后的真实个数
~ 案例Case 目


3. 基数统计
用于统计一个集合中不重复的元素个数,就是对集合去重复后剩余元素的计算
4. 一句话

去重脱水后的真实数据

4.9.3 基本命令


4.10 Redis地理空间(GEO)

4.10.1 简介

移动互联网时代LBS应用越来越多,交友软件中附近的小姐姐、外卖软件中附近的美食店铺、高德地图附近的核酸检查点等等,那这种附近各种形形色色的XXX地址位置选择是如何实现的?

 

地球上的地理位置是使用二维的经纬度表示,经度范围 (-180, 180],纬度范围 (-90, 90],只要我们确定一个点的经纬度就可以名取得他在地球的位置。

例如滴滴打车,最直观的操作就是实时记录更新各个车的位置,

然后当我们要找车时,在数据库中查找距离我们(坐标x0,y0)附近r公里范围内部的车辆

 

使用如下SQL即可:

select taxi from position where x0-r < x < x0 + r and y0-r < y < y0+r

但是这样会有什么问题呢?

1.查询性能问题,如果并发高,数据量大这种查询是要搞垮数据库的

2.这个查询的是一个矩形访问,而不是以我为中心r公里为半径的圆形访问。

3.精准度的问题,我们知道地球不是平面坐标系,而是一个圆球,这种矩形计算在长距离计算时会有很大误差

4.10.2 原理 

核心思想就是将球体转换为平面,区块转换为一

 

4.10.3 Redis在3.2版本以后增加了地理位置的处理
4.10.4 命令

GEOADD 多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的 key 中GEOPOS 从键里面返回所有给定位置元素的位置 (经度和纬度)GEODIST 返回两个给定位置之间的距离
返回与中心的距离不超过给定最大距离的所有位置元素GEORADIUS 以给定的经纬度为中心,
GEORADIUSBYMEMBER 跟GEORADIUS类似
GEOHASH返回一个或多个位置元素的 Geohash 表示

4.10.5 命令实操

1. 如何获得某个地址的

http://api.map.baidu.com/lbsapi/getpoint/

2. GEOADD添加经纬度坐标 

GEOADD city 116.403963 39.915119 "天安门" 116.403414 39.924091 "故宫" 116.024067 40.362639 "长城"


中文乱码如何处理
3. GEOPOs返回经纬坐标 

 

GEOPOS city 天安门     故宫  长城 

4. GEOHASH返回的geohash表示

~ geohash算法生成的base32编码值

~ 3维变2维变1维
主要分为三步
将三维的地球变为二维的坐标

在将二维的坐标转换为一维的点块

最后将一维的点块转换为二进制再通过base32编码

5. GEODIST 两个位置之间距离 

 GEODIST city 天安门 故宫 km

后面参数是距离单位:

m 米

km 千米

ft 英尺

mi 英里

 
6. GEORADIUS

georadius 以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。

 

GEORADIUS city 116.418017 39.914402 10 km withdist withcoord count 10 withhash desc

GEORADIUS city 116.418017 39.914402 10 km withdist withcoord withhash count 10 desc

WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致。
WITHCOORD: 将位置元素的经度和维度也一并返回。
WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大
COUNT 限定返回的记录数。

  当前位置(116.418017 39.914402),阳哥在北京王府井

7. GEORADIUSBYMEMBERE


4.11 Redis流(Stream)

4.11.1 是什么

1. redis5.0之前痛点
Redis 消息队列的2种方案
~ List 实现消息队列        List 实现方式其实就是点对点的模式

按照插入顺序排序,你可以添加一个元素到列表的头部(左边)或者尾部(右边)。 

所以常用来做异步队列使用,将需要延后处理的任务结构体序列化成字符串塞进 Redis 的列表,另一个线程从这个列表中轮询数据进行处理。

~ (Pub/Sub)


2. Redis5.0版本新增了一个更强大的数据结构-----Stream
3. 一句话   Redis版的MQ消息中间件+阻塞队列

4.11.2 能干嘛

实现消息队列,它支持消息的持久化、支持自动生成全局唯一 ID、支持ack确认消息的模式、支持消费组模式等,让消息队列更加的稳定和可靠

4.11.3 底层结构和原理说明   stream结构

一个消息链表,将所有加入的消息都串起来,每个消息都有一个唯一的 ID 和对应的内容

1
Message Content
消息内容
2
Consumer group
消费组,通过XGROUP CREATE 命令创建,同一个消费组可以有多个消费者
3
Last_delivered_id
游标,每个消费组会有个游标 last_delivered_id,任意一个消费者读取了消息都会使游标 last_delivered_id 往前移动。
4
Consumer
消费者,消费组中的消费者
5
Pending_ids
消费者会有一个状态变量,用于记录被当前消费已读取但未ack的消息Id,如果客户端没有ack,这个变量里面的消息ID会越来越多,一旦某个消息被ack它就开始减少。这个pending_ids变量在Redis官方被称之为 PEL(Pending Entries List),记录了当前已经被客户端读取的消息,但是还没有 ack (Acknowledge character:确认字符),它用来确保客户端至少消费了消息一次,而不会在网络传输的中途丢失了没处理

4.11.4 基本命令理论简介

1. 队列相关指令


2. 消费组相关指令 

 

3. 四个特殊符号
~    -+     最小和最大可能出现的ld
~   $       表示只消费新的消息,当前流中最大的 id,可用于将要到来的信息
~   >       用于XREADGROUP命令,表示迄今还没有发送给组中使用者的信息,会更新消费者组的最后ID
~   *        用于XADD命令中,让系统自动生成 id

4.11.5 基本命令代码实操

Redis流实例演示

1. 队列相关指令

XADD   添加消息到队列末尾 

XADD 用于向Stream 队列中添加消息,如果指定的Stream 队列不存在,则该命令执行时会新建一个Stream 队列

//* 号表示服务器自动生成 MessageID(类似mysql里面主键auto_increment),后面顺序跟着一堆 业务key/value

信息条目指的是序列号,在相同的毫秒下序列号从0开始递增,序列号是64位长度,理论上在同一毫秒内生成的数据量无法到达这个级别,因此不用担心序列号会不够用。millisecondsTime指的是Redis节点服务器的本地时间,如果存在当前的毫秒时间戳比以前已经存在的数据的时间戳小的话(本地时间钟后跳),那么系统将会采用以前相同的毫秒创建新的ID,也即redis 在增加信息条目时会检查当前 id 与上一条目的 id, 自动纠正错误的情况,一定要保证后面的 id 比前面大,一个流中信息条目的ID必须是单调增的,这是流的基础。
客户端显示传入规则:
Redis对于ID有强制要求,格式必须是 时间戳-自增Id这样的方式,且后续ID不能小于前一个ID
Stream的消息内容,也就是图中的Message Content它的结构类似Hash结构,以key-value的形式存在。

~ 消息ID必须要比上个ID大

~ 默认用星号表示自动生成规矩

~ *   用于ADD命令中,让系统自动生成id

XRANGE 

~ 用于获取消息列表(可以指定范围),忽略删除的消息
~ start 表示开始值,-代表最小值
~ end 表示结束值,+代表最大值
~ count 表示最多获取多少个值


XREVRANGE 

与XRANGE 的区别在于,获取消息列表元素的方向是相反的,end在前,start在后


XDEL 


XLENg

用户获取stream队列的消息的长度


XTRIM

~ 用于对stream的长度进行截取,如超长会进行截取
~ MAXLEN       允许的最大长度,对流进行修剪限制长度 


~ MINID       允许的最小id,从某个id值开始比该id值小的将会被抛弃

 


XREAD

~ 用于获取消息(阻塞/非阻塞) ,只会返回大于指定ID的消息


~ 非阻塞 

$代表特殊ID,表示以当前Stream已经存储的最大的ID作为最后一个ID,当前Stream中不存在大于当前最大ID的消息,因此此时返回nil
0-0代表从最小的ID开始获取Stream中的消息,当不指定count,将会返回Stream中的所有消息,注意也可以使用0(00/000也都是可以的……)

 

~ 阻塞

请redis-cli启动第2个客户端连接上来 



~ 小总结(类似iava里面的阻塞队列)

Stream的基础方法,使用xadd存入消息和xread循环阻塞读取消息的方式可以实现简易版的消息队列,交互流程如下

 

2. 消费组相关指令

1) XGROUP CREATE      用于创建消费者组

$表示从Stream尾部开始消费

0表示从Stream头部开始消费

创建消费者组的时候必须指定 ID, ID 为 0 表示从头开始消费,为 $ 表示只消费新的消息,队尾新来
2) XREADGROUP GROUP

~ ">",表示从第一条尚未被消费的消息开始读取

~ 消费组groupA内的消费者consumer1从mystream消息队列中读取所有消息

~ 但是,不同消费组的消费者可以消费同一条消息 


~ 消费组的目的? ?

让组内的多个消费者共同分担读取消息,所以,我们通常会让每个消费者读取部分消息,从而实现消息读取负载在多个消费者间是均衡分布的


3). 重点问题

1问题
基于 Stream 实现的消息队列,如何保证消费者在发生故障或宕机再次重启后,仍然可以读取未处理完的消息?
2
Streams 会自动使用内部队列(也称为 PENDING List)留存消费组里每个消费者读取的消息保底措施,直到消费者使用 XACK 命令通知 Streams“消息已经处理完成”。
3
消费确认增加了消息的可靠性,一般在业务处理完成之后,需要执行 XACK 命令确认消息已经被消费完成


4). XPENDING

~ 查询每个消费组内所有消费者 [已读取、但尚未确认]的消息

~ 查看某个消费者具体读取了哪些数据 

下面抓图所示:consumer2已读取的消息的 ID是1659430293537-0
一旦消息1659430293537-0被consumer2处理了consumer2就可以使用  XACK 命令通知 Streams,然后这条消息就会被删除


5). XACK      向消息队列确认消息处理已完成目

 

3. XINFO 用于打印Stream\Consumer Group的详细信息

 4.11.6 使用建议

Stream还是不能100%等价于Kafka、 RabbitMQ来使用的,生产案例少,慎用
仅仅代表本人愚见,不权威 

4.12 Redis位域(bitfield)

4.12.1 了解即可
4.12.2 是什么

https://redis.com.cn/commands/bitfield.html 官网 

4.12.3 能干嘛 

 hello 等价于 0110100001100101011011000110110001101111
1. 位域修改

2.  溢出控制

4.12.4 一句话

将一个Redis字符串看作是一个由二进制位组成的数组并能对变长位宽和任意没有字节对产的指定整型位域进行寻址和修改

4.12.5 命令基本语法目

BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL] 

4.12.6 案例

1. Ascii码表

https://ascii.org.cn/

2. 基本命令代码实操
1)BITFIELD key [GET type offset]


2)BITFIELD key [SET type offset value]

 

3)BITFIELD key [INCRBY type offset increment]

默认情况下,ICRBY使用WRAP参数


4)溢出控制OVERFLOW [WRAP|SAT|FAIL]

~ WRAP: 使用回绕(wrap around) 方法处理有符号整数和无符号整数的溢出情况 


~ SAT: 使用饱和计算 (saturation arithmetic) 方法处理溢出下溢计算的结果为最小的整数值,而上溢计算的结果为最大的整数值


~ FAIL: 命令将拒绝执行那些会导致上溢或者下溢情况出现的计算并向用户返回空值表示计算未被执行

 


 

相关文章:

Redis 10 大数据类型

1. which 10 1. redis字符串 2. redis 列表 3. redis哈希表 4. redis集合 5. redis有序集合 6. redis地理空间 7. redis基数统计 8. redis位图 9. redis位域 10. redis流 2. 获取redis常见操作指令 官网英文&#xff1a;https://redis.io/commands 官网中文&#xff1a;https:/…...

优化生产流程:数字化工厂中的OPC UA分布式IO模块应用

背景 近年来&#xff0c;为了提升在全球范围内的竞争力&#xff0c;制造企业希望自己工厂的机器之间协同性更强&#xff0c;自动化设备采集到的数据能够发挥更大的价值&#xff0c;越来越多的传统型工业制造企业开始加入数字化工厂建设的行列&#xff0c;实现智能制造。 数字化…...

Elasticsearch(十四)搜索---搜索匹配功能⑤--全文搜索

一、前言 不同于之前的term。terms等结构化查询&#xff0c;全文搜索首先对查询词进行分析&#xff0c;然后根据查询词的分词结果构建查询。这里所说的全文指的是文本类型数据&#xff08;text类型&#xff09;,默认的数据形式是人类的自然语言&#xff0c;如对话内容、图书名…...

已解决Gradle错误:“Unable to load class ‘org.gradle.api.plugins.MavenPlugin‘”

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…...

windows中安装sqlite

1. 下载文件 官网下载地址&#xff1a;https://www.sqlite.org/download.html 下载sqlite-dll-win64-x64-3430000.zip和sqlite-tools-win32-x86-3430000.zip文件&#xff08;32位系统下载sqlite-dll-win32-x86-3430000.zip&#xff09;。 2. 安装过程 解压文件 解压上一步…...

前端面试:【系统设计与架构】前端架构模式的演进

前端架构模式在现代Web开发中扮演着关键角色&#xff0c;它们帮助我们组织和管理前端应用的复杂性。本文将介绍一些常见的前端架构模式&#xff0c;包括MVC、MVVM、Flux和Redux&#xff0c;以及它们的演进和应用。 1. MVC&#xff08;Model-View-Controller&#xff09;&#x…...

【CSS】em单位的理解

1、em单位的定义 MDN的解释&#xff1a;它是相对于父元素的字体大小的一个单位。 例如&#xff1a;父元素font-size&#xff1a;16px&#xff1b;子元素的font-size&#xff1a;2em&#xff08;也就是32px&#xff09; 注&#xff1a;有一个误区&#xff0c;虽然他是一个相对…...

无涯教程-Python机器学习 - Based on human supervision函数

Python机器学习 中的 Based on human s - 无涯教程网无涯教程网提供https://www.learnfk.com/python-machine-learning/machine-learning-with-python-based-on-human-supervision.html...

【滑动窗口】leetcode209:长度最小的子数组

一.题目描述 长度最小的子数组 二.思路分析 题目要求&#xff1a;找出长度最小的符合要求的连续子数组&#xff0c;这个要求就是子数组的元素之和大于等于target。 如何确定一个连续的子数组&#xff1f;确定它的左右边界即可。如此一来&#xff0c;我们最先想到的就是暴力枚…...

C++ STL unordered_map

map hashmap 文章目录 Map、HashMap概念map、hashmap 的区别引用头文件初始化赋值unordered_map 自定义键值类型unordered_map 的 value 自定义数据类型遍历常用方法插入查找 key修改 value删除元素清空元素 unordered_map 中每一个元素都是一个 key-value 对&#xff0c;数据…...

全流程R语言Meta分析核心技术应用

Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;最早出现于“循证医学”&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面。…...

Go并发可视化解释 - Select语句

昨天&#xff0c;我发布了一篇文章&#xff0c;用可视化的方式解释了Golang中通道&#xff08;Channel&#xff09;的工作原理。如果你对通道的理解仍然存在困难&#xff0c;最好呢请在阅读本文之前先查看那篇文章。作为一个快速的复习&#xff1a;Partier、Candier 和 Stringe…...

在线SM4(国密)加密解密工具

在线SM4(国密)加密解密工具...

golang的类型断言语法

例子1 在 Go 中&#xff0c;err.(interface{ Timeout() bool }) 是一个类型断言语法。它用于检查一个接口类型的变量 err 是否实现了一个带有 Timeout() bool 方法的接口。 具体而言&#xff0c;该类型断言的语法如下&#xff1a; if v, ok : err.(interface{ Timeout() boo…...

提速换挡 | 至真科技用技术打破业务壁垒,助力出海破局增长

各个行业都在谈出海&#xff0c;但真正成功的又有多少&#xff1f; 李宁出海十年海外业务收入占比仅有1.3%&#xff0c;走出去战略基本失败。 京东出海业务磕磕绊绊&#xff0c;九年过去国际化业务至今在财报上都不配拥有姓名。 几百万砸出去买量&#xff0c;一点水花都没有…...

第3篇:vscode搭建esp32 arduino开发环境

第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloword第一个程序示范点亮板载LED 1.下载vscode并安装 https://code.visualstudio.com/ 运行VSCodeUserSetup-x64-1.80.1.exe 2.点击扩展&#xff0c;搜索arduino,并点击安装 3.点击扩展设置&#xff0c;配置arduino…...

Apache Shiro是什么

特点 Apache Shiro是一个强大且易用的Java安全框架,用于身份验证、授权、会话管理和加密。它的设计目标是简化应用程序的安全性实现,使开发人员能够更轻松地处理各种安全性问题,从而提高应用程序的安全性和可维护性。下面是一些Apache Shiro的关键特点和概念: 特点和概念…...

Socket基本原理

一、简单介绍 Socket&#xff0c;又称套接字&#xff0c;是Linux跨进程通信&#xff08;IPC&#xff0c;Inter Process Communication&#xff09;方式的一种。相比于其他IPC方式&#xff0c;Socket牛逼在于可做到同一台主机内跨进程通信&#xff0c;不同主机间的跨进程通信。…...

Docker容器:本地私有仓库、harbor私有仓库部署与管理

文章目录 Docker容器&#xff1a;本地私有仓库、harbor私有仓库部署与管理一.本地私有仓库1.本地私有仓库概述2.搭建本地私有仓库3.容器重启策略简介 二.harbor私有仓库部署与管理1.什么是harbor2.Harbor的特性3、Harbor的构成4.Harbor私有仓库架构及数据流向5.harbor部署及配置…...

Mobx在非react组件中修改数据,在ts/js中修改数据实现响应式更新

我们都之前在封装mobx作为数据存储的时候&#xff0c;使用到了useContext作为包裹&#xff0c;将store变成了一个hooks使用&#xff0c;封装代码: import React from react import UserInfo from ./user import Setting from ./seting import NoteStore from ./noteclass Stor…...

什么是异步编程?什么是回调地狱(callback hell)以及如何避免它?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 异步编程⭐ 回调地狱&#xff08;Callback Hell&#xff09;⭐ 如何避免回调地狱1. 使用Promise2. 使用async/await3. 模块化和分离 ⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订…...

Java8 Stream流常见操作--持续更新中

创建新数组 List<Fruit> newList fruits.stream().map(f -> new Fruit(f.getId(), f.getName() "s", f.getCountry())).collect(Collectors.toList())筛选数组 Map<Boolean, List<TransferData>> preAvg list.stream().collect(Collectors…...

【Linux】多线程概念线程控制

文章目录 多线程概念Linux下进程和线程的关系pid本质上是轻量级进程id&#xff0c;换句话说&#xff0c;就是线程IDLinux内核是如何创建一个线程的线程的共享和独有线程的优缺点 线程控制POSIX线程库线程创建线程终止线程等待线程分离 多线程概念 Linux下进程和线程的关系 在…...

Qt --- 自定义提示框 类似QMessagebox

QMessageBox::information(NULL, QString("title"), QString("I am information")); 以下是自定义提示框的代码&#xff0c;有图有真相&#xff01;提示框大部分都采用模态的形式&#xff0c;关于模态也不再多提&#xff01;所以父类为QDialog&#xff0c;…...

Redis 分布式锁与 Redlock 算法实现

Redis 分布式锁与 Redlock 算法实现 一、简介1. Redis的分布式锁2. 分布式锁的实现原理 二、Redis 分布式锁使用场景1. 分布式系统中数据资源的互斥访问2. 分布式环境中多个节点之间的协作3. 常见场景及应用 三、Redlock算法的原理与实现1. Redlock算法的背景2. Redlock算法的原…...

【附安装包】Inventor2024安装教程 机械制图|三维制图

软件下载 软件&#xff1a;Inventor版本&#xff1a;2024语言&#xff1a;简体中文大小&#xff1a;5.61G安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU2.5GHz 内存8G(或更高&#xff09;下载通道①百度网盘丨64位下载链接&#xff1a;https://pan.baidu…...

c++ 判断基类指针指向的真实对象类型

在 c 面向对象使用中&#xff0c;我们常常会定义一个基类类型的指针&#xff0c;在运行过程中&#xff0c;这个指针可能指向一个基类类型的对象&#xff0c;也可能指向的是其子类类型的对象&#xff0c;那现在问题来了&#xff0c;我们如何去判断这个指针到底执行了一个什么类型…...

退出屏保前玩一把游戏吧!webBrowser中网页如何调用.NET方法

本文主要以 HackerScreenSaver 新功能的开发经历介绍 webBrowser中网页如何调用.NET方法的过程。 1. 背景 之前开源了一款名为 HackerScreenSaver 的 Windows 屏保程序。该程序具有模拟黑客炫酷界面的特点&#xff0c;用户可以将自定义的网页作为锁屏界面。不久前&#xff0c;…...

hive-列转行

转成 select customer_code,product_type from temp.temp_xx LATERAL VIEW explode(SPLIT(product_types,,)) table_tmp AS product_type where customer_code K100515182...

【网络】IP网络层和数据链路层

IP协议详解 1.概念 1.1 四层模型 应用层&#xff1a;解决如何传输数据&#xff08;依照什么格式/协议处理数据&#xff09;的问题传输层&#xff1a;解决可靠性问题网络层&#xff1a;数据往哪里传&#xff0c;怎么找到目标主机数据链路层&#xff08;物理层&#xff09;&…...