1000W用户1Wqps高并发签到系统的架构和实操

news2024/11/28 10:38:36

说在前面

在尼恩的(50+)读者社群中,经常有小伙伴面试的时候,遇到一个一个高并发 架构方面的问题,比如:

(1) 高并发秒杀系统如何架构?

(2) 高并发签到系统如何架构?

(3) 等等等等…

刚刚,在尼恩的读者社区(50+)中,有小伙伴又问了这个问题。 尼恩作为技术中台的架构师, 高并发架构是尼恩架构的重点, 所以,一直想带大家从 架构到实操, 这里,带大家完成一个1000W用户1Wqps+ 签到系统的架构和实操。

本文也一并收入咱们的 《尼恩Java面试宝典》PDF,供后面的小伙伴参考,提升大家的 3高 架构、设计、开发水平。

当然,作为一篇文章,仅仅是抛砖引玉,后面有机会,带大家做一下这个高质量的实操,并且指导大家写入简历。

注:本文以 PDF 持续更新,最新尼恩 架构笔记、面试题 的PDF文件,请到文末公号 【技术自由圈】获取。

文章目录

    • 说在前面
    • 签到场景业务需求分析
    • 1000W级用户场景的签到优化
      • 优化1:利用Bitmap实现用户签到存储优化
      • 优化2:利用Redis Bitmap实现用户签到的性能优化
      • 优化3:利用Nginx +lus 实现更进一步的用户签到的性能优化
    • 基础知识:什么是Bitmap
      • Bitmap的使用场景
    • Redis 中Bitmap的相关命令
      • 客户端连接 redis
      • 指定key中的offset位设置为value
      • 获取指定 key 中的offset位的值
      • 统计指定key中值为1的位的数量。
      • 对多个Bitmap进行位运算,并将结果保存到destkey中。
      • 查找指定key中第一个值为bit(0或1)的位的位置
      • BITFIELD:在位图中存储整数值
      • 根据偏移量对区域进行设置
        • 参数1:offset参数用于指定设置的起始偏移量。
        • 参数2:type参数用于指定等待设置的值类型,
        • 参数3:value参数用于指定被设置的整数值
        • 设置的结果
      • 批量操作:一次调用中执行多个子命令
      • 获取区域存储的值
      • 执行加法操作或减法操作
      • 处理溢出
      • 其他命令
      • 尼恩建议,优先使用位图存储整数
    • 使用SpringCloud+Redis BitMap 用户场景的签到实操
      • 实操包括以下的操作:
      • 用户签到实操
      • 用户签到查询
      • 查询 获取本月签到信息 签到
    • 本文的版本计划和基础学习资料
    • 技术自由的实现路径 PDF:
        • 实现你的 架构自由:
        • 实现你的 响应式 自由:
        • 实现你的 spring cloud 自由:
        • 实现你的 linux 自由:
        • 实现你的 网络 自由:
        • 实现你的 分布式锁 自由:
        • 实现你的 王者组件 自由:
        • 实现你的 面试题 自由:

签到场景业务需求分析

一般像微博,各种社交软件,游戏等APP,都会有一个签到功能,连续签到多少天,送什么东西,比如:

  • 签到1天送10积分,连续签到2天送20积分,3天送30积分,4天以上均送50积分等
  • 如果连续签到中断,则重置计数,每月初重置计数
  • 显示用户某个月的签到次数

1000W级用户场景的签到优化

优化1:利用Bitmap实现用户签到存储优化

为了实现用户的签到功能,通过mysql来完成,

为了实现签到的存储, 可以设计一个类似下面的表

假如有1000万用户,平均每人每年签到次数为10次,一年下来,则这张表数据量为多少呢?

数据比较吓人: 1亿条

每签到一次需要使用(8 + 8 + 1 + 1 + 3 + 1)共22 字节的内存,一个月则最多需要600多字节

我们如何能够简化一点呢?

其实可以考虑小时候一个挺常见的方案,就是小时候,咱们准备一张小小的卡片,你只要签到就打上一个勾,我最后判断你是否签到,其实只需要到小卡片上看一看就知道了。

我们可以采用类似这样的方案来实现我们的签到需求。

我们按月来统计用户签到信息,签到记录为1,未签到则记录为0。

把每一个bit位对应当月的每一天,形成了映射关系。用0和1标示业务状态,这种思路就称为位图(BitMap)。

这样我们就用极小的空间,来实现了大量数据的表示。

那么,一个月的签到数据,可以使用一个无符号整数来存储

之前一个月要 600个字节,现在保存一个人一个月的签到数据, 只要 24个字节 ,一下就提升了 25倍

注意:是存储空间,节约了25倍哈

优化2:利用Redis Bitmap实现用户签到的性能优化

刚好redis 有Bitmap结构。

可以利用Redis Bitmap实现用户签到的性能优化,将当前用户当天签到信息保存到Redis中。

具体的架构如下:

redis的吞吐量为 2Wqps以上, 完全可以满足 1000W用户签到的需求。

但是 SpringCloud 微服务够呛,怎么办呢?

优化3:利用Nginx +lus 实现更进一步的用户签到的性能优化

SpringCloud 微服务够呛,但是nginx可以,

nignx的吞吐量为 2Wqps以上, 完全可以满足 1000W用户签到的需求。

具体的架构如下:

架构介绍完了,接下来就开始实操。

但是,在开始实操之前,咱们得补一下基础知识。

基础知识:什么是Bitmap

Bitmap是一种位图数据结构,它用来表示一个集合中每个元素是否出现。

在Bitmap中,每个元素都与一个位(bit)相对应,如果元素出现,则对应位的值为1,否则为0。

Bitmap可以用来进行快速的集合运算,如并集、交集、差集等操作。

Bitmap的优点在于它的空间利用率非常高,通常只需要占用一个二进制位来表示一个元素是否出现,因此对于稀疏的数据集合,Bitmap可以显著减少存储空间的使用。

此外,由于Bitmap的位运算操作非常高效,因此它也能够快速地进行集合运算操作。

Redis中是利用string类型数据结构实现BitMap,因此最大上限是512M,转换为bit则是 2^32个bit位。

Bitmap的使用场景

Bitmap可以应用于许多场景,主要包括以下几个方面:

  • 去重:
    可以使用Bitmap去重,将出现的元素映射到Bitmap中,若Bitmap中对应的位置已经被标记为1,即表示该元素已经出现过,可以避免重复。
  • 排序:
    可以使用Bitmap实现排序,将元素映射到Bitmap中,遍历Bitmap中的所有位,对于值为1的位,输出对应元素。
  • 数据库查询:
    在数据库中,可以使用Bitmap对记录进行索引,
    例如,在一个表中记录用户的性别,可以使用Bitmap将每个用户的性别映射到Bitmap中,然后通过位运算来查询特定性别的用户。
  • 网络流量分析:
    在网络流量分析中,可以使用Bitmap来记录每个IP地址的访问情况,然后通过位运算进行流量统计和分析。
  • 压缩编码:
    可以使用Bitmap进行数据压缩编码,将数据压缩为一系列0和1的位序列,通过位运算进行解码。

总的来说,Bitmap具有高效、灵活、易用等优点,在许多数据处理和分析的场景中都有广泛的应用。

Redis 中Bitmap的相关命令

客户端连接 redis

docker exec -it redis-standalone  redis-cli  

auth 123456

Redis提供了一系列Bitmap相关的指令,包括以下几个:

指定key中的offset位设置为value

将指定key中的offset位设置为value(0或1),若key不存在,则会自动创建一个新的空Bitmap。

SETBIT key offset value

例:SETBIT mybitmap 1001 1 将mybitmap的第1001位设置为1。

127.0.0.1:6379> setbit mybitmap 1001 1
(integer) 0

获取指定 key 中的offset位的值

获取指定key中的offset位的值(0或1),若key不存在或offset超出范围,则返回0。

GETBIT key offset

例如:GETBIT mybitmap 1001将返回mybitmap的第1001位的值。

127.0.0.1:6379> getbit mybitmap 1001
(integer) 1

统计指定key中值为1的位的数量。

BITCOUNT key [start end]

可以通过可选参数start和end指定统计的范围(单位是位),若不指定,则默认统计整个Bitmap。

例如:BITCOUNT mybitmap 100 1000 将统计mybitmap中第100位到第1000位值为1的位的数量。

127.0.0.1:6379> bitcount mybitmap 100 1000
(integer) 1

对多个Bitmap进行位运算,并将结果保存到destkey中。

BITOP operation destkey key [key ...]

operation可以是AND、OR、XOR和NOT中的一个,表示进行与、或、异或和非运算。

例如:BITOP AND mybitmap1 mybitmap2 mybitmap3将mybitmap2和mybitmap3进行与运算,并将结果保存到mybitmap1中。

127.0.0.1:6379> bitop and mybitmap1 mybitmap2 mybitmap3
(integer) 0

查找指定key中第一个值为bit(0或1)的位的位置

查找指定key中第一个值为bit(0或1)的位的位置,并返回其索引(单位是位)。

BITPOS key bit [start] [end]

可以通过可选参数start和end指定查找的范围。若bit不存在于指定范围内,则返回-1。

例如:BITPOS mybitmap 1 100 1000将在mybitmap的第100位到第1000位中查找值为1的位的位置。

127.0.0.1:6379> bitpos mybitmap 1 100 1000
(integer) 1001

BITFIELD:在位图中存储整数值

BITFIELD命令允许用户在位图中的任意区域(field)存储指定长度的整数值,并对这些整数值执行加法或减法操作。

BITFIELD命令支持SET、GET、INCRBY、OVERFLOW这4个子命令,接下来将分别介绍这些子命令。

语法

官方文档

BITFIELD key [GET encoding offset | [OVERFLOW <WRAP | SAT | FAIL>]
  <SET encoding offset value | INCRBY encoding offset increment>
  [GET encoding offset | [OVERFLOW <WRAP | SAT | FAIL>]
  <SET encoding offset value | INCRBY encoding offset increment>
  ...]]

根据偏移量对区域进行设置

除了根据偏移量对位图进行设置之外,SET子命令还允许用户根据给定类型的位长度,对位图在指定索引上存储的整数值进行设置。

通过使用BITFIELD命令的SET子命令,用户可以在位图的指定偏移量offset上设置一个type类型的整数值value,

来一个列子,从第0位开始,设置 sign:1880000000::202305 的 值为 198 :

BITFIELD  sign:1880000000::202306   set u8  0 198

主要的参数如下:

  • offset 操作的偏移量
  • type 操作的值的数值类型
  • value 要操作的值

对于参数的介绍如下:

参数1:offset参数用于指定设置的起始偏移量。

这个偏移量从0开始计算,偏移量为0表示设置从位图的第1个二进制位开始。

如果被设置的值长度不止一位,那么设置将自动延伸至之后的二进制位。

参数2:type参数用于指定等待设置的值类型,

type参数的值需要以i或者u为前缀,后跟被设置值的位长度,

其中i表示被设置的值为有符号整数,而u则表示被设置的值为无符号整数。

比如i8表示被设置的值为有符号8位整数,

而u16则表示被设置的值为无符号16位整数,诸如此类。

BITFIELD的各个子命令目前最大能够对64位长的有符号整数(i64)和63位长的无符号整数(u63)进行操作。

参数3:value参数用于指定被设置的整数值

这个值的类型应该和type参数指定的类型一致。

如果给定值的长度超过了type参数指定的类型,那么SET命令将根据type参数指定的类型截断给定值。

比如,如果用户尝试将整数123(二进制表示为01111011)存储到一个u4类型的区域中,那么命令会先将该值截断为4位长的二进制数字1011(即十进制数字11),然后再进行设置。

设置的结果

设置 sign:1880000000::202305 的 值为 198 :

BITFIELD  sign:1880000000::202306   set u8  0 198

通过命令,我们可以从偏移量0开始,设置一个8位长的无符号整数值198(二进制表示为11000110):

从子命令返回的结果可以看出,该区域被设置之前存储的整数值为0。下图展示了执行设置命令之后的位图:

批量操作:一次调用中执行多个子命令

尼恩提示:高并发场景,为了减少io 次数,一般都是建议 批量操作。

BITFIELD命令允许用户在一次调用中执行多个子命令,比如,通过在一次BITFIELD调用中使用多个SET子命令,我们可以同时对位图的多个区域进行设置:

BITFIELD  sign:1880000000::202306   SET u8 0 123 SET i32 20 10086

  • 第1个子命令SET u8 0 123从偏移量0开始,设置一个8位长无符号整数值123。
  • 第2个子命令SET i32 20 10086从偏移量20开始,设置一个32位长有符号整数值10086。

对于这2个子命令,BITFIELD命令返回了一个包含2个元素的数组作为命令的执行结果,

这2个元素分别代表2个指定区域被设置之前存储的整数值,比如第一个子命令返回的结果就是我们之前为该区域设置的值123。

下图展示了这个BITFIELD命令创建出的位图以及被设置的3个整数值在位图中所处的位偏移量。

上图也展示了SET子命令的两个特点:

  • 设置可以在位图的任意偏移量上进行,被设置区域之间不必是连续的,也不需要进行对齐(align)。

    各个区域之间可以有空洞,即未被设置的二进制位,这些二进制位会自动被初始化为0。

  • 在同一个位图中可以存储多个不同类型和不同长度的整数。

虽然这两个特点可以带来很大的灵活性,但是从节约内存、避免发生错误等情况考虑,我们一般还是应该:

  • 以对齐的方式使用位图,并且让位图尽可能地紧凑,避免包含过多空洞。

  • 每个位图只存储同一种类型的整数,并使用int-8bit、unsigned-16bit这样的键名前缀来标识位图中存储的整数类型。

获取区域存储的值

通过使用BITFIELD命令的GET子命令,用户可以从给定的偏移量或者索引中取出指定类型的整数值:

GET子命令各个参数的意义与SET子命令中同名参数的意义完全一样。

执行加法操作或减法操作

除了设置和获取整数值之外,BITFIELD命令还可以对位图存储的整数值执行加法操作或者减法操作,

这两个操作都可以通过INCRBY子命令实现。

语法

BITFIELD命令并没有提供与INCRBY子命令相对应的DECRBY子命令,但是用户可以通过向INCRBY子命令传入负数增量来达到执行减法操作的效果。

INCRBY子命令在执行完相应的操作之后会返回整数的当前值作为结果。例子如下:

处理溢出

BITFIELD命令除了可以使用INCRBY子命令来执行加法操作和减法操作之外,还可以使用OVERFLOW子命令去控制INCRBY子命令在发生计算溢出时的行为。

语法

OVERFLOW子命令的参数可以是WRAP、SAT或者FAIL中的一个:

  • WRAP表示使用回绕(wrap around)方式处理溢出,这也是C语言默认的溢出处理方式。在这一模式下,向上溢出的整数值将从类型的最小值开始重新计算,而向下溢出的整数值则会从类型的最大值开始重新计算。
  • SAT表示使用饱和运算(saturation arithmetic)方式处理溢出,在这一模式下,向上溢出的整数值将被设置为类型的最大值,而向下溢出的整数值则会被设置为类型的最小值。
  • FAIL表示让INCRBY子命令在检测到计算会引发溢出时拒绝执行计算,并返回空值表示计算失败。

OVERFLOW子命令在执行时将不产生任何回复。此外,如果用户在执行BITFIELD命令时没有指定具体的溢出处理方式,那么INCRBY子命令默认使用WRAP方式处理计算溢出。

需要注意的是,因为OVERFLOW子命令只会对同一个BITFIELD调用中排在它之后的那些INCRBY子命令产生效果,所以用户必须把OVERFLOW子命令放到它想要影响的INCRBY子命令之前。

其他命令

除此之外,还有其他一些Bitmap相关的指令,如BITMAP等,可以根据实际需求进行选择。

redis bitmap 常用命令:

#向指定位置(offset)存入0或1
SETBIT key offset value
 
#获取指定位置(offset)的bit值
GETBIT key offset
 
#统计bitmap中(从start到end,如果不写起始位置,就统计整个key)值为1的bit数量
BITCOUNT key [start end]
 
#操作(查询,修改,自增)Bitmap中指定的位置(offset)的值
BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL]
 
#获取Bitmap中的bit数组,并以十进制返回
BITFIELD_RO

在线练习工具:https://try.redis.io/
查看更多命令:https://redis.io/commands

尼恩建议,优先使用位图存储整数

尼恩建议,在redis中,优先使用 位图存储整数, 而不是使用 String 存储整数

为啥呢?

在一般情况下,当用户使用字符串或者散列去存储整数的时候,Redis都会为被存储的整数分配一个long类型的值(通常为32位长或者64位长),并使用对象去包裹这个值,然后再把对象关联到数据库或者散列中。

与此相反,BITFIELD命令允许用户自行指定被存储整数的类型,并且不会使用对象去包裹这些整数,因此当我们想要存储长度比long类型短的整数,并且希望尽可能地减少对象包裹带来的内存消耗时,就可以考虑使用位图来存储整数。

使用SpringCloud+Redis BitMap 用户场景的签到实操

实操包括以下的操作:

  • 用户签到实操
  • 用户签到查询
  • 查询 获取本月签到信息 签到

用户签到实操

代码如下:

测试如下:

用户签到查询

代码如下:

测试如下:

查询 获取本月签到信息 签到

代码如下:

测试如下:

本文的版本计划和基础学习资料

尼恩作为技术中台、数据中台的架构师, 高并发是尼恩架构的重点, 所以,后面会大家从 架构到实操, 多个维度、多种场景的高并发实操。

而且尼恩指导简历的过程中,也指导过小伙伴写过 10Wqps 超高并发 网关、超高并发秒杀、超高并发物联网等等简历,里边涉及到大量的设计模式,

经过尼恩的指导之后,很多 小伙伴的简历,里边立马金光闪闪,并且顺利走上了架构师之路。

后面有机会,带大家做一下这个高质量的实操,并且指导大家写入简历。

所以,这个材料后面也会进行持续迭代,大家可以找尼恩来获取最新版本和技术交流。

尼恩编著的400页PDF电子书 《SpringCloud Alibaba 技术圣经》

尼恩编著的500页 PDF电子书 《Java高并发核心编程 卷3 加强版》,清华大学出版社出版

pdf领取方式,请参见公众号: 技术自由圈

技术自由的实现路径 PDF:

实现你的 架构自由:

《吃透8图1模板,人人可以做架构》

《10Wqps评论中台,如何架构?B站是这么做的!!!》

《阿里二面:千万级、亿级数据,如何性能优化? 教科书级 答案来了》

《峰值21WQps、亿级DAU,小游戏《羊了个羊》是怎么架构的?》

《100亿级订单怎么调度,来一个大厂的极品方案》

《2个大厂 100亿级 超大流量 红包 架构方案》

… 更多架构文章,正在添加中

实现你的 响应式 自由:

《响应式圣经:10W字,实现Spring响应式编程自由》

这是老版本 《Flux、Mono、Reactor 实战(史上最全)》

实现你的 spring cloud 自由:

《Spring cloud Alibaba 学习圣经》

《分库分表 Sharding-JDBC 底层原理、核心实战(史上最全)》

《一文搞定:SpringBoot、SLF4j、Log4j、Logback、Netty之间混乱关系(史上最全)》

实现你的 linux 自由:

《Linux命令大全:2W多字,一次实现Linux自由》

实现你的 网络 自由:

《TCP协议详解 (史上最全)》

《网络三张表:ARP表, MAC表, 路由表,实现你的网络自由!!》

实现你的 分布式锁 自由:

《Redis分布式锁(图解 - 秒懂 - 史上最全)》

《Zookeeper 分布式锁 - 图解 - 秒懂》

实现你的 王者组件 自由:

《队列之王: Disruptor 原理、架构、源码 一文穿透》

《缓存之王:Caffeine 源码、架构、原理(史上最全,10W字 超级长文)》

《缓存之王:Caffeine 的使用(史上最全)》

《Java Agent 探针、字节码增强 ByteBuddy(史上最全)》

实现你的 面试题 自由:

4000页《尼恩Java面试宝典 》 40个专题

以上尼恩 架构笔记、面试题 的PDF文件更新,请到下面《技术自由圈》公号取↓↓↓

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

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

相关文章

【C++】函数高级

目录 &#x1f34a;一.函数的默认参数&#x1f34a; 1.默认参数的性质 2.函数默认参数的注意事项 &#x1f34e;二.函数的占位参数&#x1f34e; &#x1f34f;三.函数的重载 &#x1f34f; 1.重载的性质和条件 &#xff08;1&#xff09;修改参数的个数 &#xff…

go语言中文文档 学习笔记(未完)

这里写目录标题 网络编程互联网协议介绍socket编程socket图解TCP编程服务端客户端 UDP编程TCP黏包 http编程WebSocket编程 网络编程 互联网协议介绍 socket编程 socket图解 Socket是应用层与TCP/IP协议族通信的中间软件抽象层。在设计模式中&#xff0c;Socket其实就是一个门…

12.设计模式之门面模式

前言 门面模式&#xff0c;是指提供一个统一的接口去访问多个子系统的多个不同的接口&#xff0c;它为子系统中的一组接口提供一个统一的高层接口。使得子系统更容易使用。日志框架slf4J是门面模式最经典的应用场景。 本节&#xff0c;我们就门面模式&#xff0c;展开详细介绍…

1.setContentView流程分析

1. setContentView初步分析之继承自Activity 我们创建的MainActivity继承自Activity,在代码中使用setContentView(R.layout.activity_main),查看他在Activity中的源码如下: public void setContentView(LayoutRes int layoutResID) {//这里的getWindow方法获取到一个PhoneWind…

什么是好代码/坏代码?给普通人的图解示例

本文翻译自国外论坛 medium&#xff0c;原文地址&#xff1a;https://medium.com/todbotts.triangles/what-is-good-bad-code-an-illustrated-example-for-non-programmers-1222b600a0f0 我曾经在某个地方读到过一句话&#xff0c;基本上有以下内容&#xff1a; 在现代世界中&a…

算法(一)—— 回溯(3)

文章目录 1 78 子集2 90 子集II3 491 递增子序列 子集问题 1 78 子集 如果把 子集问题、组合问题、分割问题都抽象为一棵树的话&#xff0c;那么组合问题和分割问题是收集树的叶子节点&#xff0c;而子集问题是找树的所有节点&#xff01; 因为需要找到所有的节点&#xff0…

JavaEE(系列一 )-- 计算机是如何进行工作的

目录 1. 操作系统 2. 进程/任务&#xff08;Process/Task&#xff09; 2.1 进程 2.2 进程管理 2.2.1 进程的结构体 2.2.2 进程调度 2.3 并行 和 并发 2.4 内存分配 -- 内存管理(Memory Manage) 2.5 进程间通信 3. 线程 1. 操作系统 操作系统是一组做计算机资源管理的软件的…

谷歌I/O大会重磅发布:Bard编码能力优化后仍不支持中文,开发者选择CodeGeeX更佳

谷歌I/O大会今天凌晨发布&#xff0c;打出系列AI组合拳。除了发布升级版语言模型PaLM2之外&#xff0c;Bard能力也要起飞。 凭借改进的数学、逻辑和推理技能&#xff0c;Bard 现在可以帮助生成、解释和调试 20 多种编程语言的代码&#xff0c;开发者们需要输入prompt&#xff0…

C#从入门到入坟(原创不易,转载请注明出处)

文章目录 C# 基础篇0 环境部署1 Hello world1.1 两种框架1.2 创建项目的过程1.3 项目组成结构1.3.1 解决方案和项目1.3.2 程序集信息1.3.3 引用1.3.4 配置文件1.3.5 程序入口类 1.4 解决方案1.5 Debug 和 Release1.6 CSharp虚拟机初始1.7 .Net Framework混合语言开发1.8 托管代…

上下文感知的体素对比学习用于标签高效的多器官分割

文章目录 Context-Aware Voxel-Wise Contrastive Learning for Label Efficient Multi-organ Segmentation摘要本文方法有监督损失Context-Aware Contrastive Learning Loss for Unlabeled Voxels 实验结果 Context-Aware Voxel-Wise Contrastive Learning for Label Efficient…

GSMA-eSIM-官网规范说明

GSMA | eSIM Consumer and IoT Specifications - eSIM GSMA | eSIM Consumer and IoT Specifications - eSIMhttps://www.gsma.com/esim/esim-specification/ 架构、测试、技术规范 3.0版本 测试套件 EID的定义和分配 GSMA EID Definition and Assignment 合规性规范 自我评…

第十四届蓝桥杯青少组模拟赛Python真题 (2023年2月12日),包含答案

第十四届蓝桥杯青少组模拟赛Python真题 (2023年2月12日) 一、选择题 第 1 题 单选题 关于Python3.10,下列选项描述正确的是 ( )。 答案:B 第 2 题 单选题 下列数据类型中,哪一个是不可变的?() 答案:B 第 3 题 单选题 以下关于函数参数描述正确的是 ()。 答案:D 第 …

【JAVAEE】文件操作——IO

目录 &#x1f48b;1. 冯诺伊曼体系 &#x1f437;2. 内存与外存的区别 ✨3. 文件 &#x1f381;3.1 认识文件 ✌3.2 文件的管理 &#x1f373;3.3 文件路径 &#x1f383;3.4 文件的保存 &#x1f451;3.4.1 文本文件 &#x1f4f7;3.4.2 二进制文件 &#x1f380;3.5 文件系…

Python基本数据类型之一——set(集合)

Python基本数据类型之一——set(集合) 一、python集合定义 集合(set)是一个无序不重复元素的序列。基本功能是进行成员关系测试和删除重复元素。 二、创建方式 在Python中&#xff0c;创建集合有两种方式&#xff1a; 一种是用一对大括号将多个用逗号分隔的数据括起来。 另一种…

Vue3-黑马(九)

目录&#xff1a; &#xff08;1&#xff09;vue3-antdv-删除选中 &#xff08;2&#xff09;vue3-进阶-antdv-增改 &#xff08;3&#xff09;vue3-进阶-antdv-增改2 &#xff08;1&#xff09;vue3-antdv-删除选中 我们在表格中在加一列&#xff0c;做一个复选框&#xff…

【一起啃书】《机器学习》第六章 支持向量机

文章目录 第六章 支持向量机6.1 间隔和支持向量6.2 对偶问题6.3 核函数6.4 软间隔与正则化6.5 支持向量回归6.6 核方法6.7 一些问题 第六章 支持向量机 6.1 间隔和支持向量 给定训练样本集 D { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } , y i ∈ { − 1 , …

【YOLO系列】--YOLOv4超详细解读/总结

YOLOv4&#xff08;YOLOv4: Optimal Speed and Accuracy of Object Detection&#xff09;&#xff08;原文&#xff0b;解读/总结&#xff0b;翻译&#xff09; 系列文章&#xff1a; YOLOv1论文解读/总结_yolo论文原文_耿鬼喝椰汁的博客-CSDN博客 YOLOv2论文解读/总结_耿鬼…

[免疫学]抗原递呈详解

目录 &#x1f9eb;1. 抗原递呈是什么 &#x1f9eb;1.1 MHCⅠ类分子 &#x1f9eb;1.2 MHCⅡ类分子 &#x1f9eb;1.3 MHCⅠ类分子 分子介导的抗原递呈 &#x1f9eb;1.4 MHCⅡ类分子 分子介导的抗原递呈 &#x1f9eb;1.5 抗原递呈细胞 &#x1f9eb;1.5.1 激活的树突状…

初识Linux篇:第三篇

初识Linux篇&#xff1a;第三篇 初识Linux篇&#xff1a;第三篇1.Linux中常见的通配符1.1*号通配符1.2 &#xff1f;通配符1.3[ ]通配符1.4{ }通配符 2.man指令3.cp指令4.mv指令5.alias指令6. echo指令7.cat指令8.more指令9.less指令10.head与tail指令11.在Linux中写代码 总结 …

DHCP中继负载均衡使用原理

DHCP常用四种报文 基于UDP67服务端&#xff0c; 68端口客户端 discover 广播 offer 单播 rquest 广播 ack 单播 DHCP 50%时间续租时request报文为单播报文 DHCP 87.5%时间请求重新绑定IP时request报文为广播报文 DHCP的另类配置方案&#xff1a; 负载均衡&#xff1a; ip re…