Redis set类型 zset类型

set类型

类型介绍

集合类型也是保存多个字符串类型的元素的,但和列表类型不同的是,集合中 1)元素之间是⽆序
的 2)元素不允许重复 ⼀个集合中最多可以存储 个元素。Redis 除了⽀持 集合内的增删查改操作,同时还⽀持多个集合取交集、并集、差集,合理地使⽤好集合类型,能在实际开发中解决很多问题。

与list不同的主要两点:

1.集合的元素是唯一的(不能重复)

2.集合的元素是无序的。

和list相同的是,集合的每个元素也都是string类型,如果要存储结构化数据,可以用json存储。 

sadd /  smembers / sismember

sadd

将⼀个或者多个元素添加到 set 中。注意,重复的元素⽆法添加到 set 中。所以是随机删除。

SADD key member [member ...]

 这里的元素用member来称呼,这样做也是方便区别不同类型的元素,比如hash中就是field。

时间复杂度:O(1)
返回值:本次添加成功的元素个数。

smembers 

获取⼀个 set 中的所有元素,注意,元素间的顺序是⽆序的。
SMEMBERS key
时间复杂度:O(N)
返回值:所有元素的列表。

 sismember

判断⼀个元素在不在 set 中。
SISMEMBER key member
时间复杂度:O(1)
返回值:1 表⽰元素在 set 中。0 表⽰元素不在 set 中或者 key 不存在。

 

scard 

scard

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

SCARD key
时间复杂度:O(1)
返回值:set 内的元素个数。

spop / srandmember

spop

pop一般表示从末尾删除某一元素,但是集合中的元素是无序的,哪有什么 “末尾”? 

从 set 中删除并返回⼀个或者多个元素。注意,由于 set 内的元素是⽆序的,所以取出哪个元素实际是未定义⾏为,这是删除是完全随机的。
Redis在底层实现的时候就是采取了随机数的删除方式。

SPOP key [count]
时间复杂度:O(N), n 是 count
返回值:取出的元素。

srandmember

与spop不同的是,srandmember不会删除,也是完全随机返回一个元素。

srandmember key [count]

 smove / srem

smove

将⼀个元素从源 set 取出并放⼊⽬标 set 中。
SMOVE source destination member

 这个 source  表示要从哪个key中删除元素,destination  表示要将这个删除的元素插入到哪个key中。

时间复杂度:O(1)
返回值:1 表⽰移动成功,0 表⽰失败。

需要注意:是先从 source 删除member,然后再将member插入到destination 中。

如果要移动的元素destination  中已经存在,那么也不会报错,因为集合中元素是唯一的,所以destination  中还是只有一份,并且source  中照样还是会删除member。 

srem

rem就是remove的缩写

将指定的元素从 set 中删除。可以一次性删除多个。
SREM key member [member ...]
时间复杂度:O(N), N 是要删除的元素个数.
返回值:本次操作删除的元素个数。

集合的一些基本概念

以下就介绍一些Redis 交集,并集,差集的操作

sinter / sinterstore

sinter

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

SINTER key [key ...]
时间复杂度:O(N * M), N 是最⼩的集合元素个数. M 是最⼤的集合元素个数.
返回值:交集的元素。

sinterstore 

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

SINTERSTORE destination key [key ...]
时间复杂度:O(N * M), N 是最⼩的集合元素个数. M 是最⼤的集合元素个数.
返回值:交集的元素个数。

 

sunion / sunionstore 

sunion

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

SUNION key [key ...]
时间复杂度:O(N), N 给定的所有集合的总的元素个数.
返回值:并集的元素。

sunionstore

SUNIONSTORE destination key [key ...]
时间复杂度:O(N), N 给定的所有集合的总的元素个数.
返回值:并集的元素个数。

sdiff / sdiffstore 

sdiff

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

SDIFF key [key ...]
时间复杂度:O(N), N 给定的所有集合的总的元素个数.
返回值:差集的元素。

之前求交集和并集,交换两个集合的顺序,结果是一样的,但是求差集这里,交换集合的顺序,求出来的结果是不一样的。 

比如集合A的元素1 2 3 4 集合B的元素 3 4 5 6 ,那么求集合A与集合B的差集结果就是  1 2,反过来求集合B与集合A的差集就是5 6。

sdiffstore 

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

SDIFFSTORE destination key [key ...]
时间复杂度:O(N), N 给定的所有集合的总的元素个数.
返回值:差集的元素个数。

 内部编码

集合类型的内部编码有两种:
intset(整数集合):当集合中的元素都是整数并且元素的个数⼩于 set-max-intset-entries 配置
(默认 512 个)时,Redis 会选⽤ intset 来作为集合的内部实现,从⽽减少内存的使⽤。
hashtable(哈希表):当集合类型⽆法满⾜ intset 的条件时,Redis 会使⽤ hashtable 作为集合
的内部实现。

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

127.0.0.1:6379> sadd setkey 1 2 3 4
(integer) 4
127.0.0.1:6379> object encoding setkey

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

127.0.0.1:6379> sadd setkey 1 2 3 4
(integer) 513
127.0.0.1:6379> object encoding setkey
"hashtable"

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

127.0.0.1:6379> sadd setkey a
(integer) 1
127.0.0.1:6379> object encoding setkey
"hashtable"

set应用场景 

实现标签 

比如用set保存用户的标签 。

 用户画像:分析用户的一些特征,然后进行投其所好。

比如喜欢浏览化妆品 或者裙子这些商品 的用户可以打上女人的标签,喜欢浏览数码产品的可以打上男人的标签等等。

或者还可以基于这些标签,计算两个用户是否有相同的爱好。

计算共同好友

其实跟标签的效果差不多,我们使用qq的时候就经常看到qq会给我们推荐一些用户,说这些用户有多少共同好友。其实也是通过求交集的方式来计算的。

计算UV (用户量)

补充概念:

PV:page view,用户每次访问服务器,就会产生一次PV,多次访问就产生多次。

UV:user view:每一个用户访问服务器,只会产生一次UV,多次访问也只有一次。

用UV的信息就可以用set进行去重,然后求出set的大小就可以得知这个服务器的用户量了。

如果想统计访问量就更简单了,每次访问都会产生一个日志,然后记录这个日志的数量就可以了

一般可以每日将这些数据刷新一次,这样就可以动态了解这个网站的访问量和用户量了。 

zset类型 

类型介绍 

有序集合相对于字符串、列表、哈希、集合来说会有⼀些陌⽣。它保留了集合不能有重复成员的
特点,但与集合不同的是,有序集合中的每个元素都有⼀个唯⼀的浮点类型的分数(score)与之关联,着使得有序集合中的元素是可以维护有序性的,但这个有序不是⽤下标作为排序依据⽽是⽤这个分数。

注意:在有序集合这里,有序指的是升序,而不是顺序,这里的概念与集合那里是不一样的。 

简单对比以下list set zset

zadd / zrange

添加或者更新指定的元素以及关联的分数到 zset 中,分数应该符合 double 类型,+inf/-inf 作为正负极限也是合法的。
ZADD 的相关选项:
XX:仅仅⽤于更新已经存在的元素,不会添加新元素。
NX:仅⽤于添加新元素,不会更新已经存在的元素。
CH:默认情况下,ZADD 返回的是本次添加的元素个数,但指定这个选项之后,就会还包含本次更新的元素的个数。(会影响zadd的返回值)
INCR:此时命令类似 ZINCRBY 的效果,将元素的分数加上指定的分数。此时只能指定⼀个元素和分数,此时返回值就是修改后的key的分数。(会改变zadd的返回值)

ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member...]
时间复杂度:O(log(N))
返回值:本次添加成功的元素个数(默认),有些选项会导致返回值的含义不同。

另外 在Redis5版本中,GT LT 选项是没有的

LT:less than ,只有修改的key的分数 小于原来的,才会修改成功。

GT:greater than,只有当修改的key的分数大于原来的,才会修改成功。

注意:不要把这里的member score当作键值对来看待,在键值对中,是有明确的 角色区分 的,只能通过 键 -> 值 的方式,而不能反过来。但是对于有序集合来说,既可以通过member找到对应的score,也可以通过score匹配对应的member。

zrange

区间查找有序集合中的元素,用法跟lrange类似。

zrange key start stop [withscores]
时间复杂度:O(log(N)+M)
返回值:区间内的元素列表

 下标依旧可以为负数,意义跟以往的一样。

withscores:选择是否要把分数一起显示出来。

zcard / zcount 

zcard

获取⼀个 zset 的基数(cardinality),即 zset 中的元素个数。

ZCARD key
时间复杂度:O(1)
返回值:zset 内的元素个数。

zcount

返回分数在 min 和 max 之间的元素个数,默认情况下,min 和 max 都是包含的,可以通过 ( 排除。 

ZCOUNT key min max
时间复杂度:O(log(N))
返回值:满⾜条件的元素列表个数。

zset的底层实现其实是使用跳表的,一般来说查找满足这个区间的元素,那么时间复杂度不应该是O(N)吗?其实Redis给每个元素都加上了一个 “排行” 也就是它是第几个元素,所以就只需要找到min和max就可以了。

另外,这里的查找都是按照闭区间来查找的,[min,max],如果想要以开区间的方式,那么需要在边界值前加上 ( 。比如

注意这里加括号的方式是不大符合直觉的。

 zrevrange / zrangebyscore

 zrevrange

返回指定区间⾥的元素,分数按照降序。带上 WITHSCORES 可以把分数也返回。

备注:这个命令可能在 6.2.0 之后废弃,并且功能合并到 ZRANGE 中。 

ZREVRANGE key start stop [WITHSCORES]
时间复杂度:O(log(N)+M)
返回值:区间内的元素列表。

这里的start 和stop的顺序和 zrange是一样,只是zrevrange会把结果逆序返回。 

 zrangebyscore

返回分数在 min 和 max 之间的元素,默认情况下,min 和 max 都是包含的,可以通过 ( 排除。
备注:这个命令可能在 6.2.0 之后废弃,并且功能合并到 ZRANGE 中。

ZRANGEBYSCORE key min max [WITHSCORES]
时间复杂度:O(log(N)+M)
返回值:区间内的元素列表。

 zpopmax

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

ZPOPMAX key [count]

 count表示删多少个,默认一个。

命令有效版本:5.0.0 之后,这是Redis5以后加入的。
时间复杂度:O(log(N) * M),M指count的个数。
返回值:分数和元素列表。

如果删除的元素分数是一样的,那么会按照字典序来删。 

另外关于这个时间复杂度这里,我们知道zset是跳表结构的,所以元素都是有序的,又因为删除的元素是最大值,所以为什么不搞一个值来记录尾部,这样删除的时候,查找的时间复杂度不就降为O(1)了吗?确实,但是Redis目前并没有这么做 。

bzpopmax

 bzpopmax

ZPOPMAX 的阻塞版本。 

BZPOPMAX key [key ...] timeout
命令有效版本:5.0.0 之后
时间复杂度:O(log(N))
返回值:元素列表。

timeout就是要等待多少时间,也就是超时时间,单位是 秒,支持小数,比如 0.1s表示 100ms。 

这里的timeout是不能省略的。另外要注意这里的时间复杂度, 虽然bzpopmax可以等待多个key,但是它只会删除最先就绪的那一个key,并且只删除一个。

zpopmin / bzpopmin

 zpopmin

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

ZPOPMIN key [count]
命令有效版本:5.0.0 之后
时间复杂度:O(log(N) * M)
返回值:分数和元素列表。

用法与zpopmax一致。

bzpopmin

 ZPOPMIN 的阻塞版本。

BZPOPMIN key [key ...] timeout
命令有效版本:5.0.0 之后
时间复杂度:O(log(N))
返回值:元素列表。

 zrank / zrevrank / zscore

zrank 

返回指定元素的排名,升序。 

这里的排名其实就是下标,从0开始的。

ZRANK key member
命令有效版本:2.0.0 之后
时间复杂度:O(log(N))
返回值:排名(下标)。

 zrevrank

返回指定元素的排名,降序。  

ZREVRANK key member
命令有效版本:2.0.0 之后
时间复杂度:O(log(N))
返回值:排名。

 zscore

返回指定元素的分数。 

ZSCORE key member
命令有效版本:1.2.0 之后
时间复杂度:O(1)
返回值:分数。

这里zscore的时间复杂度按我们之前的想法应该是O(logN)才对,但是注意这里是O(1),这是因为Redis觉得这个命令应该是高频使用的命令,容易成为性能瓶颈,所以用额外的空间进行了特殊的优化,使其时间复杂度降到了O(1)。 

zrem / zremrangebyrank / zremrangebyscore 

zrem

删除指定的元素。 

 ZREM key member [member ...]
命令有效版本:1.2.0 之后
时间复杂度:O(M*log(N))
返回值:本次操作删除的元素个数。

zremrangebyrank  

按照排序,升序删除指定范围的元素,左闭右闭。 这里不能通过加(的方式表示开区间

ZREMRANGEBYRANK key start stop
命令有效版本:2.0.0 之后
时间复杂度:O(log(N)+M)
返回值:本次操作删除的元素个数。

注意这里的时间复杂度那里是 N + M,而不是 N * M,因为这里的查找只需要查找一次。

zremrangebyscore 

按照分数删除指定范围的元素,左闭右闭。 同理

ZREMRANGEBYSCORE key min max
命令有效版本:1.2.0 之后
时间复杂度:O(log(N)+M)
返回值:本次操作删除的元素个数。

 

zincrby

 zincrby

为指定的元素的关联分数添加指定的分数值。(这个增量可以是浮点数,也可以是负数)

ZINCRBY key increment member
命令有效版本:1.2.0 之后
时间复杂度:O(log(N))
返回值:增加后元素的分数。

zinterstore 

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 是最终结果的有序集合的元素个数.
返回值:⽬标集合中的元素个数

关于这里的时间复杂度,看似很复杂,其实不用特别记忆

 关于命令部分:

destination ,我们将求完交集的结果会放入到这个key中。 

numkeys 参数表示我们要传入多少个key,如果要传入两个key,那么就填入2

[WEIGHTS weight [weight ...]]  这里表示权重,比如我们之前传入了两个key,key1 key2 ,我们可以按照一定的比重来计算分数,比如key1的元素分数只想占40%,key2的想占60%,那么这里就可以传入 WEIGHTS 0.4 0.6 。当然也可以传入大于1的数,不一定表示比重。

[AGGREGATE <SUM | MIN | MAX>] 这里表示对交集元素的分数怎么处理,sum表示将交集的元素相加,min表示取最小值,max取最大值。

使用示例:

可以看见,求交集默认是将元素的分数相加。然后我们还给了权重,将key1的元素的分数 * 2,将key2的元素的分数 * 3。 

zunionstore 

求出给定有序集合中元素的并集并保存进⽬标有序集合中,在合并过程中以元素为单位进⾏合并,元素对应的分数按照不同的聚合⽅式和权重得到新的分数。

ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight[weight ...]] [AGGREGATE <SUM | MIN | MAX>]
命令有效版本:2.0.0 之后
时间复杂度:O(N)+O(M*log(M)) N 是输⼊的有序集合总的元素个数; M 是最终结果的有序集合的元素个数.
返回值:⽬标集合中的元素个数

这里的用法和细节跟zinterstore是一样的。 

命令小结:

 zset的内部编码

有序集合类型的内部编码有两种:
ziplist(压缩列表):当有序集合的元素个数⼩于 zset-max-ziplist-entries 配置(默认 128 个),
同时每个元素的值都⼩于 zset-max-ziplist-value 配置(默认 64 字节)时,Redis 会⽤ ziplist 来作
为有序集合的内部实现,ziplist 可以有效减少内存的使⽤。
skiplist(跳表):当 ziplist 条件不满⾜时,有序集合会使⽤ skiplist 作为内部实现,因为此时
ziplist 的操作效率会下降。

另外跳表还比较适合范围查询。 

 

zset应用场景 

排行榜系统

有序集合⽐较典型的使⽤场景就是排⾏榜系统。例如常⻅的⽹站上的热榜信息,榜单的维度可能
是多⽅⾯的。
有比较简单的,比如某些游戏,按分数来指定一个天梯排行榜,它就可以只用userid 和 score。

 

复杂一点的,比如微博的热度排行榜。

 

 

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

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

相关文章

gaussdb hccdp认证模拟题(单选)

1.在GaussDB逻辑架构中&#xff0c;由以下选项中的哪一个组件来负责提供集群日常运维、配置管理的管理接口、工具&#xff1f;(1 分) A. CN B. DN C. GTM D. OM --D 2.在以下命令中&#xff0c;使用以下哪一个选项中的命令可以以自定义归档形式导出表t1的定义&#xf…

WPF中的内容控件

控件分类 在第一篇文章.Net Core和WPF介绍中的WPF的功能和特性部分根据功能性介绍了WPF的控件 名称。 在接下来的文章中&#xff0c;将会详细的介绍各个控件的概念及使用。 主要包括&#xff1a; 内容控件&#xff1a;Label、Button、CheckBox、ToggleButton、RadioButton、…

C++进阶——哈希

1.哈希的概念以及介绍 哈希结构是一种可以不经过任何比较&#xff0c;一次直接从表中得到要搜索的元素的数据结构。 如果构造一种存储结构&#xff0c;通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立 一一映射关系&#xff0c;那么在查找时通过该函数可以很…

基于SpringBoot项目评审系统【附源码】

基于SpringBoot项目评审系统 效果如下&#xff1a; 系统首页界面 学生登录界面 项目信息页面 项目申报页面 专家注册界面 管理员登录界面 管理员功能界面 项目评审界面 评审结果界面 研究背景 在当今快速发展的信息时代&#xff0c;项目评审作为项目管理的关键环节&#xff…

vue2集成vuex实现网站统一数据管理

文章目录 前言安装配置过程1、安装vuex依赖2、在src目录下创建store文件夹&#xff0c;创建模块site.jsgetters.jsindex.js 3、在man.js中添加vuex vuex实战&#xff1a;存储与获取网站基础数据何时去存储数据&#xff1f;&#xff08;路由前置获取数据&#xff09;如何取数据&…

高校新生报道管理系统使用SpringBootSSM框架开发

&#xff01;&#xff01;&#xff01;页面底部,文章结尾,加我好友,获取计算机毕设开发资料 目录 一、引言 二、相关技术介绍 三、系统需求分析 四、系统设计 五、关键技术实现 六、测试与优化 七、总结与展望 一、引言 当前高校新生报到过程中存在许多问题&#xff0c;…

RISC-V笔记——基础

1. 前言 RISC-V旨在支持广泛的定制和专业化。RISC-V的ISA是由一个基本整型ISA和其它对基本ISA的可选扩展组成。每个整型ISA可以使用一个或多个可选的ISA扩展进行扩展。 基本整型ISA精选了最小的一组指令&#xff0c;这些指令足以为编译器、汇编器、链接器和操作系统提供足够的…

如何解决与kernel32.dll相关的常见错误:详细指南解析kernel32.dll文件缺失、损坏或错误加载问题

当你的电脑中出现错误kernel32.dll丢失的问题&#xff0c;会导致电脑不能出现正常运行&#xff0c;希望能够有效的帮助你有效的将丢失的kernel32.dll文件进行修复同时也给大家介绍一些关于kernel32.dll文件的相关介绍&#xff0c;希望能够有效的帮助你快速修复错误。 kernel32.…

鸿蒙HarmonyOS中Image图片组件以及HarmonyOs图标库完全解析

Image 图片组件&#xff0c;支持本地图片和网络图片的渲染展示。 一 、加载网络图片 1 、需要在 src/main/module.json5 中申请网络权限 "requestPermissions": [ { "name": "ohos.permission.INTERNET" } ] 详情参考&#xff1a; https://d…

基于Es的分词查询通过高亮效果实现前端高亮显示!!!!

引言&#xff1a; 经常我们在浏览器界面搜索关键词的时候&#xff0c;浏览器返回给我们的页面都是高亮显示关键词的效果&#xff0c; 如下&#xff1a; 我们要简单实现这个效果很简单&#xff0c;可以通过多种办法&#xff0c;这里通过Es 的高亮效果实现给我们关键字字段加自…

【计网】【计网】从零开始学习http协议 ---理解http重定向和请求方法

去光荣地受伤&#xff0c; 去勇敢地痊愈自己。 --- 简嫃 《水问》--- 从零开始学习http协议 1 知识回顾2 认识网络重定向3 http请求方法3.1 http常见请求方法3.2 postman工具进行请求3.3 处理GET和POST参数 1 知识回顾 前面两篇文章中我们学习并实现了http协议下的请求与应…

星融元P4交换机:在全球芯片短缺中,为您的网络可编程之路保驾护航

当数字化转型成为新常态&#xff0c;云计算、物联网、5G和人工智能等技术正以惊人的速度进步&#xff0c;重塑了我们对网络设备性能和适应性的预期。在这场技术革新的浪潮中&#xff0c;网络的灵活性、开放性和编程能力成为了推动行业发展的关键。P4可编程交换机&#xff0c;以…

计算机毕业设计 校内跑腿业务系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

机器学习——多模态学习

多模态学习&#xff1a;机器学习领域的新视野 引言 多模态学习&#xff08;Multimodal Learning&#xff09;是机器学习中的一个前沿领域&#xff0c;它涉及处理和整合来自多个数据模式&#xff08;如图像、文本、音频等&#xff09;的信息。随着深度学习的蓬勃发展&#xff0…

RAG文本拆分深入研究

在这里&#xff0c;我们将尝试全面深入地掌握成功实施 RAG 所必需的不同主题。以下是示例 RAG 架构。 NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语…

docker简述

1.安装dockers&#xff0c;配置docker软件仓库 安装&#xff0c;可能需要开代理&#xff0c;这里我提前使用了下好的包安装 启动docker systemctl enable --now docker查看是否安装成功 2.简单命令 拉取镜像&#xff0c;也可以提前下载使用以下命令上传 docker load -i imag…

单片机闪存,闪存缓冲取,闪存延迟

一、启用闪存预取缓冲区&#xff08;FLASH_PrefetchBufferCmd (FLASH_PrefetchBuffer_Enable);&#xff09; 闪存预取缓冲区的作用&#xff1a; 在微控制器中&#xff0c;闪存是用于存储程序代码和常量数据的非易失性存储器。当微控制器执行程序时&#xff0c;需要从闪存中读取…

62 加密算法

62 加密算法 三种加密算法分类&#xff1a; 对称加密&#xff1a;密钥只有一个&#xff0c;解密、解密都是这个密码&#xff0c;加解密速度快&#xff0c;典型的对称加密有DES、AES、RC4等非对称加密&#xff1a;密钥成对出现&#xff0c;分别为公钥和私钥&#xff0c;从公钥…

单细胞转录组 —— simpleaf 原始数据处理

单细胞转录组 —— 原始数据处理实战&#xff08;simpleaf&#xff09; 前言 Alevin-fry 是一个快速、准确且内存节约的单细胞和单核数据处理工具。 Simpleaf 是用 Rust 编写的程序&#xff0c;它提供了一个统一且简化的界面&#xff0c;用于通过 alevin-fry 流程处理一些最…

实现std::sort,replace,fill,accumulate,equal等函数

std::sort /// <summary>/// std::sort 是从小到大排列的/// </summary>/// <typeparam name"IteratorClass"></typeparam>/// <typeparam name"ComparingFunctions"></typeparam>/// <param name"itBegin&qu…