软件设计之Redis(3)

news2025/2/27 7:31:50

软件设计之Redis(3)

路线图推荐:
【Java学习路线-极速版】【Java架构师技术图谱】
尚硅谷Redis零基础到进阶,最强redis7教程,阳哥亲自带练(附redis面试题)
资料可以去尚硅谷官网免费领取
感谢学习笔记提供:github地址

学习内容:

  1. Hash操作命令
  2. Set操作命令
  3. Zset操作命令
  4. Bitmap操作命令
  5. HyperLogLog操作命令
  6. GEO操作命令
  7. Stream操作命令
  8. Bitfield操作指令

1、Hash操作命令

结构:Hash 是一个键(key)到字段(field)及其值(value)的映射。
存储:每个 Hash 可以包含多个字段,每个字段都对应一个值。Hash 的存储方式非常高效,尤其适合存储较小的对象。

HSET 命令可以一次性添加多个字段和值到 Redis Hash 中。在使用 HSET 时,你可以提供一个键,后面跟着多个字段及其对应的值。

HSET user:1000 name "Alice" age 30 email "alice@example.com"
命令作用语法返回值示例
HSET将字段和值设置到 Hash 中HSET key field value1(如果字段是新创建的)或 0(如果字段已存在)HSET user:1000 name "Alice"
HGET获取 Hash 中指定字段的值HGET key field字段的值,如果字段不存在则返回 nilHGET user:1000 name,返回 "Alice"
HDEL删除 Hash 中指定的字段HDEL key field [field ...]被删除字段的数量HDEL user:1000 name,删除字段 name
HGETALL获取 Hash 中所有字段及其值HGETALL key以键值对的形式返回所有字段和对应的值HGETALL user:1000,返回 { "name": "Alice" }
HKEYS获取 Hash 中所有字段的名称HKEYS key所有字段的名称HKEYS user:1000,返回 ["name"]
HVALS获取 Hash 中所有字段的值HVALS key所有字段的值HVALS user:1000,返回 ["Alice"]
HINCRBY将 Hash 中指定字段的值增加指定的整数HINCRBY key field increment增加后的值HINCRBY user:1000 age 1,将 age 增加 1

2、Set操作命令

Redis集合是一种无序的字符串集合,具有唯一性,即集合中的元素不允许重复。集合是 Redis 中的一种数据结构,非常适合用于需要快速查找、插入和删除的场景。

Set 集合中的元素没有固定顺序,插入顺序不影响返回结果。

命令作用语法返回值示例
SADD向集合中添加一个或多个元素SADD key member [member ...]被添加到集合中的新元素数量SADD myset "a" "b" "c"
SREM从集合中移除一个或多个元素SREM key member [member ...]被移除的元素数量SREM myset "b"
SMEMBERS获取集合中的所有元素SMEMBERS key集合中的所有元素SMEMBERS myset,返回 ["a", "c"]
SISMEMBER判断某个元素是否是集合的成员SISMEMBER key member如果是,返回 1;否则返回 0SISMEMBER myset "a",返回 1
SCARD获取集合中元素的数量SCARD key集合中元素的数量SCARD myset,返回 2
SINTER获取一个或多个集合的交集SINTER key1 [key2 ...]交集中的元素SINTER set1 set2
SUNION获取一个或多个集合的并集SUNION key1 [key2 ...]并集中的元素SUNION set1 set2
SDIFF获取一个集合与其他集合的差集SDIFF key1 [key2 ...]差集中的元素SDIFF set1 set2

3、Zset操作命令

Redis 的有序集合(ZSet,Sorted Set)是一种将元素分数(score)关联起来的数据结构,和普通集合不同,ZSet 是按照分数从小到大自动排序的,常用于排行榜、优先队列等场景。

在 Redis 的有序集合(ZSet)中,ZADD 命令根据元素的分数(score)进行排序,而不是像列表(List)那样通过插入顺序进行排序。因此,当使用 ZADD 添加元素时,Redis 会根据提供的分数从小到大排序元素,而与添加的顺序无关。

命令描述语法示例
ZADD添加元素并设置分数ZADD key score member [score member ...]ZADD leaderboard 100 user1 200 user2 150 user3
ZRANGE按照分数从小到大,返回指定区间的元素ZRANGE key start stop [WITHSCORES]ZRANGE leaderboard 0 2 WITHSCORES
ZREVRANGE按照分数从大到小,返回指定区间的元素ZREVRANGE key start stop [WITHSCORES]ZREVRANGE leaderboard 0 2 WITHSCORES
ZSCORE返回指定成员的分数ZSCORE key memberZSCORE leaderboard user1
ZRANK返回指定成员的排名(从小到大)ZRANK key memberZRANK leaderboard user1
ZREVRANK返回指定成员的排名(从大到小)ZREVRANK key memberZREVRANK leaderboard user1
ZINCRBY增加指定成员的分数ZINCRBY key increment memberZINCRBY leaderboard 50 user1
ZREM移除一个或多个成员ZREM key member [member ...]ZREM leaderboard user1 user2
ZRANGEBYSCORE按照分数范围返回成员ZRANGEBYSCORE key min max [WITHSCORES]ZRANGEBYSCORE leaderboard 100 200 WITHSCORES
ZREMRANGEBYSCORE移除分数范围内的成员ZREMRANGEBYSCORE key min maxZREMRANGEBYSCORE leaderboard 100 150
ZREMRANGEBYRANK移除指定排名范围内的成员ZREMRANGEBYRANK key start stopZREMRANGEBYRANK leaderboard 0 1
ZCARD返回集合中的成员数量ZCARD keyZCARD leaderboard
ZCOUNT统计分数在指定范围内的成员数量ZCOUNT key min maxZCOUNT leaderboard 100 200
ZINTERSTORE计算给定的有序集合的交集并存储在新集合中ZINTERSTORE dest numkeys key [key ...]ZINTERSTORE result 2 key1 key2
ZUNIONSTORE计算给定的有序集合的并集并存储在新集合中ZUNIONSTORE dest numkeys key [key ...]ZUNIONSTORE result 2 key1 key2

4、Bitmap操作命令

Bitmap 是 Redis 中用于存储和操作二进制位的特殊数据结构,可以将一组二进制位存储在一个键下,并进行位级别的操作。Bitmap 本质上是一个字符串,字符串的每一位都可以存储 0 或 1,因此它适合用于高效存储和处理大量布尔值的场景,例如用户签到、在线状态跟踪等。

命令描述语法示例
SETBIT设置指定位置的位值(0 或 1)SETBIT key offset valueSETBIT user_activity 7 1
GETBIT获取指定位置的位值GETBIT key offsetGETBIT user_activity 7
BITCOUNT统计位值为 1 的数量BITCOUNT key [start end]BITCOUNT user_activity
BITOP对多个 Bitmap 执行位操作(AND、OR、XOR、NOT)BITOP operation destkey key1 [key2 ...]BITOP AND result_bitmap user1_activity user2
BITPOS查找第一个指定位值(0 或 1)的位置BITPOS key bit [start end]BITPOS user_activity 1

setbit 假设设置k1 的1号位为1,实际情况是:
在这里插入图片描述
bitpos实现记录连续2天都签到的用户数量:

  1. 每个用户的签到情况对应一位(bit)
  2. 这两天的签到记录进行按位 与(AND) 操作。只有在两个 Bitmap 中该位都为 1 的用户,才算是连续两天都签到的用户
# 第一天的签到
SETBIT day1_signin 0 1
SETBIT day1_signin 1 1
SETBIT day1_signin 2 0
SETBIT day1_signin 3 1

# 第二天的签到
SETBIT day2_signin 0 1
SETBIT day2_signin 1 0
SETBIT day2_signin 2 1
SETBIT day2_signin 3 1

# 使用 BITOP AND 操作,计算两天都签到的用户
BITOP AND both_days_signin day1_signin day2_signin

# 统计连续两天都签到的用户数量
BITCOUNT both_days_signin

5、HyperLogLog操作命令

HyperLogLog 使用了一种基于哈希函数的概率算法。它通过将输入数据进行哈希处理,并使用位运算来维护一个状态,以估计唯一元素的数量。

命令描述语法示例
PFADD添加元素到 HyperLogLogPFADD key element [element ...]PFADD hll_key user1 user2 user3
PFCOUNT返回 HyperLogLog 估算的唯一元素数量PFCOUNT key [key ...]PFCOUNT hll_key
PFMERGE合并多个 HyperLogLog 的估算值PFMERGE destkey sourcekey [sourcekey ...]PFMERGE merged_key hll_key1 hll_key2

实际演示:
在这里插入图片描述

6、GEO操作命令

Redis 的 GEO(地理空间)模块用于存储处理地理位置数据,允许用户在给定的坐标(经度和纬度)上执行地理空间相关的操作。GEO 数据结构可以用于处理位置服务附近地点查找等场景。

Redis 的 GEO 模块基于Geohashing有序集合(ZSet) 的数据结构来存储和处理地理位置信息。

  1. Geohashing 是一种将经纬度坐标转换为字符串表示的方法。这种方法将地球表面划分为网格,并用一个字符串来表示特定区域。这个字符串的长度决定了位置的精确度,越长表示越精确的位置。
  2. Geohashing 的基本原理是将经纬度的值编码为二进制,然后将二进制数据交替分割成两个部分,分别表示纬度和经度。通过对这些二进制数据进行分组和压缩,形成最终的哈希值。
  3. Redis 使用 有序集合 数据结构来存储地理空间元素。每个元素的分数(score)是其 Geohash 值,元素的值(value)是其对应的地理位置名称或 ID[经纬度经过一定的计算得到Score,而不是把经纬度作为分数]。
  4. 由于有序集合是按分数排序的,因此可以利用其特性高效地进行范围查询。通过根据 Geohash 值的范围,可以快速找到位于某个特定区域内的所有元素。
命令描述语法示例
GEOADD将一个或多个地理空间元素添加到指定的键GEOADD key longitude latitude memberGEOADD locations 13.361389 38.115556 "Palermo"
GEODIST计算两个地理空间元素之间的距离GEODIST key member1 member2 [unit]GEODIST locations "Palermo" "Catania" km
GEOHASH获取一个或多个地理空间元素的哈希值GEOHASH key member [member ...]GEOHASH locations "Palermo"
GEOPOS获取一个或多个地理空间元素的坐标GEOPOS key member [member ...]GEOPOS locations "Palermo"
GEORADIUS查找指定半径内的地理空间元素GEORADIUS key longitude latitude radius [unit]GEORADIUS locations 15 37 200 km
GEORADIUSBYMEMBER查找指定半径内的地理空间元素(以成员为中心)GEORADIUSBYMEMBER key member radius [unit]GEORADIUSBYMEMBER locations "Palermo" 200 km

GEORADIUS key longitude latitude radius M|KM|FT|MI \[WITHCOORD] \[WITHDIST] \[WITHHASH] [COUNT count [ANY]

  1. 以给定的经纬度为中心,返回与中心的距离不超过给定最大距离的所有元素位置
  2. m-米、km-千米、ft-英寸、mi-英里(单位)
  3. WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致。
  4. WITHCOORD: 将位置元素的经度和维度也一并返回。
  5. WITHHASH:以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试,实际中的作用并不大
  6. COUNT 限定返回的记录数。

7、Stream操作命令

什么是消息队列

消息队列(Message Queue,MQ)是一种通信方法,主要用于在分布式系统或不同应用程序之间传递数据或信息。它允许应用程序或服务异步地交换消息,从而实现解耦和提高系统的可扩展性和可靠性。

  1. 基本概念
    生产者(Producer): 负责创建和发送消息到消息队列的组件或应用程序。
    消费者(Consumer): 从消息队列中读取和处理消息的组件或应用程序。
    消息队列(Message Queue): 用于存储消息的中间数据结构,负责在生产者和消费者之间传递消息。
  2. 消息队列通常采用以下方式工作:
    发送消息: 生产者将消息发送到消息队列。消息被存储在队列中,等待被消费者处理。
    存储消息: 消息队列将收到的消息存储在内部缓存中,可能使用内存或持久化存储(如磁盘)来确保消息不会丢失。
    接收消息: 消费者从消息队列中获取消息,处理后可以删除或标记为已处理。
    异步处理: 生产者和消费者可以在不同的时间运行,消费者可以在消息到达后随时处理,而不必等待生产者发送完所有消息。

Redis 5.0前消息队列实现

在 Redis 5.0 之前,开发者通常使用以下几种方式来实现消息队列。尽管这些方式能够满足基本需求,但它们也存在一些局限性。

实现方式1: 使用 Redis 的列表数据结构,通过 LPUSH 和 RPOP 命令来实现生产者和消费者的消息队列。

  • 生产者通过 LPUSH 将消息添加到列表的左侧。
  • 消费者通过RPOP从列表的右侧读取消息。
  • 缺点:
    • 实现复杂度高:需要管理分数和顺序。
    • 仍然面临消息丢失和确认消费的问题。
      在这里插入图片描述

实现方式2: 使用 Redis 发布/订阅(Pub/Sub)

  • 实现方式:使用 Redis 的发布/订阅机制,将消息发布到频道,所有订阅该频道的消费者都能接收到消息。
  • 缺点:
    • 不持久化:如果消费者在消息发布时未在线,将无法接收到消息。
    • 无法确认消费:无法保证消费者是否已成功处理消息。
    • 不支持消息排队:无法控制消息的处理顺序。
      在这里插入图片描述

Stream底层原理

在这里插入图片描述
消费内容(Message Content)
消费组(Consumer group)包括:

  • 消费组名称:消费组的唯一标识符。
  • 游标(Last_delivered_id):用于跟踪消费组处理进度的游标(游标记录了消费组当前处理的最大消息 ID)。
    • 消费组游标: 反映整个消费组的处理进度,指向已处理的最大消息 ID。
    • 消费者游标: 反映每个消费者的处理进度,指向该消费者最近处理的消息 ID。
  • 待处理消息:存储每个消费者的待处理消息列表,以及每个消费者的状态信息(如未确认消息的数量)。

消费者(Consumer)
待处理消息( Pending IDs):

  • Pending IDs 是指尚未被消费组中的消费者确认处理的消息。使用 Redis Stream 时,消费者读取消息后需要进行确认(XACK),如果不确认,这些消息将被视为待处理消息。

队列相关指令

指令描述示例
XADD向 Stream 中添加一条消息。XADD mystream * field1 value1 field2 value2
XTRIM修剪 Stream,删除超过指定数量的旧消息。XTRIM mystream 1000
XREAD从 Stream 中读取消息。XREAD COUNT 5 STREAMS mystream 0
XREADGROUP从 Stream 中以消费组的方式读取消息。XREADGROUP GROUP mygroup consumer1 STREAMS mystream >
XDEL删除指定的消息。XDEL mystream 1625244543235-0
XLEN获取 Stream 中的消息数量。XLEN mystream
XRANGE获取指定范围内的消息。XRANGE mystream - +
XREVRANGE以降序获取指定范围内的消息。XREVRANGE mystream + -

xadd:默认用星号表示自动生成ID,消息 ID 是由两部分组成的,Redis对于ID有强制要求,具体格式为 时间戳-序列号,且后续ID不能小于前一个ID。

  • 时间戳用于保证消息的唯一性和顺序。它代表消息被添加到 Stream 的确切时间,确保所有消息可以按照时间顺序进行处理。
  • 当多个消息在同一毫秒内被添加到 Stream 时,序列号用于区分这些消息。序列号从 0 开始递增,确保在相同时间戳下,消息的唯一性和顺序性。
    在这里插入图片描述

XRANGE key start end [COUNT count]:用于获取消息列表(可以指定范围),忽略删除的消息

  • start 表示开始值,-代表最小值,也可以是某个精确的ID比如:1625244543235-0
  • end 表示结束值,+代表最大值,也可以是某个精确的ID
  • count 表示最多获取多少个值

XREAD \[COUNT count] [BLOCK milliseconds] STREAMS key [key ...] id [id ...]

  • 只会返回大于指定ID的消息
  • COUNT最多读取多少条消息
  • BLOCK是否以阻塞的方式读取消息,默认不阻塞。如果milliseconds设置为0,表示永远阻塞

阻塞与非阻塞

非阻塞: 非阻塞操作指的是客户端发出读取消息请求后,无论 Redis 中有没有新消息,都会立即返回结果。若 Stream 中没有符合条件的消息,则返回空结果。

  • 特点:快速返回,如果没有消息则不会等待,直接返回空值,适合在消息存在时的读取需求。

阻塞:阻塞操作指的是客户端发出读取请求后,如果 Stream 中没有新消息,则会一直等待,直到有新消息或达到指定的超时时间后返回结果。

  • 特点:适用于需要等待新消息的场景,例如消息队列系统。当没有消息可读取时,客户端会一直等待,直到有新消息或达到超时时间。超时后,返回空结果。

消费组相关指令

指令描述示例
XGROUP CREATE创建一个消费组。XGROUP CREATE mystream mygroup 0
XGROUP DESTROY删除一个消费组。XGROUP DESTROY mystream mygroup
XGROUP SETID手动设置消费组的游标。XGROUP SETID mystream mygroup 1625244543235-3
XPENDING查看消费组中待处理的消息状态。XPENDING mystream mygroup
XACK确认已处理的消息。XACK mystream mygroup 1625244543235-0
XCLAIM将待处理的消息重新分配给其他消费者。XCLAIM mystream mygroup consumer2 1000 1625244543235-0
XREADGROUP以消费组的方式从 Stream 中读取消息。XREADGROUP GROUP mygroup consumer1 STREAMS mystream >
XAUTOCLAIM自动确认已超时的消息并将其重新分配给消费者。XAUTOCLAIM mystream mygroup consumer2 1000 0 1625244543235-0

xreadgroup

  • “>”,表示从第一条尚未被消费的消息开始读取
  • 消息队列的信息一旦被消费组里的一个消费者读取,就不能再被该组内其他消费者读取
  • 不同消费组的消费者可以消费同一条消息

如何保证消费者在发生故障或宕机再次重启后,仍然可以读取未处理完的消息?

该机制依赖于Pending Entries List(待处理消息列表)消息确认机制(Acknowledgement)

流程:

消息读取和分配: 消费者通过 XREADGROUP 读取消息,消息会进入 PEL 列表,表示已经分配给某个消费者,但尚未确认处理完成。
消息确认: 消费者处理完消息后,通过 XACK 命令确认,消息从 PEL 中移除。如果未确认,消息依然保留在 PEL 中。
消费者宕机后的恢复:

  • 宕机后重启,消费者可以使用 XPENDING 查看未确认的消息。
  • 使用 XCLAIM 或重新读取这些未确认消息,继续处理它们。

保证机制: 消息不会丢失,未被 XACK 确认的消息可以被重新分配给其他消费者,保证消息可靠处理。

8、Bitfield操作指令

Redis 的 BITFIELD 命令主要用来操作字符串的二进制位(bit),可以看作是在 Redis 字符串里创建了一个“位数组”,你可以像操作数组一样,去读、写或修改某些位。它的常见用途是用来高效地存储和处理小的整数数据,尤其是在需要节省空间的情况下。

命令描述示例
BITFIELD key GET type offset获取指定偏移量和长度的位段值BITFIELD mykey GET u8 0 (从第 0 位读取 8 位无符号整数)
BITFIELD key SET type offset value设置指定偏移量和长度的位段值BITFIELD mykey SET i5 4 12 (从第 4 位开始的 5 位设置为 12)
BITFIELD key INCRBY type offset inc对指定偏移量和长度的位段值进行递增操作BITFIELD mykey INCRBY u4 8 1 (从第 8 位开始的 4 位加 1)
BITFIELD key OVERFLOW WRAP设置溢出行为为环绕(超过最大值后从头开始)BITFIELD mykey OVERFLOW WRAP INCRBY u8 0 200
BITFIELD key OVERFLOW SAT设置溢出行为为饱和(超出最大值或最小值则保持极值)BITFIELD mykey OVERFLOW SAT INCRBY i8 0 200
BITFIELD key OVERFLOW FAIL设置溢出行为为失败(溢出时操作失败)BITFIELD mykey OVERFLOW FAIL INCRBY u8 0 200

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

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

相关文章

探索OpenCV的人脸检测:用Haar特征分类器识别图片中的人脸

目录 简介 OpenCV和Haar特征分类器 实现人脸检测 1. 导入所需库 2. 加载图片和Haar特征分类器 3. 检测人脸 4. 标注人脸 5. 显示 6、结果展示 结论 简介 在计算机视觉和图像处理领域,人脸识别是一项重要的技术。它不仅应用于安全监控、人机交互&#xff0…

日期类的实现和取地址运算符重载

前面将类学的差不多,接下来我们就来实现一下日期类。这个日期类包含运算符重载和前面学 的C的语法知识。 首先我们先建立一个日期类的头文件和源文件: 一.日期类的头文件实现: 首先我们要知道我们有闰年,还有每个月的天数也不一样…

推挽电路(图腾柱)

推挽电路:Push-Pull 即推-拉的意思。 推挽电路本质是功率放大电路(放大电流),增大输入信号的驱动能力,具有以下两个特点。 1 很强的灌电流,即向负载注入大电流。 2 很强的拉电流,即从负载抽取…

【vue3】图片上传功能实现

本次功能使用的是vue3elementplusnodejsmultiparty实现的图片上传与使用。 属于自行摸索的部分,有很大改进地方。目前思路是图片和数据分别上传,在上传图片时返回图片地址,将地址保存到表单数据中,在获取图片时,通过地…

智能优化算法-蛇优化算法(SO)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1.内容介绍 蛇优化算法 (Snake Optimization Algorithm, SO) 是一种基于群体智能的元启发式优化算法,它模拟了蛇的捕食行为、运动模式和社会互动,用于解决复杂的优化问题。 SO的工作机制主要包括&a…

跨平台设计利器:五款免费UI设计工具推荐

1、即时设计 即时设计是一款国产的在线UI设计工具,它以其强大的原型设计功能和丰富的交互效果而受到设计师的喜爱。即时设计支持300多种交互效果,可以帮助设计师快速构建高保真原型。它还提供了设计交付功能,允许设计师直接在平台上创建用户…

版权科普:版权保护的常见误区,你中招了吗?

在当今信息爆炸的时代,版权保护成为了一个备受关注的话题。然而,对于版权保护,很多人存在着一些误解和误区。 首先,让我们来明确一下什么是版权保护。 版权保护指的是对文学、艺术和科学领域内具有独创性并能以某种有式复制的智力…

Linux系统使用NFS挂载共享目录

一、目的 服务器A 共享目录 /data 服务器B 挂载服务器A的目录 /data 服务器C 挂载服务器A的目录 /data … 上面的/data 只是举例,也可以是自定义的路径 二、常见的使用场景 ①、应用多实例多机器部署的情况下,有一些下载或者上传的模板文件&#xff…

taozige/Java语言的Netty框架+云快充协议1.5+充电桩系统+新能源汽车充电桩系统源码

云快充协议云快充1.5协议云快充1.6云快充协议开源代码云快充底层协议云快充桩直连桩直连协议充电桩协议云快充源码 介绍 云快充协议云快充1.5协议云快充1.6云快充协议开源代码云快充底层协议云快充桩直连桩直连协议充电桩协议云快充源码 软件架构 1、提供云快充底层桩直连协…

提升职场办公效率的电脑桌面悬浮窗便签有什么?

电脑桌面悬浮窗便签软件能够帮助我们更好地管理日常任务、记录灵感瞬间,提升职场办公效率,并且保持工作区的整洁。这类软件通常具备以下特点:简易实用、快速记录、功能齐全、以及跨平台同步功能等等。今天为大家推荐一款简单好用的电脑桌面悬…

高可用之限流-06-slide window 滑动窗口 sentinel 源码

限流系列 开源组件 rate-limit: 限流 高可用之限流-01-入门介绍 高可用之限流-02-如何设计限流框架 高可用之限流-03-Semaphore 信号量做限流 高可用之限流-04-fixed window 固定窗口 高可用之限流-05-slide window 滑动窗口 高可用之限流-06-slide window 滑动窗口 sen…

二维码:理解二维码 / 生成二维码 / 小程序支持哪种类型的二维码 / 小程序识别GS1码

一、理解二维码 1.1、概念 二维码(2-dimensional bar code),又称二维条码,最早发源于日本,它是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的&am…

10月15日 -- 11月15日 ,参与《人工智能导论》学习打卡赢B站大会员

一、活动参与地址 点击链接进行活动报名>>>https://momodel.cn/classroom/course/detail?id6173911eab37f12b14daf4a8&activeKeyinfo&srcbef3adb478 二、活动详情 进入链接点击报名,仅需每天参与吴超老师的《人工智能导论》打卡活动&#xff0…

day11-SpringMVC

一、SpringMVC 1.SpringMVC流程分析 2.各种注解 3.接收请求参数 3.1 简单类型 3.2 对象类型 3.3 数组类型 3.4 集合类型 3.5 日期类型 3.6 json参数类型 3.7 路径参数 二、统一异常处理 三、Restful

一个月学会Java 第16天 注解和异常处理

Day16 注解和异常处理 为什么一定要标注是元注解呢,这个原因其实非常的简单,因为注解现在还不能写,想要使用注解达到SpringMVC和SpringBoot的等级需要使用反射,但是反射我们现在还不会,所以就先讲讲最基本的元注解。 第…

MOS管的电路应用

MOS管的电路应用 MOS管的选型参考 1、MOS管类型 一般选择增强型NMOS管,同等工艺条件下,导通电阻Ron更小,发热更低,允许通过的电流更大,型号也更多。 2、Vgs电压 需要考虑开启电压,驱动电压,极…

每日一刷——10.14——括号匹配(手写栈来实现)

栈与队列题目 第一题 题目 问题描述】设计一个算法判别一个算术表达式的圆括号是否正确配对 【输入形式】一个以为结尾的算术表达式 【输出形式】若配对,则输出圆括号的对数;否则输出no 【样例输入】 (ab)/(cd) 【样例输出】 2 【样例说明】共有两对括…

带隙基准Bandgap电路学习(三)

一、导入器件到版图中 从原理图中导入器件: Connectivity——>Generate——>All From Source I/O Pins暂不添加,后面自己画 PR(Primary Region)Boundary: 通常是用来定义芯片设计中某些关键区域的轮廓,比…

揭秘数字时代的安全守护者:深入探索RSA加密算法的奥秘

目录 引言 一、什么是RSA? 二、RSA 的基本原理 三、RSA 加密的基本步骤 1、加密过程 2、解密过程 四、RSA例子 五、RSA 的特点 六、RSA 的安全性 七、RSA 的实际应用 总结 引言 在当今的信息化社会,数据的安全性和隐私保护已…

外包干了两年,女朋友跟别人跑了

在这个瞬息万变的IT行业,不进则退的道理,我算是深刻体会到了。作为一名本科生,21年通过校招,我幸运地踏入了广州某知名软件公司的大门,成为了一名功能测试工程师。那时的我,满怀激情与梦想,以为…