NoSQL-Redis

记录Redis的使用要点以及在Java中如何使用Jedis进行调用


NoSQL

NoSQL的意思是是Not only SQL,它是非关系型数据库,往往不用满足ACID原则。在分布式和高并发的网络大环境下,NoSQL往往在CAP原则中根据自己的定位做出抉择。传统Oracle数据库选择的是CA来满足ACID,而大多数网站架构选择AP来保证网站可访问,而Redis,Mongodb等数据库选择的则是CP。现在的web实时系统都不要求强一致性,这时就演化出一个叫BASE的概念。

CAP原则: Consistency(一致性)、Availability(可用性)、Partition tolerance(分区容错性)。

BASE理论: Basically Available(基本可用)、Soft state(软状态)、Eventually consistent(最终一致性)

Redis

不同于传统数据库的表状结构,Redis使用的时K-V键值对。传统数据库的结构像是列出一个对象该有的属性,然后将这些对象放进表中。而Redis像是将一件一件分到最小的单位放入数据库中,再合并起来作为一个单位。基本上就是表格和JSON字段的区别。将表格转换成JSON字段很简单,但反过来就比较困难。传统SQL数据更加规范,整齐,而NoSQL(包括Redis)往往更加灵活,修改数据结构也方便。

Redis在内存中运行,所以关闭应用后数据会丢失。也可以做持久化操作,若开启此功能,redis会保存备份在硬盘上,再启动时会从硬盘中恢复。因为在内存中运行,Redis的读写操作都很快,所以为了减轻主库(例如MySQL、Oracle)的压力,会将Redis作为缓存中心使用(当然它也可以干缓存以外的事情)。由于内存空间有限,一般会给Redis中的数据设置时限。

Redis主从复制

单机Redis满足的是CP原则,而实际生产中往往高可用更加重要。这时候若启用主从复制模式可以提高其可用性,当主节点不可达(在进行写操作或者有过多的读操作)时,仍可访问作为后备的从节点,主从节点不用时刻保持一致,但要保证最终一致性。Redis集群满足的是AP原则,主从复制会造成一定的数据延迟。

命令模板 意义
SLAVEOF host port 将当前服务器转变为指定服务器的从属服务器slave
ROLE 返回实例在复制中担任的角色, 这个角色可以是 masterslave 或者 sentinel

如果当前服务器已经是某个主服务器(master server)的从属服务器,那么执行 SLAVEOF host port 将使当前服务器停止对旧主服务器的同步,丢弃旧数据集,转而开始对新主服务器进行同步。

另外,对一个从属服务器执行命令 SLAVEOF NO ONE 将使得这个从属服务器关闭复制功能,并从从属服务器转变回主服务器,原来同步所得的数据集不会被丢弃。

ROLE指令除了角色之外, 命令还会以数组形式返回与该角色相关的其他信息, 其中:

  • 主服务器将返回属下从服务器的 IP 地址和端口。
  • 从服务器将返回自己正在复制的主服务器的 IP 地址、端口、连接状态以及复制偏移量。
  • Sentinel 将返回自己正在监视的主服务器列表。

主从复制的原理

  • 全量复制:每次进行SLAVEOF主库时都会进行,会复制主库的所有数据

  • 增量复制:全量复制完成后,复制主库进行的写操作

  • 当主库下线后,从库会也变成下线状态,如果没有哨兵,则要进行手动恢复

  • 连接过多的从库会给主库带来较大的压力,可以使用去中心化的方式减轻主库的压力。如果不考虑主库压力过大而导致卡顿的情况,去中心化会使数据延迟更厉害,但不去的化往往主库就可能宕机了。

      graph RL
    r2(redis02) -->|SLAVEOF|r1(redis01)
    r1(redis01) -->|SLAVEOF|r0(redis00)
    
    s1(slave01) -->|SLAVEOF|s0(slave00)
    s0(slave00) -->|SLAVEOF|m(masters)

哨兵模式

当哨兵检测到主节点无法连通时,会判断其主观下线,当足够数量的哨兵检测到主节点无法连通时,会将主节点判断为主观下线。之后会投票选出一个领头哨兵做恢复工作。领头哨兵选出新主库的依据是:

  1. 所有在线从库,选择优先级最高的从库,优先级通过配置文件的slave-priority来设置。
  2. 当多个从库优先级都一样且最高,则复制的偏移量越大,即增量复制时保存的数据相对约完整的,越优先。
  3. 以上条件都一样,则选择运行id最小的从库作为新的主库。

之后使用SLAVEOF NO ONE来将该从库变成主库,其他从库再SLAVEOF 新主库,同时会更新sentinel.conf,其他哨兵以消息订阅的方式更新配置。当原来的主节点恢复后,它会变成新主库的从库。

Redis数据淘汰策略

Redis在内存空间中运行,而内存空间往往时极为有限的,即使我们为数据设置了过期时间,内存也有可能会被塞满。这时候就需要淘汰策略Maxmemory-policy淘汰掉部分数据,redis给出了6种淘汰策略:

  1. volatile-lru: 在expire集合中使用LRU算法移除key
  2. allkeys-lru: 使用LRU算法移除key
  3. volatile-random: 在expire集合中随机移除key
  4. allkeys-random: 随机移除key
  5. volatile-ttl: 移除最接近过期的key
  6. noeviction: 默认设置,不做任何操作,只是遇到写操作时返回错误

expire集合也称过期集合,并不是说集合内的key已过期,而是设置了timeoutkey会放置在这个集合里面,已过期的key会自动清除,无须淘汰。所以volatile的策略都不会淘汰没有设置timeoutkey,这些key在1、3、5、6的策略下永不过期。

LRUTTL淘汰策略并不会遍历所有的key,而是随机找部分数据出来做淘汰,这些随机找出来的数据称为样本Maxmemory-samples,默认样本数量为5,即随机找5个数据出来做LRU(TTL)淘汰算法。样本数量越大,淘汰策略的效果就越接近于完整的LRU(TTL)算法,但是会使用更多CPU资源。

Maxmemory-policy以及Maxmemory-samples都可以在redis.conf里修改

常用命令

命令模板 意义
PING 测试Redis连通性,若连通返回PONG
SELECT index 选择使用下标为index的库,默认会开0-15共16个库
KEYS pattern 匹配样式为pattern的键,若要匹配所有键,则输入*
EXISTS key [key …] 返回存在的key的数量
TYPE key 返回key的种类
DEL key [key …] 删除key
RENAME key newkey 如果newkey已存在将会被覆盖
RENAMENX key newkey 只有newkey不存在时才会被执行
MOVE key db key移动到数据库db
RANDOMKEY key 从数据库中随机返回(不移除)一个key
DBSIZE 返回当前数据库的key的数量
FLUSHDB 删除当前数据库所有key
FLUSHALL 删除所有数据库所有key
SWAPDB db1 db2 对换数据库db1db2
SAVE 保存,会阻塞数据库
BGSAVE 异步保存,不会阻塞
LASTSAVE 返回上次保存的时间,以UNIX时间戳的形式

支持的pattern类型:

  • KEYS * 匹配数据库中所有 key
  • KEYS h?llo 匹配 hellohallohxllo 等。
  • KEYS h*llo 匹配 hlloheeeeello 等。
  • KEYS h[ae]llo 匹配 hellohallo ,但不匹配 hillo

SCAN

命令模板 意义
SCAN cursor [MATCH pattern] [COUNT count] 迭代当前数据库中的数据库键

当库中键的数量很大时,使用KEYS来搜索所有的键可能会阻塞服务器几秒之久,这时可以使用SCAN命令来代替

每次迭代都会返回一个新的游标cursor作为下一次迭代的参数,第一次迭代游标为0,而当返回的游标为0时代表迭代结束

使用count可以指定每次迭代返回元素的最大值,但不能指定具体数量

每次迭代返回的数量不固定,有可能是空集,但是游标一定会变

不同迭代返回的元素可能重复,需要应用程序自行处理

SSCANHSCANZSCANSCAN类似,只不过要多一个参数在游标之前指代要扫描哪个集合、哈希表或有序集合

SORT

命令模板 意义
SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern …]] [ASC | DESC] [ALPHA] [STORE destination] 返回或保存给定列表、集合、有序集合 key 中经过排序的元素

默认从小到大排,加上DESC后从大到小排

默认排序以数字为对象,加上ALPHA后对字符串排序

LIMIT可以限制返回结果

通过使用 BY 选项,可以让 key 按其他键的元素来排序

使用 GET 选项, 可以根据排序的结果来取出相应的键值

通过将一个不存在的键作为参数传给 BY 选项, 可以让 SORT 跳过排序操作,直接返回外部键

通过给 STORE 选项指定一个 destination 参数,可以将排序结果保存到给定的键上


过期

当一个key过期后,它就会自动被清除,检测过期的key有两种方法:

  • 当这个key被访问时,发现它过期了
  • Redis每10秒做一次检查
    1. 测试随机的20个key进行过期检测
    2. 删除所有已过期的key
    3. 若超过25%的key过期,则重复步骤1

从库不会主动移除过期的key,为了保证从库和主库的一致性,只有主库执行了DEL来删除过期的key之后从库才会去删除这个key

在 Redis 2.4 及以前版本,过期期时间可能不是十分准确,有0-1秒的误差。

从 Redis 2.6 起,过期时间误差缩小到0-1毫秒。

EXPIRE

命令模板 意义
EXPIRE key seconds 设置生存时长为seconds

如果不是DEL,或者用SETGETSET来覆盖原来的键,只是修改键里的值,不会改变生存时间。即修改集合、哈希表、列表和有序集合的成员或元素不会影响这个集合或这个表的生成时间。

RENAME会让把生存时间传递给新的key,换名字不影响生存时间

EXPIREAT

命令模板 意义
EXPIREAT key timestamp 设置过期时间,timestamp为UNIX时间戳

EXPIRE设置的是多久后过期,而EXPIREAT设置的是什么时候过期

如要使用毫秒为单位而不是秒,则使用PEXPIREAT

TTL

命令模板 意义
TTL key 获取key的剩余生存时间

TTL以秒为单位,若要获取毫秒级的结果可以使用PTTL

PERSIST

命令模板 意义
PERSIST key 移除key的生成时间,设为永不过期

事务

命令模板 意义
MULTI 标记事务的开始
EXEC 开始执行事务,若监视的key发送改变,则返回nil,执行失败
DISCARD 取消事务,同时执行UNWATCH
WATCH key [key …] 监视某个key,若在EXEC之前key被改动,则打断这次事务
UNWATCH 取消对所有key的监视

事务的执行会保证其在不被打断的情况下按顺序的执行,但是不保证其原子性,即部分命令失败后其他命令仍会正常执行。但也不是绝对的,一些在执行前就能发现的错误会导致整个事务无法执行,例如你打错了命令的字母或者输入的参数数量不正确之类的(如SET K1后面不跟键值)。类似于编译期错误导致项目无法编译,自然也无法执行,而运行时错误只是错误那里不执行而已。


持久化

Redis有两种文件用于做持久化操作

  • RDB(Redis DataBase):默认文件名为dump.rdb,保存的路径因版本而异,有些会保存在启动redis时所在的目录下,而我是保存在/var/lib/redis/里面,具体在哪看redis.conf
    • 原理:当对key的操作满足保存要求(例如在5分钟内修改了10个key以上)或者手动的SAVEBGSAVESHUTDOWN,会触发保存操作,这时如果是后台保存,就会fork一个进程来进行保存,如果不是,则阻塞redis来进行保存。默认保存会使用LZF进行压缩,压缩之后会进行校验,这些操作都会损耗一部分性能,但有利于保证数据一致性。
    • 优点:恢复简单,持久化文件小
    • 缺点:可能会丢失最后一次保存的数据(例如保存到一半宕机了)
  • AOF(Append Only File):与RDB不同,RDB保存的是数据库的内容,而AOF保存的是写操作的日志记录,恢复时是按照写操作重新执行一遍。
    • 原理:将写操作日志逐行保留下来,日志文件不断积压膨胀,到达一定大小后会压缩日志文件,压缩时新建一个临时文件存压缩后的日志。触发压缩的条件默认为超过上一次压缩的大小且大于64md。保存方式有每写一条指令保存一次、每一秒保存一次,或者只能手动保存。默认为每秒保存一次,这样对CPU的负荷也比较小。
    • 优点:最多损失一秒的日志记录
    • 缺点:日志文件大,恢复效率低(把之前的写操作重复一遍)

实际生存中往往两种同时使用,主要先使用AOF来做持久化,万一AOF崩了之后起码还有RDB保底。当然还会有各种主从库和集群来保护数据。一般而言只有主从库全部崩了才会用AOF来恢复,AOF也崩了再用RDB来修复。

AOF和RDB文件损坏后可以先使用redis-check-aofredis-check-rdb来修复,再不行也可以用别的方法。修复的例子为redis-check-aof --fix filename.aof


字符串

下面的命令是字符串类型使用的命令,其他类型如哈希表和列表之类的使用以下命令会返回错误。

SET

命令模板 意义
SET key value 设置key的值value,未有此key会创建,已有会覆盖
SET key [value] EX seconds 设置key的过期时间为seconds秒,等同于SETEX
SET key [value] PX milliseconds 设置key的过期时间为milliseconds毫秒PSETEX
SET key value NX 设置key的值,但只有key不存在时才会操作,不会覆盖原有的键,等同于SETNX
SET key value XX 设置key的值,但只有key存在时才会操作,不会创建新的键

在 Redis 2.6.12 版本以前, SET 命令总是返回 OK

从 Redis 2.6.12 版本开始, SET 命令只在设置操作成功完成时才返回 OK ; 如果命令使用了 NX 或者 XX 选项, 但是因为条件没达到而造成设置操作未执行, 那么命令将返回空批量回复(NULL Bulk Reply)。

GET

命令模板 意义
GET key 获得键为key的字符串值,若不存在则返回nil

GETSET

命令模板 意义
GETSET key value 获得键为key的字符串值,并在之后设置其值为value

STRLEN

命令模板 意义
STRLEN key 获得键为key的字符串值的长度

APPEND

命令模板 意义
APPEND key value 在键为key的字符串后面追加value,并返回追加后字符串的长度

key不存在,则会创建一个key

SETRANGE

命令模板 意义
SETRANGE key offset value 从偏移量 offset 开始, 用 value 参数覆写(overwrite)键 key 储存的字符串值。

若偏移量大于原字符串长度,那么原字符和偏移量之间的空白将用零字节(zerobytes, "\x00" )进行填充。

GETRANGE

命令模板 意义
GETRANGE key start end 获得key的字符串值的start-end之间的片段

GETRANGE命令在Redis2.0之前叫SUBSTR

偏移量可以使用负数来代表倒数第几个

INCR

命令模板 意义
INCR key 为键key的数字加一

如果键 key 不存在, 那么它的值会先被初始化为 0 , 然后再执行 INCR命令。

如果键 key 储存的值不能被解释为数字, 那么 INCR 命令将返回一个错误。

INCRBY

命令模板 意义
INCRBY key increment 为键key的数字加上increment

INCRBYFLOAT

命令模板 意义
INCRBYFLOAT key increment 为键 key 储存的值加上浮点数增量 increment

无论加法计算所得的浮点数的实际精度有多长, INCRBYFLOAT 命令的计算结果最多只保留小数点的后十七位。

当键 key 当前的值或者给定的增量 increment 不能被解释(parse)为双精度浮点数返回错误。

DECR

命令模板 意义
DECR key 为键key的数字减一

DECRBY

命令模板 意义
DECRBY key decrement 将键 key 储存的整数值减去减量 decrement

MSET

命令模板 意义
MSET key value [key value …] 同时为多个键设置值

MSETNX

命令模板 意义
MSETNX key value [key value …] 当且仅当所有给定键都不存在时, 为所有给定键设置值

即使只有一个给定键已经存在, MSETNX 命令也会拒绝执行对所有键的设置操作。

MSETNX 是一个原子性(atomic)操作, 所有给定键要么就全部都被设置, 要么就全部都不设置, 不可能出现第三种状态。

MGET

命令模板 意义
MGET key [key …] 返回给定的一个或多个字符串键的值

哈希表

对哈希表外的操作返回错误

当哈希表为空时自动删除该哈希表

HSET

命令模板 意义
HSET hash field value 将哈希表 hash 中域 field 的值设置为 value

hash中已存在field,则会覆盖旧值返回0,若不存在field,则会创建并返回1

HSETNX

命令模板 意义
HSETNX hash field value 当且仅当域 field 尚未存在于哈希表的情况下, 将它的值设置为 value

HSETNX 命令在设置成功时返回 1 , 在给定域已经存在而放弃执行设置操作时返回 0

HGET

命令模板 意义
HGET hash field 返回哈希表中给定域的值

HEXISTS

命令模板 意义
HEXISTS hash field 检查给定域 field 是否存在于哈希表 hash 当中,返回0和1

HDEL

命令模板 意义
HDEL hash field [field …] 删除哈希表hash中的一个或多个field指定的域

使用DEL hash会删掉整个哈希表hash

HLEN

命令模板 意义
HLEN hash 返回哈希表hash中域的数量,hash不存在时返回0

HSTRLEN

命令模板 意义
HSTRLEN hash field 返回哈希表hashfield域的字符串值的长度

HINCRBY

命令模板 意义
HINCRBY hash field increment 为哈希表 hash 中的域 field 的值加上增量 increment

HINCRBYFLOAT

命令模板 意义
HINCRBYFLOAT hash field increment 为哈希表 hash 中的域 field 加上浮点数增量 increment

HMSET

命令模板 意义
HMSET hash field value [field value …] 同时将多个 field-value (域-值)对设置到哈希表 hash 中。

HMGET

命令模板 意义
HMGET hash field [field …] 返回哈希表 hash 中,一个或多个给定域的值。

HKEYS

命令模板 意义
HKEYS hash 返回哈希表hash中所有域

HVALS

命令模板 意义
HVALS hash 返回哈希表hash中所有域的值

HGETALL

命令模板 意义
HGETALL hash 返回哈希表hash所有域和值

列表

同样对列表外的类型操作会返回错误

当列表为空时会自动删除列表

LPUSH

命令模板 意义
LPUSH list value [value…] 将一个或多个值value插入到列表list表头

例如list中原有[a,b],执行LPUSH list c d e之后会变成[e,d,c,a,b]

list不存在时会创建一个新的list

返回列表长度

LPUSHX

命令模板 意义
LPUSHX list value 将值 value 插入到列表 list 表头,当且仅当 key 存在并且是一个列表。

list不存在时什么也不做

返回列表长度

RPUSH

命令模板 意义
RPUSH list value [value…] 将一个或多个值value插入到列表list表尾

例如list中原有[a,b],执行RPUSH list c d e之后会变成[a,b,c,d,e]

list不存在时会创建一个新的list

返回列表长度

RPUSHX

命令模板 意义
RPUSHX list value 将值 value 插入到列表 list 表尾,当且仅当 key 存在并且是一个列表。

list不存在时什么也不做

返回列表长度

LPOP

命令模板 意义
LPOP list 移除并返回列表list的头元素

RPOP

命令模板 意义
RPOP list 移除并返回列表list的尾元素

RPOPLPUSH

命令模板 意义
RPOPLPUSH source destination 在一个原子时间内,将列表source的尾元素弹出,插入到列表destination的头部,并返回该元素

设:

​ source: [a,b,c]

​ destination: [x,y,z]

执行后:

​ source: [a,b]

​ destination: [c,x,y,z]

source不存在返回nil且不做其他动作

destination不存在则创建

source=destination,即将尾部元素插入投头部并返回该元素

该命令用于保证RPOP后能马上执行LPUSH,若分开执行在某些情况下是不安全的

LREM

命令模板 意义
LREM list count value 移除列表list中值为value的元素,移除数量取决于count
  • count > 0: 移除count个与value相同的元素
  • count = 0: 移除所有value相同的元素
  • count < 0: 移除count个与value相同的元素

返回移除的元素的数量,list不存在返回0

LLEN

命令模板 意义
LLEN list 返回列表list的长度

LINDEX

命令模板 意义
LINDEX list index 返回列表list中下标为index的元素,支持负数,超出范围返回nil

LINSERT

命令模板 意义
LINSERT list BEFORE|AFTER pivot value 将值value插入到列表list中值为pivot的元素之前或之后

搜索pivolt时从头向尾(从左往右)找

LSET

命令模板 意义
LSET list index value 将列表list中下标为index的元素设置为value

index超出范围则返回错误

LRANGE

命令模板 意义
LRANGE list start stop 返回列表liststartstop之间的元素

start和stop是偏移量,而不是元素值

记最大下标(即LLEN list-1)为end

start>end,则返回空列表

stop>end,则将stop设置为end,即对一个长度为15的列表做LRANGE list 0 20会被设置成LRANGE list 0 14

start>stop,则也返回空

LTRIM

命令模板 意义
LTRIM list start stop 裁剪列表list,只保留startstop之间的元素

类似于将LRANGE命令获得的元素保留下来,其他删掉,若LRANGE返回空值即全部删除

类似于:list = LRANGE list start stop(这并不是一条命令,不能执行)

当执行成功时只返回OK

BLPOP

LPOP的阻塞版本

命令模板 意义
BLPOP list [list] timeout 弹出多个list中第一个非空列表的头元素

若存在一个list非空,则弹出第一个非空list的头元素,返回值包括列表名和头元素

若所有list为空,则会阻塞timeout秒,等待别的客户端给任意一个list存值,若期间有值存入则弹出头元素并返回列表名、头元素以及等待时间,若没有,则超时,返回nil以及等待时间

timeout0时不做阻塞

若没有发生阻塞(一开始就存在非空列表或timeout0)则不会有等待时间

BRPOP

RPOP的阻塞版本

命令模板 意义
BRPOP list [list] timeout 弹出多个list中第一个非空列表的尾元素

BLPOP类似,只不过一个是头元素,一个是尾元素

BRPOPLPUSH

RPOPLPUSH的阻塞版本

命令模板 意义
BRPOPLPUSH source destination timeout 将列表source的尾元素移到列表destination的头部,若source为空则阻塞等待

当列表 source 为空时, BRPOPLPUSH命令将阻塞连接,直到等待超时,或有另一个客户端对 source 执行LPUSH key value [value …\]RPUSH key value [value …\]命令为止

timeout0时表示阻塞时间可无限期延长


集合

同理下面命令只能作用于集合

SADD

命令模板 意义
SADD set member [member …] 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略

在Redis2.4之前,SADD命令只接受单个member

SISMEMBER

命令模板 意义
SISMEMBER set member 判断menber元素是不是集合set的成员,返回值为01

SPOP

命令模板 意义
SPOP set 移出并返回集合set中一个随机元素

SRANDMEMBER

命令模板 意义
SRANDMEMBER set [count] 从集合中返回count个随机元素但不移出
  • 没有count:只返回一个随机元素
  • count>0:返回共count个随机元素,且返回个元素各不相同
  • count<0:返回共|count|个随机元素,且返回元素可以重复

SREM

命令模板 意义
SREM set member [member …] 移除集合set中一个或多个member元素,不存在的会被忽略

返回被移除的元素的数量

SMOVE

命令模板 意义
SMOVE source destination member member元素从source集合移到destination集合

source中不含有member,则返回0,不做其他操作

destination含有member,则只是把source中的member元素移除

即:IF (SREM source member) SADD destination member;

SCARD

命令模板 意义
SCARD set 返回集合set的基数,即元素的数量

set不存在返回0

SMEMBERS

命令模板 意义
SMEMBERS set 返回集合set中所有成员

set不存在返回empty list or set

SINTER

命令模板 意义
SINTER set [set …] 返回所有集合set交集的所有成员

不存在的set视为空集

当集合中存在一个空集时,结果理所当然也是空集

SINTERSTORE

命令模板 意义
SINTERSTORE destination set [set …] 类似于SINTER,但是还会把结果存在destination

destination已存在就覆盖

destination可以是set本身

SUNION

命令模板 意义
SUNION set [set …] 返回所有集合set并集的所有成员

不存在的set视为空集

SUNIONSTORE

命令模板 意义
SUNIONSTORE destination set [set …] 类似于SUNION,但是还会把结果存在destination

destination已存在就覆盖

destination可以是set本身

SDIFF

命令模板 意义
SDIFF set [set …] 返回所有集合set差集的所有成员

不存在的set视为空集

SDIFFSTORE

命令模板 意义
SDIFFSTORE destination set [set …] 类似于SDIFF,但是还会把结果存在destination

destination已存在就覆盖

destination可以是set本身


有序集合

有序集合和集合有一些不同,有序集合里的每个成员除了它自己本身的值(大多数情况是字符串)外还带有一个scorescore可以是正数或双精度浮点数(intfloat),集合中的成员将根据score进行排序。

ZADD

命令模板 意义
ZADD zset score member [[score member] …] 将一个或多个member及其score值插入到有序集合zset

member已存在,则更新其score,并重新插入member来保证该成员在正确的位置上

ZSCORE

命令模板 意义
ZSCORE zset member 获取有序集合zset的成员memberscore

ZINCRBY

命令模板 意义
ZINCRBY zset increment member 为有序集zset的成员memberscore值加上increment

返回member的新score

ZCARD

命令模板 意义
ZCARD zset 返回有序集zset的基数

ZCOUNT

命令模板 意义
ZCOUNT zset min max 返回有序集zset中,score值在minmax之间的成员数量

ZRANGE

命令模板 意义
ZRANGE zset start stop [WITHSCORES] 返回有序集zset中指定区间内的成员

其中成员的位置按 score 值递增(从小到大)来排序。

具有相同 score 值的成员按字典序lexicographical order来排列。

可以通过使用 WITHSCORES 选项,来让成员和它的 score 值一并返回,返回列表以 value1,score1, ..., valueN,scoreN 的格式表示。

ZREVRANGE

ZREANGE类似,只不过成员的位置按 score 值递减(从大到小)来排列。 具有相同 score 值的成员按字典序的逆序reverse lexicographical order排列。

ZRANGEBYSCORE

命令模板 意义
ZRANGEBYSCORE zset min max [WITHSCORES] [LIMIT offset count] 返回有序集 zset 中,所有 score 值介于 minmax 之间(包括等于 minmax )的成员

有序集成员按 score 值递增(从小到大)次序排列。

具有相同 score 值的成员按字典序lexicographical order来排列(该属性是有序集提供的,不需要额外的计算)。

可选的 WITHSCORES 参数决定结果集是单单返回有序集的成员,还是将有序集成员及其 score 值一起返回。

可选的 LIMIT 参数指定返回结果的数量及区间

minmax 可以是 -inf+inf ,即无限

默认情况下,区间的取值使用[闭区间 (小于等于或大于等于),你也可以通过给参数前增加 ( 符号来使用可选的开区间 (小于或大于)。即ZRANGEBYSCORE zset (min (max表示不包括minmax

ZREVRANGEBYSCORE

ZREANGEBYSCORE类似,只不过成员的位置按 score 值递减(从大到小)来排列。 具有相同 score 值的成员按字典序的逆序reverse lexicographical order排列。

ZRANK

命令模板 意义
ZRANK zset member 返回有序集 zset 中成员 member 的排名

有序集成员按 score 值递增(从小到大)顺序排列。

排名以 0 为底,也就是说, score 值最小的成员排名为 0

ZREVRANK

ZRANK类似,不过序集成员按 score 值递减(从大到小)排序。

ZREM

命令模板 意义
ZREM zset memebr [member …] 移除有序集 zset 中的一个或多个成员,不存在的成员将被忽略。

Redis 2.4 版本以前, ZREM 每次只能删除一个元素

ZREMRANGEBYRANK

命令模板 意义
ZREMRANGEBYRANK zset start stop 移除有序集 zset 中,指定排名(rank)区间内的所有成员。

区间由下标startstop指定,包括startstop

startstop可以用负数,表示倒数第几个成员

返回被移除的成员的数量

rank从小到大排列

ZREMRANGEBYSCORE

命令模板 意义
ZREMRANGEBYSCORE zset min max 移除有序集 zset 中,所有 score 值介于 minmax 之间(包括等于 minmax )的成员。

ZRANGEBYSCORE一样,可以通过给参数前增加 ( 符号来使用可选的开区间

ZRANGEBYLEX

此命令在有序集合的所有成员都带有相同score时使用,若有一个score不同,则都是返回unspecified

命令模板 意义
ZRANGEBYLEX zset min max [LIMIT offset count] 返回给定的有序集合键 zset 中,值介于 minmax 之间的成员

因为所有成员score相同,所以会按字典序lexicographical ordering进行排序,然后选出在minmax之间的成员

合法的 minmax 参数必须包含 ( 或者 [ , 其中 ( 表示开区间(指定的值不会被包含在范围之内), 而 [ 则表示闭区间(指定的值会被包含在范围之内)。

特殊值 +-min 参数以及 max 参数中具有特殊的意义, 其中 + 表示正无限, 而 - 表示负无限。

ZLEXCOUNT

此命令也是在有序集合的所有成员都带有相同score时使用

命令模板 意义
ZLEXCOUNT zset min max 返回给定的有序集合键 zset 中,值介于 minmax 之间的成员的数量

minmax的使用与ZRANGEBYLEX类似

ZREMRANGEBYLEX

命令模板 意义
ZREMRANGEBYLEX zset min max 移除给定的有序集合键 zset 中,值介于 minmax 之间的成员,随后返回移除的成员的数量

minmax的使用与ZRANGEBYLEX类似

ZUNIONSTORE

命令模板 意义
ZUNIONSTORE destination numkeys zset [zset …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX] 计算给定的一个或多个有序集的并集,其中给定 zset 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到 destination

使用 WEIGHTS 选项,你可以为每个给定有序集分别指定一个乘法因子multiplication factor,每个给定有序集的所有成员的 score 值在传递给聚合函数aggregation function之前都要先乘以该有序集的因子。

如果没有指定 WEIGHTS 选项,乘法因子默认设置为 1

使用 AGGREGATE 选项,你可以指定并集的结果集的聚合方式。默认使用的参数 SUM ,可以将所有集合中某个成员的 score 值之和作为结果集中该成员的 score 值;使用参数 MIN ,可以将所有集合中某个成员的最小score 值作为结果集中该成员的 score 值;而参数 MAX 则是将所有集合中某个成员的最大score 值作为结果集中该成员的 score 值。

ZINTERSTORE

命令模板 意义
ZINTERSTORE destination numkeys zset [zset …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX] 计算给定的一个或多个有序集的交集,其中给定 zset 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination

WEIGHTSAGGREGATE 选项使用与ZUNIONSTORE类似