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

Redis存储⑤Redis五大数据类型之 List 和 Set。

目录

1. List 列表

1.1 List 列表常见命令

1.2 阻塞版本命令

1.3 List命令总结和内部编码

1.4 List典型使用场景

1.4.1 消息队列

1.4.2 分频道的消息队列

1.4.3 微博 Timeline

2. Set 集合

2.1 Set 集合常见命令

2.2 Set 集合间命令

2.3 Set命令小结和内部编码

2.4 Set集合使用场景

本篇完。


1. List 列表

列表两端插入和弹出操作:

        列表类型是用来存储多个有序的字符串,如上图所示,a、b、c、d、e 五个元素从左到右组成了一个有序的列表,列表中的每个字符串称为元素(element),一个列表最多可以存储个元素。

        在 Redis 中,可以对列表两端插入(push)和弹出(pop),还可以获取指定范围的元素列表、获取指定索引下标的元素等,如下图所示。

列表的获取、删除等操作:

列表是一种比较灵活的数据结构,它可以充当栈和队列的角色,在实际开发上有很多应用场景。

列表类型的特点:

  • 列表中的元素是有序的(指的是顺序很关键,不是指升序 / 降序),这意味着可以通过索引下标获取某个元素或者某个范围的元素列表,例如要获取上图中的第 5 个元素,可以执行 lindex user:1:messages 4 或者倒数第 1 个元素,lindex user:1:messages -1 就可以得到元素 e。
  • 区分获取和删除的区别,例如上图中的 lrem 1 b 是从列表中把从左数遇到的前 1 个 b 元素删除,这个操作会导致列表的长度从 5 变成 4;但是执行 lindex 4 只会获取元素,但列表长度是不会变化的。
  • 列表中的元素是允许重复的,例如下图中的列表中是包含了两个 a 元素的。

列表中允许有重复元素:


1.1 List 列表常见命令

lpush

将一个或者多个元素从左侧放入(头插)到 list 中。

语法:lpush key element [element ...]

命令有效版本:1.0.0 之后

时间复杂度:只插入一个元素为 O(1),插入多个元素为 O(N),N 为插入元素个数。

返回值:插入后 list 的长度。

示例:

前面的序号时专门给结果集使用的序号,和 list 下标无关。


lpushx

在 key 存在时,将一个或者多个元素从左侧放入(头插)到 list 中。不存在,直接返回。

lpushx 指的是:left push exists

语法:lpushx key element [element ...]

命令有效版本:2.0.0 之后

时间复杂度:只插入一个元素为 O(1),插入多个元素为 O(N),N 为插入元素个数。

返回值:插入后 list 的长度。

示例:


rpush

将一个或者多个元素从右侧放入(尾插)到 list 中。

语法:rpush key element [element ...]

命令有效版本:1.0.0 之后

时间复杂度:只插入一个元素为 O(1),插入多个元素为 O(N),N 为插入元素个数。

返回值:插入后 list 的长度。

示例:


rpushx

在 key 存在时,将一个或者多个元素从右侧放入(尾插)到 list 中。

语法:rpushx key element [element ...] 

命令有效版本:2.0.0 之后

时间复杂度:只插入一个元素为 O(1),插入多个元素为 O(N),N 为插入元素个数。

返回值:插入后 list 的长度。

示例:


lrange

获取从 start 到 end 区间的所有元素,左闭右闭(闭区间),下标支持负数。

lrange 指的是:list range

语法:LRANGE key start stop

命令有效版本:1.0.0 之后

时间复杂度:O(N)

返回值:指定区间的元素。

示例:

        Redis 的做法是直接尽可能的获取到给定区间范围内的元素,如果给定区间非法,比如超出下标,就会尽可能的获取对应的内容。


lpop

从 list 左侧取出元素(即头删)。

语法:lpop key 

        Redis 5 版本中在这后面是没有 [count] 参数的,从 Redis 6.2 版本开始,新增了一个 count 参数,用来描述此次要删除几个元素。

命令有效版本:1.0.0 之后

时间复杂度:O(1)

返回值:取出的元素或者 nil。

示例:


rpop

从 list 右侧取出元素(即尾删)。

语法:rpop key

命令有效版本:1.0.0 之后

时间复杂度:O(1)

返回值:取出的元素或者 nil。

示例:

  • 搭配使用 rpush 和 lpop 就相当于队列。
  • 搭配使用 rpush 和 rpop 就相当于栈。

lindex

获取从左数第 index 位置的元素。

lindex 指的是:list index

语法:lindex key index

命令有效版本:1.0.0 之后

时间复杂度:O(N)

返回值:取出的元素或者 nil。

示例:


linsert

在特定位置插入元素。

语法:linsert key <before | after> pivot element

命令有效版本:2.2.0 之后

时间复杂度:O(N),N 表示列表长度。

返回值:插入后的 list 长度。

示例:

        insert 进行插入时,要根据基准值找到对应的位置,从左往右找,找到第一个符合基准值的位置即可。如有两个4:


llen

获取 list 长度。

语法:llen key

命令有效版本:1.0.0 之后

时间复杂度:O(1)

返回值:list 的长度。

示例:


lrem

根据参数 count 的值,移除列表中与参数 element 相等的元素。

  • count > 0 : 从表头开始向表尾搜索,移除与 element 相等的元素,数量为 count。
  • count < 0 : 从表尾开始向表头搜索,移除与 element 相等的元素,数量为 count的绝对值。
  • count = 0 : 移除表中所有与 element 相等的值。

语法:lrem key count element

命令有效版本:1.0.0 之后

时间复杂度:O(N)

返回值:被移除元素的数量。 列表不存在时返回 0 。

示例:


ltrim

        Redis 的 Ltrim 对一个列表进行修剪(trim),也就是说,让列表只保留 start 和 stop 区间内(闭区间)的元素,不在区间之内的元素都将被直接删除。

语法:ltrim key start stop

命令有效版本:1.0.0 之后

时间复杂度:O(N)

返回值:命令执行成功时,返回 OK。

示例:


lset

通过索引来设置元素的值。当索引参数超出范围,或对一个空列表进行 LSET 时,返回一个错误。

语法:lset key index element

命令有效版本:1.0.0 之后

时间复杂度:O(N)

返回值:操作成功返回 OK,否则返回错误信息。

示例:

  • lindex 可以很好的处理下标越界的情况,直接返回 nil。
  • lset 则会报错,不会像 js 一样,直接在 10 这个下标搞出一个元素。

1.2 阻塞版本命令

blpop 和 brpop 是 lpop 和 rpop 的阻塞版本,和对应非阻塞版本的作用基本一致,除了:

  • 在列表中有元素的情况下,阻塞和非阻塞表现是一致的。但如果列表中没有元素,非阻塞版本会直接返回 nil,但阻塞版本会根据 timeout 阻塞⼀段时间(使用 blpop 和 brpop 时,这里是可以显示设置阻塞时间的,不一定是无休止的等待),期间 Redis 可以执行其他命令(此处的 blpop 和 brpop 看起来好像耗时很长,但实际上并不会对 Redis 服务器产生负面影响),但要求执行该命令的客户端会表现为阻塞状态(如下图所示)。
  • 命令中如果设置了多个键(key),那么会从左向右进行遍历键,一旦有一个键对应的列表中可以弹出元素,命令立即返回。
  • 如果多个客户端同时多一个键执行 pop,则最先执行命令的客户端会得到弹出的元素。

阻塞版本的 blpop 和非阻塞版本 lpop 的区别: 


blpop

lpop 的阻塞版本。

语法:blpop key [key ...] timeout

        此处还可以指定超时时间,单位是秒(Redis 6 中,超时时间允许设定成小数,Redis 5 得是整数)。

命令有效版本:1.0.0 之后

时间复杂度:O(1)

返回值:取出的元素或者 nil。

示例:


brpop

rpop 的阻塞版本。

效果和 brpop 类似,只不过这里是头删。

语法:brpop key [key ...] timeout

命令有效版本:1.0.0 之后

时间复杂度:O(1)

返回值:取出的元素或者 nil。

        blpop 和 brpop 这两个阻塞命令的用途主要就是用来作为 “消息队列”。虽然这两个命令可以在一定程度上满足 “消息队列” 这样的需求,但整体来说,功能还是比较有限。 


1.3 List命令总结和内部编码

下表是List命令的作用和时间复杂度:


内部编码

列表类型的内部编码有两种(旧版本,现在已经不再使用,了解即可):

  • ziplist(压缩列表):当列表的元素个数小于 list-max-ziplist-entries 配置(默认 512 个),同时列表中每个元素的长度都小于 list-max-ziplist-value 配置(默认 64 字节)时,Redis 会选用 ziplist 来作为列表的内部编码实现来减少内存消耗。
  • linkedlist(链表):当列表类型无法满足 ziplist 的条件时,Redis 会使用 linkedlist 作为列表的内部实现。

        现在采用的内部编码都是 quicklist。quicklist 相当于是链表和压缩列表的结合,整体还是一个链表,链表的每个节点是一个压缩列表。每个压缩列表都不让它太大,同时再把多个压缩列表通过链式结构连起来。


1.4 List典型使用场景

1.4.1 消息队列

        如下图所示,Redis 可以使用 lpush + brpop 命令组合实现经典的阻塞式生产者-消费者模型队列,生产者客户端使用 lpush 从列表左侧插入元素,多个消费者客户端使用 brpop 命令阻塞式地从队列中 “争抢” 队首元素。通过多个客户端来保证消费的负载均衡和高可用性。

阻塞消息队列模型:

        brpop 是阻塞操作,当列表为空时,brpop 就会阻塞等待,一直等到其他客户端 push 了元素为止。当新元素到达之后,首先是第一个消费者拿到元素(按照执行 brpop 命令的先后顺序来决定是谁获取到)。第一个消费者拿到元素之后,也就从 brpop 中返回了(相当于这个命令执行完了)。如果第一个消费者还想继续消费,就需要重新执行 brpop,排在最后。此时,再来一个新的元素过来,就是第二个消费者拿到该元素,以此类推。


1.4.2 分频道的消息队列

        如下图所示,Redis 同样使用 lpush + brpop 命令,但通过不同的键模拟频道的概念,不同的消费者可以通过 brpop 不同的键值,实现订阅不同频道的理念。

Redis 分频道阻塞消息队列模型:

        多个列表(channel)/ 频道(topic),这种场景很常见,日常使用的一些程序,比如抖音。有一个通道用来传输短视频数据,还可以有一个通道来传输弹幕,一个通道来传输点赞、转发、收藏数据,一个通道来传输评论数据......弄成多个频道就可以在某种数据发生问题时,不会对其他数据造成影响(解耦合)。


1.4.3 微博 Timeline

        每个用户都有属于自己的 Timeline(微博列表),现需要分页展示文章列表。此时可以考虑使用列表,因为列表不但是有序的,同时支持按照索引范围获取元素。

1. 每篇微博使用哈希结构存储,例如微博中 3 个属性:title、timestamp、content

hmset mblog:1 title xx timestamp 1476536196 content xxxxx
...
hmset mblog:n title xx timestamp 1476536196 content xxxxx

2. 向用户 Timeline 添加微博,user:<uid>:mblogs 作为微博的键

lpush user:1:mblogs mblog:1 mblog:3
...
lpush user:k:mblogs mblog:9

3. 分页获取用户的 Timeline,例如获取用户 1 的前 10 篇微博

keylist = lrange user:1:mblogs 0 9
for key in keylist {hgetall key
}

此方案在实际中可能存在两个问题:

        1 + n 问题。即如果每次分页获取的微博个数较多(不确定当前一页中有多少数据,可能会导致下面的循环次数很多),需要执行多次 hgetall 操作,此时可以考虑使用 pipeline(流水线 / 管道)模式批量提交命令,或者微博不采用哈希类型,而是使用序列化的字符串类型,使用 mget 获取。虽然这里是多个 Redis 命令,但是把这些命令合并成一个网络请求进行通信,这样就大大降低了客户端和服务器之间的交互次数了。

        分裂获取文章时,lrange 在列表两端表现较好,获取列表中间的元素表现较差,此时可以考虑将列表做拆分

选择列表类型时,请参考:

  • 同侧存取(lpush + lpop 或者 rpush + rpop)为栈。
  • 异侧存取(lpush + rpop 或者 rpush + lpop)为队列。

2. Set 集合

        集合类型也是保存多个字符串类型的元素的(可以使用 json 格式让 string 也能存储结构化数据),但和列表类型不同的是,集合中:

  1. 元素之间是无序的。(此处的 “无序” 是和 list 的有序相对应的)
  2. 元素不允许重复,如下图所示。

集合类型:

        一个集合中最多可以存储个元素。Redis 除了支持集合内的增删查改操作,同时还支持多个集合取交集、并集、差集,合理地使用好集合类型,能在实际开发中解决很多问题。

  • list:[1, 2, 3] 和 [2, 1, 3] 是两个不同的 list。
  • set:[1, 2, 3] 和 [2, 1, 3] 是同一个集合。

2.1 Set 集合常见命令

sadd

将一个或者多个元素添加到 set 中。

注意:重复的元素无法添加到 set 中。

语法:sadd key member [member ...]

命令有效版本:1.0.0 之后

时间复杂度:O(1)

返回值:本次添加成功的元素个数。

示例:


smembers

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

语法:smembers key

命令有效版本:1.0.0 之后

时间复杂度:O(N),N 是集合中的元素个数。

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

示例:


sismember

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

语法:sismember key member

命令有效版本:1.0.0 之后

时间复杂度:O(1)

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

示例:


scard

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

语法:scard key

命令有效版本:1.0.0 之后

时间复杂度:O(1)

返回值:set 内的元素个数。


spop

从 set 中删除并返回⼀个或者多个元素。

注意:由于 set 内的元素是无序的,所以取出哪个元素实际是未定义行为,即可以看作随机的。

语法:spop key [count] 

命令有效版本:1.0.0 之后

时间复杂度:O(N),N 是 count

返回值:取出的元素。

示例:


smove

将一个元素从源 set 取出并放入目标 set 中。

语法:smove source destination member 

命令有效版本:1.0.0 之后

时间复杂度:O(1)

返回值:1 表示移动成功,0 表示失败。

示例:

针对上述情况,smove 不会视为出错,也会按照删除、插入来执行。


srem

将指定的元素从 set 中删除。

语法:srem key member [member ...]  

命令有效版本:1.0.0 之后

时间复杂度:O(N),N 是要删除的元素个数.

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

示例:


2.2 Set 集合间命令

交集(inter)、并集(union)、差集(diff)的概念和数学一样,如下图所示:

集合求交集、并集、差集:

sinter

获取给定 set 的交集中的元素。

语法:sinter key [key ...]

命令有效版本:1.0.0 之后

时间复杂度:O(N * M),N 是最小的集合元素个数,M 是最大的集合元素个数。

返回值:交集的元素。

示例:


sinterstore

获取给定 set 的交集中的元素并保存到目标 set 中。

要想知道交集的内容,直接按照集合的方式访问目标 set 这个 key 即可。

语法:sinterstore destination key [key ...] 

命令有效版本:1.0.0 之后

时间复杂度:O(N * M),N 是最小的集合元素个数,M 是最大的集合元素个数。

返回值:交集的元素个数。

示例:


sunion

获取给定 set 的并集中的元素。

语法:sunion  key [key ...]  

命令有效版本:1.0.0 之后

时间复杂度:O(N),N 给定的所有集合的总的元素个数。

返回值:并集的元素。

示例:


sunionstore

获取给定 set 的并集中的元素并保存到目标 set 中。

语法:sunionstore destination key [key ...]

命令有效版本:1.0.0 之后

时间复杂度:O(N),N 给定的所有集合的总的元素个数。

返回值:并集的元素个数。

示例:


sdiff

获取给定 set 的差集中的元素。

语法:sdiff key [key ...]

命令有效版本:1.0.0 之后

时间复杂度:O(N),N 给定的所有集合的总的元素个数。

返回值:差集的元素。

示例:


sdiffstore

获取给定 set 的差集中的元素并保存到⽬标 set 中。

语法:sdiffstore destination key [key ...] 

命令有效版本:1.0.0 之后

时间复杂度:O(N),N 给定的所有集合的总的元素个数.

返回值:差集的元素个数。

示例:


2.3 Set命令小结和内部编码

下表总结了集合类型的常见命令:

Set 集合类型命令:


集合类型的内部编码有两种:

  • intset(整数集合):当集合中的元素都是整数并且元素的个数小于 set-max-intset-entries 配置(默认 512 个)时,Redis 会选用 intset 来作为集合的内部实现,从而减少内存的使⽤。
  • hashtable(哈希表):当集合类型无法满足 intset 的条件时,Redis 会使用 hashtable 作为集合的内部实现。

1. 当元素个数较少并且都为整数时,内部编码为 intset

2. 当元素个数超过 512 个,内部编码为 hashtable。

3. 当存在元素不是整数时,内部编码为 hashtable。


2.4 Set集合使用场景

        场景一:集合类型比较典型的使用场景是标签(tag)。例如 A 用户对娱乐、体育板块比较感兴趣,B 用户对历史、新闻比较感兴趣,这些兴趣点可以被抽象为标签。有了这些数据就可以得到喜欢同一个标签的人,以及用户的共同喜好的标签,这些数据对于增强用户体验和用户黏度都非常有帮助。 例如一个电子商务网站会对不同标签的用户做不同的产品推荐。

下面的演示通过集合类型来实现标签的若干功能。

1. 给用户添加标签:

sadd user:1:tags tag1 tag2 tag5
sadd user:2:tags tag2 tag3 tag5
...
sadd user:k:tags tag1 tag2 tag4

2. 给标签添加用户:

sadd tag1:users user:1 user:3
sadd tag2:users user:1 user:2 user:3
...
sadd tagk:users user:1 user:4 user:9 user:28

3. 删除用户下的标签:

srem user:1:tags tag1 tag5
...

4. 删除标签下的用户:

srem tag1:users user:1
srem tag5:users user:1
...

        场景二:还可以使用 Set 来计算用户之间的共同好友(基于 “集合求交集”),基于此还可以做一些好友推荐。 

        场景三:使用 Set 还能统计 UV(去重)。一个互联网产品如何衡量用户量,用户规模呢?主要的指标是以下两个方面:

  1. PV(Page View),用户每次访问该服务器都会产生一个 pv。
  2. UV(User View),每个用户访问服务器都会产生一个 uv,但是同一个用户多次访问并不会使 uv 增加。uv 需要按照用户进行去重,去重的过程就可以使用 Set 来实现。

本篇完。

下一篇:Redis存储⑥Redis五大数据类型之Zset+渐进式遍历+数据库管理。

相关文章:

Redis存储⑤Redis五大数据类型之 List 和 Set。

目录 1. List 列表 1.1 List 列表常见命令 1.2 阻塞版本命令 1.3 List命令总结和内部编码 1.4 List典型使用场景 1.4.1 消息队列 1.4.2 分频道的消息队列 1.4.3 微博 Timeline 2. Set 集合 2.1 Set 集合常见命令 2.2 Set 集合间命令 2.3 Set命令小结和内部编码 2.…...

MySQL开窗函数种类和使用总结

在 MySQL 中&#xff0c;开窗函数&#xff08;Window Functions&#xff09; 是一种强大的功能&#xff0c;能够在数据分析和聚合时提供灵活的方式。开窗函数在 MySQL 8.0 及以上版本 中引入&#xff0c;可以基于数据的某个分组&#xff08;窗口&#xff09;来执行计算&#xf…...

DeepSeek——DeepSeek模型部署实战

摘要 文章主要介绍了DeepSeek大模型的本地部署方法、使用方式以及API接入相关内容。首先指出可通过下载Ollama来部署DeepSeek-R1模型&#xff0c;并给出了模型不同参数版本及存储信息。接着说明了如何通过Chatbox官网下载并接入DeepSeek API&#xff0c;以及如何接入本地部署模…...

zsh: command not found: pip

当你在终端输入 pip install ipykernel 时出现 zsh: command not found: pip 错误&#xff0c;这表明系统无法找到 pip 命令&#xff0c;下面为你详细分析可能的原因以及对应的解决办法。 可能的原因 Python 未安装&#xff1a;pip 是 Python 的包管理工具&#xff0c;若你的…...

机器学习数学基础:16.方程组

一、方程组基础概念 &#xff08;一&#xff09;定义 方程组是由若干个包含未知数的方程组合而成的集合。例如&#xff0c; { 3 x 2 y − z 7 2 x − y 3 z 5 x 4 y − 2 z 3 \begin{cases}3x 2y - z 7\\2x - y 3z 5\\x 4y - 2z 3\end{cases} ⎩ ⎨ ⎧​3x2y−z7…...

即梦(Dreamina)技术浅析(四):生成对抗网络

即梦(Dreamina) 的生成对抗网络(GAN,Generative Adversarial Network)技术是其核心功能之一,用于生成高质量的图像、文本和视频内容。GAN 是一种深度学习模型,由生成器(Generator)和判别器(Discriminator)两部分组成,通过对抗训练的方式不断提升生成内容的质量。 …...

2025年软件测试五大趋势:AI、API安全、云测试等前沿实践

随着软件开发的不断进步&#xff0c;测试方法也在演变。企业需要紧跟新兴趋势&#xff0c;以提升软件质量、提高测试效率&#xff0c;并确保安全性&#xff0c;在竞争激烈的技术环境中保持领先地位。本文将深入探讨2025年最值得关注的五大软件测试趋势。 Parasoft下载https://…...

Vue混入(Mixins)与插件开发深度解析

Vue混入&#xff08;Mixins&#xff09;与插件开发深度解析 Vue混入&#xff08;Mixins&#xff09;与插件开发深度解析1. Vue混入&#xff08;Mixins&#xff09;核心概念1.1 什么是混入1.1.1 本质定义与技术定位1.1.2 混入与相关概念的对比1.1.3 适用场景分析1.1.4 设计哲学与…...

【C++】C++11

目录 C11简介 统一的列表初始化 {}初始化 std::initializer_list 声明 auto decltype nullptr 范围for循环 智能指针 STL中的一些变化 右值引用和移动语义 左值引用和右值引用 右值引用的意义 完美转发 lambda表达式 新的类功能 可变参数模版 包装器 func…...

k8sollama部署deepseek-R1模型,内网无坑

这是目录 linux下载ollama模型文件下载到本地,打包迁移到k8s等无网络环境使用下载打包ollama镜像非k8s环境使用k8s部署访问方式非ollama运行deepseek模型linux下载ollama 下载后可存放其他服务器 curl -L https://ollama.com/download/ollama-linux-amd64.tgz -o ollama-linu…...

mysql8 C++源码中创建表函数,表字段最大数量限制,表行最大存储限制

在 MySQL 8 的 C 源码中&#xff0c;表的最大字段数量限制体现在 MAX_FIELDS 宏定义中。这个宏定义了表中可以拥有的最大字段数量。 代码中的体现 在 mysql_prepare_create_table 函数中&#xff0c;有以下代码段检查表的字段数量是否超过最大限制&#xff1a; cpp if (alt…...

胜任力冰山模型:深入探索职业能力的多维结构

目录 1、序言 2、什么是胜任力&#xff1f; 3、任职资格和胜任力的区别 4、胜任力冰山模型&#xff1a;职场能力的多维展现 4.1、冰山水面上的部分 4.2、冰山水面下的部分 4.3、深层的个人特质与价值观 5、如何平衡任职资格与胜任能力 6、结语 1、序言 在快速发展的I…...

什么是三层交换技术?与二层有什么区别?

什么是三层交换技术&#xff1f;让你的网络飞起来&#xff01; 一. 什么是三层交换技术&#xff1f;二. 工作原理三. 优点四. 应用场景五. 总结 前言 点个免费的赞和关注&#xff0c;有错误的地方请指出&#xff0c;看个人主页有惊喜。 作者&#xff1a;神的孩子都在歌唱 大家好…...

Linux+Docer 容器化部署之 Shell 语法入门篇 【Shell 替代】

&#x1f380;&#x1f380;Shell语法入门篇 系列篇 &#x1f380;&#x1f380; LinuxDocer 容器化部署之 Shell 语法入门篇 【准备阶段】LinuxDocer 容器化部署之 Shell 语法入门篇 【Shell变量】LinuxDocer 容器化部署之 Shell 语法入门篇 【Shell数组与函数】LinuxDocer 容…...

DeepSeek LLM(初代)阅读报告

概况 这个是deepseek发布的第一版模型对应的技术报告&#xff0c;模型发布于23年11月&#xff0c;本报告发布于24年1月。 模型有7B和67B两个版本。 虽然本报告中还没有用上后面V2/V3和R1中的关键技术例如MLA、MTP、GRPO&#xff0c;但是报告中已经指明了MoE、强化学习等未来…...

JAVA异步的TCP 通讯-服务端

一、服务端代码示例 import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.AsynchronousServerSocketChannel; import java.nio.channels.AsynchronousSocketChannel; import java.nio.channels.Completion…...

高效协同,Tita 助力项目管理场景革新

在当今快节奏、高度竞争的商业环境中&#xff0c;企业面临着前所未有的挑战&#xff1a;如何在有限资源下迅速响应市场变化&#xff0c;确保多个项目的高效执行并达成战略目标&#xff1f;答案就在于优化项目集程管理。而在这个过程中&#xff0c;Tita项目管理产品以其独特的优…...

【AIGC魔童】DeepSeek v3提示词Prompt书写技巧

【AIGC魔童】DeepSeek v3提示词Prompt书写技巧 &#xff08;1&#xff09;基础通用公式&#xff08;适用80%场景&#xff09;&#xff08;2&#xff09;问题解决公式&#xff08;决策支持&#xff09;&#xff08;3&#xff09;创意生成公式&#xff08;4&#xff09;学习提升公…...

Vue | 透传 Attributes(非 prop 的 attribute )

文章目录 引言I Attribute 继承II 禁用 attribute 继承禁用 attribute 继承的常见场景通过将 inheritAttrs 选项设置为 false从 3.3 开始可在 `<script setup>` 中使用defineOptions例子引言 “透传 attribute”指的是传递给一个组件,却没有被该组件声明为 props 或 emi…...

启明星辰发布MAF大模型应用防火墙产品,提升DeepSeek类企业用户安全

2月7日&#xff0c;启明星辰面向DeepSeek等企业级大模型业务服务者提供的安全防护产品——天清MAF&#xff08;Model Application Firewall&#xff09;大模型应用防火墙产品正式发布。 一个新赛道将被开启…… DeepSeek的低成本引爆赛道规模 随着DeepSeek成为当前最热的现象级…...

matlab天线阵列及GUI框架,可用于相控阵,圆形阵,矩形阵

构建天线阵列及GUI框架,可用于相控阵&#xff0c;圆形阵&#xff0c;矩形阵等 array/array.fig , 35384 array/array.m , 15582 array/circ_array.m , 5959 array/circular_array.m , 4238 array/fig8_5.m , 851 array/fig8_53.m , 441 array/fig8_7.m , 847 array/initialize…...

可视化与动画:构建沉浸式Vue应用的进阶实践

在现代Web应用中&#xff0c;高性能可视化和流畅动画已成为提升用户体验的核心要素。本节将深入探索Vue生态中的可视化与动画技术&#xff0c;分享专业级解决方案与最佳实践。 一、 Canvas高性能渲染体系 01、Konva.js流程图引擎深度优化 <template><div class"…...

浏览器之禁止打开控制台【F12】

前言 在有时我们的日常开发工作中&#xff0c;有些项目要求我们增加禁用控制台的要求&#xff0c;这种虽然很鸡肋&#xff0c;但是它确实存在&#xff0c;并且会让哈哈心里觉得很有成就感。 所以今天他来了。 文章目录 前言无限debugger实现思路&#xff1a;效果如下&#xff1…...

湖北理元理律师事务所债务优化实践:在还款与生活间寻找平衡支点

在个人债务规模持续扩大的社会背景下&#xff0c;如何科学管理债务正成为民生焦点。湖北理元理律师事务所通过其服务案例表明&#xff1a;债务优化的本质不是逃避责任&#xff0c;而是建立可持续的还款体系&#xff0c;让债务人保有基本生活尊严。 一、打破“越还越穷”的恶性…...

完整解析 Linux Kdump Crash Kernel 工作原理和实操步骤

完整解析 Linux Kdump Crash Kernel 工作原理和实操步骤 一、前言 在使用 Linux 操作系统进行内核开发或者系统维护时&#xff0c;内核 panic 是最常见的系统崩溃环节。如果想要在内核崩溃后立即分析环境和输出内核内存 dump&#xff0c;Kdump crashkernel 是最接近完美的解…...

(二)开启深度学习动手之旅:先筑牢预备知识根基

1 数据操作 数据操作是深度学习的基础&#xff0c;包括数据的创建、索引、切片、运算等操作。这些操作是后续复杂模型构建和训练的前提。 入门 &#xff1a;理解如何使用NumPy创建数组&#xff0c;这是深度学习中数据存储的基本形式。掌握数组的属性&#xff08;如数据类型dt…...

在 HTML 文件中添加图片的常用方法

本文详解HTML图片插入方法&#xff1a;1&#xff09;通过<img>标签实现&#xff0c;必须含src和alt属性&#xff1b;2&#xff09;路径支持绝对/相对引用&#xff1b;3&#xff09;建议设置width/height保持比例&#xff1b;4&#xff09;响应式方案用srcset适配不同设备…...

【Kubernetes】ubuntu20.04通过kubeadm + Docker安装k8s

Kubernetes v1.24集群安装配置步骤总结 一、环境准备 &#xff08;一&#xff09;系统要求 运行兼容deb/rpm的Linux操作系统&#xff08;如Ubuntu或CentOS&#xff09;的计算机&#xff0c;1台或多台。每台机器内存2GB以上&#xff0c;内存不足会限制应用运行。控制平面节点…...

【深度学习-pytorch篇】1. Pytorch矩阵操作与DataSet创建

Pytorch矩阵操作与DataSet创建 1. Python 环境配置 1.1 安装 Anaconda 推荐使用 Anaconda 来管理 Python 环境&#xff0c;访问官网下载安装&#xff1a; https://www.anaconda.com/download/success 1.2 安装 PyTorch 请根据自己的系统平台&#xff08;Windows/Linux/ma…...

Vue3实现提示文字组件

Vue3 实现一个文字提示组件&#xff08;Tooltip&#xff09; 文字提示&#xff08;Tooltip&#xff09;是前端开发中非常常见的组件&#xff0c;通常用于在用户悬停某个元素时显示额外的信息。 一、需求分析 我们要实现一个 Vue3 的文字提示组件&#xff0c;具备以下功能&…...