辛星浅析Redis中的有序集合

Redis中的有序集合也就是sorted-set,它和set很相似,都是字符串的集合,都不允许重复的成员出现在一个集合张。有序集合与集合的主要差别是有序集合中的每一个元素都有一个序号与其相连,这个序号即score,Redis通过这个序号来为集合中的成员进行从小到大的排列。需要特别说明的是,尽管有序集合的元素值是唯一的,但是该value对应的score却可以是多个。在有序集合中添加、删除、更新一个成员的操作都很快,其时间复杂度是集合中成员的对数。 因为有序集合中的成员在集合中的位置是有序的,即便是访问集合中间部分的成员的效率也很高。

我们可以使用有序集合来设计一个类似于积分排行榜的东西,那么每当用户的积分发生变化时,可以实行zadd命令来更新用户的积分,然后通过zrange来获取积分前若干的用户信息。当然也可以利用zrank命令来通过username来获取用户的排行信息。

下面是有序集合的常见命令:

(1)zadd   集合名    下标1   元素1   [下标2    元素2.....]   它是向有序集合中添加元素,在该命令中我们可以指定多组的下标元素对。如果在添加时参数中的某一成员已经存在,那么该命令将会更新此成员的分数为新值,同时再将该成员基于该新值重新排序。如果集合名不存在,该命令会创建一个新的有序集合,并且将下标元素对插入其中。如果集合名已存在,但是其作为key与之关联的value并不是有序集合,那么将会返回错误信息。该操作的返回值是实际插入的成员数量。

(2)zcard    集合名    该命令会获取有序集合中的成员数量。返回值是有序集合中的成员数量,如果该有序集合不存在,那么返回0.

(3)zcount   集合名  最小下标   最大下标    其中我们可以使用+inf或者-inf,其中+inf表示有序集合中下标的最大值,而-inf则表示有序集合中的最小值。在默认情况下,最小下标和最大下标都是闭区间的,但是我们可以在最小下标或者最大下标中添加一个"("来表示开区间。它返回的是指定下标范围内的元素的数量。

(4)zincrby   集合名    增量    元素名     它可以为指定的有序集合张的指定成员的下标增加一个增量,如果成员不存在,该命令添加该成员并且假设其初始下标为0,伺候在将其下标加上增量。如果集合名不存在,那么该命令将会自动创建该集合,并且添加相应的键值对。它返回的是以字符串形式表示的新下标。

(5)zrange   集合名   起始下标   结束下标  [withscores]     它会返回下标在起始下标与结束下标之间的成员,注意这里的下标是从0开始的,而-1则表示最后一个成员。我们的可选参数withscores表示同时返回每个成员的下标。它表示返回索引在起始下标与结束下标之间的成员列表。

(6)zrangebyscore   集合名  最小下标   最大下标   [withscores ][limit  offset  count]  该命令返回下标在最小下标到最大下表中中的所有成员,它返回的成员按照分数从低到高的顺序返回,如果成员有相同的分数,则按成员的字典顺序返回。可选的limit用于控制返回成员的数量范围。可选的参数offset表示从符合条件的第offset个成员开始返回,同时返回count个成员。

(7)zrank   集合名   元素名      它是该集合中的成员按照下标从低到高的顺序存储,该命令将返回参数中指定成员的位置值,其中0表示参数中指定成员的位置值。

(8)zrem    集合名   元素1   元素2   ..... 该命令移除参数中指定的成员,如果不存在则会被忽略。它返回的是实际被删除的成员数量。

 (9)zrevrange   集合名   起始下标   结束下标 [withscores]     它与zrange基本相同,唯一的差别在于该命令通过反向排序获取指定位置的成员,也就是从高到低的顺序。

(10)zrevrank   集合名    元素     它获取排名的时候是从高到低的顺序来编号的,注意下标最大的顺序为0奥

(11)zscore    集合名   元素       它获取指定集合名中的指定成员的下标

(12)zrevrangebyscore   集合名   最大下标   最小下标  [withscores][limit offset count]     该命令除了排序方式是基于从高到低的下标排序之外,其他的和zrangebyscore相同。

(13)zremrangebyrank   集合名   起始下标   结束下标    它是删除索引位置位于起始下标和结束下标之间的成员,注意起始下标和结束下标都是0-based,也就是0表示分数最低的成员,而-1表示最后一个成员,即分数最高的成员。

(14)zremrangebyscore   集合名    最小下标   最大下标    它是删除分数在最小下标和最大下标之间的所有成员,对于最小下标和最大下标,也可以采用开区间的形式。

基本我们就介绍到这里啦,希望有用。

时间: 2024-12-21 12:46:14

辛星浅析Redis中的有序集合的相关文章

辛星浅析Redis中与key有关的命令

在Redis中,我们还可以直接对key直接操作,下面是我们常用的主要命令: (1)keypattern   它表示获取所有匹配pattern的keys,这里需要注意的是,我们应该避免使用该命令,因为对于大型数据库而言,该命令非常耗时,对Redis服务器的性能打击也是比较大的.它支持glob-style的通配符格式,比如用*表示任意一个或者多个字符,用?表示任意字符,用[xyz]表示方括号中的任意一个字母. (2)del   key ....   它是从数据库中删除参数中指定的keys,如果指定的

辛星浅析Redis中的配置文件

Redis中的主要配置项如下: (1)daemonize  yes     它表示是否在后台运行,如果写成yes,那么在后台运行,如果是no,则表示不在后台运行. (2)pidfile  /var/run/redis.pid 当Redis在后台运行的时候,Redis默认会把pid文件放在/var/run/redis.pid,我们也可以在运行多个Redis服务时,指定不同的pid文件和端口 (3)port    6379    指定Redis运行的端口,默认是6379 (4)127.0.0.1  

辛星浅析Redis中的pub/sub功能

pub/sub功能也就是publish/subscribe功能,也就是发布订阅功能.基于事件的系统中,pub/sub是目前广泛使用的通信模型,它采用事件作为基本的通信机制,提供大规模系统所要求的松散耦合的交互模式:订阅者比如客户端以事件订阅的方式表达出它有兴趣接收的一个事件或一类事件,发布者比如服务器可以将订阅者兴趣的事件随时通知相关订阅者. pub/sub功能可以有三个非耦合: (1)时间非耦合,也就是发布者和订阅者不必同时在线,它们不必同时参与交互. (2)空间非耦合,也就是发布者和订阅者不

辛星浅析Redis中的服务器管理

Redis在设计之初就被定义为可以长时间不间断运行的服务进程,因此大多数系统配置参数都可以在不重新启动的情况下立即生效.即便是当前的持久化模式从AOF切换到RDB也无需重启.在Redis中,我们还有一些和服务器管理相关的命令,我们介绍如下: (1)config    get   parameter    主要用于读取服务器的运行时参数,但是并不是所有的配置参数都可以通过该命令进行读取.其中该命令的参数接受glob风格的模式匹配规则,因此如果参数中包含模式元字符,那么所有匹配的参数都将以key/v

辛星浅析Redis中的主从复制

首先简单介绍下Redis中的复制: (1)同一个master可以同步多个slave. (2)slave同样可以接受其他slaves的连接和同步请求,这样可以有效的分担master的同步压力. (3)master  server是以非阻塞的方式为slaves提供服务的,所以在master-slave同步期间,客户端仍然可以提交查询或修改请求. (4)slave   server同样是以非阻塞的方式完成数据同步.在同步期间,如果有客户端提交查询请求,Redis则返回同步之前的数据. (5)为了分担m

辛星浅析Redis中的字符串类型

字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这就意味着该类型可以接受任何格式的数据,比如图像数据或者json对象等信息,在Redis中字符串类型的value最多可以容纳的数据长度为512M. 我们常用的命令如下: (1)append  key   value   如果该key已经存在,那么append命令会将参数value的值追加到已经存在的value的末尾,如果该key不存在,那么该命令会创建一个新的空字符串,并且把value追加到其末尾. (2)decr

辛星浅析网站中的sitemap

所谓sitemap,通俗来说就是"网站地图",sitemap文件主要包含了网站中的有效连接,它会便于搜索引擎的抓取和收录,如果没有sitemap文件,蜘蛛就需要一个一个的通过我们网站中的超链接来进行抓取.有了sitemap之后,搜索引擎直接读取该文件就可以了,它可以让搜索引擎抓取我们的网页更加有效. 最通用的也是最简单的sitemap形式的文件,就是xml文件,我们在其中列出网站中的网址,以及关于每个网址的一些元数据.这些元数据通常是上次更新的时间.更新的频率.重要程度等等,它可以让搜

辛星浅析Linux中的线程和进程

进程和线程都是由操作系统的程序运行的基本单元,系统利用该单元实现系统对应用的并发性.一个进程至少有一个线程,一个线程也至少属于一个进程.进程和线程的区别在于:线程的划分尺度小于进程,使得多线程程序的并发性更高. 而且进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率.线程在执行过程中与进程还是有区别的.每个独立的线程有一个程序运行的入口.顺序执行序列和程序的出口. 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行,但是操作系统并没有将

辛星浅析git中的submodule

有时候,我们需要将一些通用的部分抽取出来做成一个公共库,它可以给别的工程使用,而公共代码库的版本管理是比较麻烦的.我们可以使用git中的submodule来做到这一点. 1.添加 为当前工程添加submodule,命令格式是:git   submodule   add   仓库地址    路径 在添加完成后,在当前工程路径下会生成一个名为".gitmodules"的文件,它记录了子模块的信息,添加完成之后,将子模块所在的文件夹添加到工程中即可. 2.删除 删除submodule,我们首