Redis 数据结构

简介

Redis存储的是键值对key-value数据,key都是字符串类型,value有如下几种数据结构:

  • string字符串(strings),
  • list 列表
  • hash 散列
  • set 集合
  • sorted set 有序集合
  • bitmaps 位图
  • hyperloglogs 基数统计
  • geospatial 地理空间

在这里插入图片描述

1. Redis key

Redis key 值是二进制安全的,这意味着可以用任何二进制序列作为key值,从形如“foo”的简单字符串到一个JPEG文件的内容都可以。空字符串也是有效key值

Key取值原则

  1. 键值不需要太长,消耗内存,且在数据中查找这类键值的计算成本较高
  2. 键值不宜过短,可读性较差

给key设置过期时间
EXPIRE key seconds:秒值
PEXPIRE key milliseconds:毫秒值
EXPIREAT key timestamp:设置在指定Unix时间戳过期,秒
PEXPIREAT key milliseconds-timestamp:毫秒值

PERSIST key:删除过期

TTL key
查看剩余生存时间,秒值
PTTL key
查看毫秒值
key存在但没有设置TTL,返回-1
key存在,但还在生存期内,返回剩余的秒或者毫秒
key曾经存在,但已经消亡,返回-2(2.8版本之前返回-1)

KEYS pattern:查找键
pattern取值:* 任意长度字符;? 任意一个字符;[] 字符集合,表示可以是集合中的任意一个
keys ?e*;keys ?e??;keys key[ab]

EXISTS key
键是否存在

RENAME key newkey
键重命名,有可能覆盖值
RENAMENX key newkey
新的名字不存在的时候再重命名

DEL key [key ...]
删除键

unlink key [key ...]

unlink和删除del命令很像,也是存在key删除,不存在则忽略;删除几个键值,则返回删除的个数
del和unlink区别:

del:它是线程阻塞的,当执行del命令是,del在没执行完时,其它后续的命令是无法进入的(要安全就使用del)
unlink:它不是线程阻塞的,当执行unlink命令时,它会将要删除的键移交给另外线程,然后将当前要删除的键与数据库空间断开连接, 后续则由其它线程异步删除这些键(要效率快就使用unlink)

randomkey
随机返回一个key名称

object encoding key
获取value底层存储的数据结构类型

TYPE key
获取键类型

flushdb
删除当前数据库的所有数据
flushall
删除所有数据库的所有数据

copy source destination [db destination-db] [replace]
拷贝当前某一个key的值,存放到新的key中(可以跨库拷贝)返回 1 成功 0 失败
例子:

copy name1 name2  -- 把 name1 的值 拷贝到 name2 里
copy name1 name2 db 5 -- 把 name1 的值拷贝到第6号数据库name2里
copy name1 name2 replace -- 把 name1 的值拷贝到name2里,存在则强行覆盖

move key db
把指定的键值移动到选定的数据库db当中。如果key在目标数据库中已存在,或者key在源数据库中不存,则key不会被移动。
例子:

move name 2 --把name移动到数据库2

touch key [key ...]
修改指定key的最后访问时间。忽略不存在的 key。(我的理解是这个键被设置/更新成功,并且被放到数据库则是成功,会返回1)
例子:

-- 返回被设置成功的键个数
touch name1 name2 name3

scan cursor [match pattern] [count count]
用于迭代当前数据库中的数据库键

cursor:游标(告诉迭代器从哪开始迭代)
[match pattern]:过滤筛选条件
[count count]:迭代的个数

需要注意的是count的使用:
COUNT 参数的默认值为 10 。
在迭代一个足够大的、由哈希表实现的数据库、集合键、哈希键或者有序集合键时, 如果用户没有使用 MATCH 选项, 那么命令返回的元素数量通常和 COUNT 选项指定的一样, 或者比 COUNT 选项指定的数量稍多一些。
在迭代一个编码为整数集合(intset,一个只由整数值构成的小集合)、 或者编码为压缩列表(ziplist,由不同值构成的一个小哈希或者一个小有序集合)时, 增量式迭代命令通常会无视 COUNT 选项指定的值, 在第一次迭代就将数据集包含的所有元素都返回给用户。
例子:

127.0.0.1:6379> keys *
1) "name8"
2) "name3"
3) "name5"
4) "name1"
5) "name2"
6) "name9"
7) "name7"
8) "name4"
9) "name6"
127.0.0.1:6379> scan 0 match name* count 2
-- 迭代开始,从游标0开始(开头),筛选带 name* 并且查2个
-- 执行后,会返回两个键,并且还返回游标现在指向的位置 2 ,那我们下次迭代就可以从 2 开始继续
1) "2"
2) 1) "name8"
   2) "name7"
127.0.0.1:6379> scan 2 match name* count 2
 -- 设置游标从 2 开始 并查询 2 个键
1) "5"
2) 1) "name3"
   2) "name2"
   3) "name9"

migrate host port key|"" destination-db timeout [copy] [replace] [auth password] [auth2 username password] [keys key [key ...]]
将key原子性的从当前实例库传送到目标实例的指定数据库上,一旦迁移成功,key会在目标实例上,而当前实例上的key会被删除(默认删除)

host:设置迁移的IP地址
port:设置迁移的端口号
key|“”:如果要迁移单个key则可以在这设置key,如果是多个key则在这里只需要设置 “” 在后面设置更多的key
destination-db:迁移到目标Redis服务器的哪个实例数据库
timeout:超时时间
[copy]:设置此属性代表复制迁移,不删除源实例中的key。
[replace]:强行替换,如果目标数据库存在则更新值,不存在则添加;如果不设置replace则代表对方数据库存在迁移的key则不成功
[auth password]:请求对方数据库的密码
[auth2 username password]:请求对方数据库的用户名和密码
[keys key [key …]]:如果前面没设置 key为"",则在后面可以设置多个key迁移,如keys aaa bbb ccc

例子:

set name zhangsan
-- 设置一个普通的键值
migrate 127.0.0.1 6380 name 1 2000
-- 把name键值迁移到指定IP和端口的Redis服务器上,并且放在2号实例数据库上,超时时间2秒(超时关闭)
migrate 127.0.0.1 6380 name 0 2000 copy
-- 和上面一个命令一样,但是不同的是上一个命令成功则删除原始键值,而当前命令加上copy则只是复制到对方数据库
migrate 127.0.0.1 6380 name 0 2000 copy replace
-- 加上replace则代表目地数据库存在此键则会强行更新,不存在则添加
migrate 127.0.0.1 6380 name 0 2000 copy replace auth 1234
-- 加上密码验证
migrate 127.0.0.1 6380 "" 0 2000 copy replace auth 1234 name age address
-- 一次性迁移多个keys

sort key [by pattern] [limit offset count] [get pattern [get pattern ...]] [asc|desc] [alpha] [store destination]
sort是用来对list,set或sorted中元素排序;默认是按照数值排序的;并且按照两个元素的双精度浮点数类型值进行比较

key:排序的key
[by pattern]:通过引用外部key来排序
[limit offset count]:分页,limit 2,3 从0开始偏移到第2条数据,并查询3条数据
[get pattern [get pattern …]]:获取外部key的值
[asc|desc]:排序的规则
[alpha]:当排序的集合中存在字符串则需要使用此属性,按照字典顺序排序;因为默认按照两个元素的双精度浮点数类型值进行比较
[store destination]:把处理好的结果存放到指定的key容器中

例子:

-- 创建两个集合:(后面会说list集合命令)
lpush listNumber 8.4 13 14 10.5 4 19.6 10 14 5.2 10 3 2.5 7 4.7 10 11.2 8 2.2 15.7 20.9
lpush listString  remini Momen Pledg Memo Tende Biode Revie silen Romanti AusL Simpl Promis Romanti Bautifu smil Initiall sunse lemo firs Chaffere
-- 查看添加的命令:
lrange listNumber 0 -1
lrange listString 0 -1

-- 基本使用:
sort listNumber         -- 默认排序是按照双精度浮点数类型从小到大升序
sort listNumber desc    -- 按照从降序排列
sort listString alpha   -- 如果排序中包含字符串类型则必须使用 alpha 修饰;则会使用字节排序
sort listString limit 2 5 alpha     -- 排序并分页,分页从0开始数到2,再从2的位置往后数5个元素
sort listString  alpha limit 2 5 store newliststring    -- 排序分页,并把排序好的数据存放到另外一个集合中

-- by属性的使用(通过外部key排序):
lpush mylist 20 15 18
set n_20 b
set n_15 a
set n_18 c
sort mylist by n_* alpha
1) "15"
3) "20"
5) "18"
-- 如果使用了by属性,那么sort就会先取出mylist的全部值,也就是20,15,18,
-- 然后再去跟by里设置的pattern进行组合(n_*,里面的*必须要和mylist的值有个一一对应关系,要不无法组合);
-- 所以就变为了n_20,n_15,n_18 ,再按照这些拼装出的键里面的值进行排序(默认升序,从小到大);
-- 这些键排完序规则为
-- n_15 a
-- n_20 b
-- n_18 c
-- 对应好之后,程序就会按照键后面的权重值来排序,所以最终排序a,b,c起作用,那么反过来推算
-- n_15代表mylist的15,n_20代表mylist的20,n_18代表mylist的18,
-- 所以15对应排序的权重a;20对应排序的权重b;18对应排序的权重c;

-- 练习:现在有zhangsan(salary=5200),lisi(salary=3000),wangwu(salary=4500),
-- mazi(salary=3200)四人,但是他们想比较谁的工资高,该如何设计排序
lpush names zhangsan lisi wangwu mazi
set name_zhangsan 5200
set name_lisi 3000
set name_wangwu 4500
set name_mazi 3200
sort names by name_* desc

-- get是使用则是先加载出mylist,并且再拼装到n_*(一一对应)然后会直接输出那个键的权重(根据mylist里面排序)
-- get属性使用(获取外部key):
lpush mylist 20 15 18
set n_20 b
set n_15 a
set n_18 c

-- 1:获取外部key
127.0.0.1:6379> sort mylist get n_*
1) "a"
2) "c"
3) "b"

-- 2:获取外部key并获取当前结合的集合值
127.0.0.1:6379> sort mylist get n_* get #
1) "a"
2) "15"
3) "c"
4) "18"
5) "b"
6) "20"

-- 3:如果有多个get也是可以的,会依次匹对返回
127.0.0.1:6379> sort mylist get n_* get # get nn_* get #

2. string

一种最基本的Redis值类型(字节数组)。

Redis字符串是二进制安全的,一个Redis字符串能包含任意类型的数据。

例如: 一张JPEG格式的图片或者一个序列化的Ruby对象。

一个字符串类型的值最多能存储512M字节的内容

SET key value [EX seconds] [PX milliseconds] [NX|XX]
设置字符串值:

  • EX:设置过期时间,秒;等同于SETEX key seconds value
    set hello world ex 10
  • PX:设置过期时间,毫秒;等同于PSETEX key milliseconds value
    set hello world px 5000
  • NX:键不存在,才能设置,等同于SETNX key value
    set hello bjsxt nx
  • XX:键存在时,才能设置
    set hello sxt xx

setex key seconds value
将键key的值设置为value ,并将键key的过期时间设置为seconds秒钟,如果key存在则覆盖原有值
例子:

setex name 60 xiexie -- 设置key为name,并且设置60秒过期时间

psetex key milliseconds value
将键key的值设置为value ,并将键key的过期时间设置为milliseconds毫秒,如果key存在则覆盖原有值
例子:

psetex name 70000 xiexie -- 设置key为name,并且设置70秒过期时间

MSET key value [key value ...]
设置多个键的字符串值
mset keya valuea keyb valueb keyc valuec keyd valud

MSETNX key value [key value ...]
键不存在时,设置字符串值
msetnx a valua b valueb c valuec

注意Redis一条命令是一个原子操作,对多个kv,要不成功都不成功

GET key
获取键的值

MGET key [key ...]
获取多个给定的键的值

getdel key
先获取到指定的key后,再删除获取的那个key;最终返回被删除的值

GETSET key value
返回旧值并设置新值;如果键不存在,就创建并赋值

getex key [ex seconds|px milliseconds|exat timestamp|pxat milliseconds-timestamp|persist]
获取指定的key值,并且获取后可以对当前key设置超时时间或者清除超时时间
参数 说明

  • ex seconds 设置键key的过期时间,单位时秒
  • px milliseconds 设置键key的过期时间,单位时毫秒
  • exat timestamp 设置键过期的指定Unix时间,以秒为单位
  • pxat milliseconds-timestamp 设置键过期的指定Unix时间,以毫秒为单位
  • persist 清除超时时间

STRLEN key
获取键的值的字符串长度

APPEND key value
追加字符串;如果键存在就追加;如果不存在就等同于SET key value

GETRANGE key start end
获取子字符串;
索引值从0开始,负数表示从字符串右边向左数起, -1表示最右一个字符,负号减轻复杂度

SETRANGE key offset value
覆盖字符串

步长1的增减
INCR key:value值+1
DECR key:value值-1

string类型的,底层实现是int,实际上操作的还是数字。
字符串值会被解释成64位有符号的十进制整数来操作,结果依然转成字符串

INCRBY key decrement:自定义步长
DECRBY key decrement
incrbyfloat key decrement :操作浮点数,可以是负数

3. list

  • 基于Linked List实现,双向无环链表
  • 元素是字符串类型
  • 列表头尾增删快,中间增删慢,增删元素是常态
  • 元素可以重复出现
  • 最多包含2^32-1元素

列表可以实现堆栈、队列、阻塞队列等。

列表的索引

  • 从左至右,从0开始
  • 从右至左,从-1开始

LPUSH key value [value ...]
从左边(或头部)添加元素
LPUSHX key value
要求key必须存在

RPUSH key value [value ...]
从右边(或尾部)添加元素
RPUSHX key value
要求key必须存在

LPOP key
从左边(头部)弹出元素
RPOP key
从右边(尾部)弹出元素

RPOPLPUSH source destination
从一个列表尾部弹出元素压入到另一个列表的头部

LRANGE key start stop
返回列表中指定范围元素
LRANGE key 0 -1
返回所有元素

LINDEX key index
获取指定位置的元素

LSET key index value
设置指定位置元素的值

LLEN key
获取列表长度,元素个数

LREM key count value
移除元素

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

LTRIM key start stop
去除指定范围 外 的元素

LINSERT key BEFORE|AFTER val value
在列表中某个存在的值(pivot)前或后插入元素

BLPOP key [key ...] timeout
从左边或者头部阻塞弹出元素

BRPOP key [key ...] timeout
从右边或者尾部阻塞弹出元素

如果弹出的列表不存在或者为空,就会阻塞;
超时时间设置为0,就是永久阻塞,直到有数据可以弹出;
如果多个客户端阻塞在同一个列表上,使用First In First Service原则,先到先服务。

BRPOPLPUSH source destination timeout
从一个列表尾部阻塞弹出元素压入到另一个列表的头部

lmove source destination left|right left|right
用于原子地从source集合左边或者右边弹出一个元素,添加到destination新集合里的左边或右边

source:源集合
destination:目标集合
left|right left|right:
第一个:代表从源集合的左边或者右边弹出元素
第二个:代表从目标集合的左边或者右边添加

例子:

lmove listString mylist left right   -- 从listString源集合的左边弹出个元素,添加到mylist目标集合的右边

blmove source destination left|right left|right timeout
用于原子地从source集合左边或者右边弹出一个元素,添加到destination新集合里的左边或右边,但是它时lmove的阻塞版本
例子:

blmove listString mylist left right 60 
-- 从集合listString左边弹出一个元素放到目标集合mylist的尾部, 存在60秒的超时时间,超过60秒没有弹出元素则自动失败,返回(nil)

lpos key element [rank rank] [count num-matches] [maxlen len]
返回集合key中匹配给定element成员的索引

key:要查询的集合key
element:要查询索引的元素
[rank rank]:选择匹配上的第几个元素,若超出集合指定元素的个数则返回(nil)
[count num-matches]:返回匹配上元素的索引个数,默认返回1个
[maxlen len]:告知lpos命令查询集合的前len个元素,限制查询个数

lpos listString Romanti     -- 查询集合listString里的Romanti出现的索引位置(0开始索引)
    lpos listString Romanti rank 2  -- 查询Romanti元素的第二个索引位置
    lpos listString Romanti rank 1 count 3  -- 查询Romanti索引的三条记录
    lpos listString Romanti rank 1 count 3 maxlen 20    -- 限制查询下标为0~20
    1) (integer) 7
    2) (integer) 11

4. hash

在这里插入图片描述

  • 由field和关联的value组成的map键值对
  • field和value是字符串类型
  • 一个hash中最多包含2^32-1键值对

HSET key field value
设置单个字段
HSETNX key field value
key的filed不存在的情况下执行,key不存在直接创建

HMSET key field value [field value ...]
设置多个字段

HLEN key
返回字段个数

hstrlen key field
返回存储在key中给定field相关联的值的字符串长度(string length)

HEXISTS key field
判断字段是否存在; key或者field不存在,返回0

HGET key field
返回字段值
HMGET key field [field ...]
返回多个字段值
HGETALL key
返回所有的键值对

HKEYS key
返回所有字段名
HVALS key
返回所有值

HINCRBY key field increment
在字段对应的值上进行整数的增量计算
HINCRBYFLOAT key field increment
在字段对应的值上进行浮点数的增量计算

HDEL key field [field ...]
删除指定的字段

hscan key cursor [match pattern] [count count]
用于遍历哈希表中的键值对 cursor:游标(告诉迭代器从哪开始迭代) [match pattern]:过滤筛选条件 [count count]:迭代的个数
需要注意的是count的使用:

  • COUNT 参数的默认值为 10 。
  • 在迭代一个足够大的、由哈希表实现的数据库、集合键、哈希键或者有序集合键时, 如果用户没有使用 MATCH 选项, 那么命令返回的元素数量通常和 COUNT 选项指定的一样, 或者比 COUNT 选项指定的数量稍多一些。
  • 在迭代一个编码为整数集合(intset,一个只由整数值构成的小集合)、 或者编码为压缩列表(ziplist,由不同值构成的一个小哈希或者一个小有序集合)时, 增量式迭代命令通常会无视 COUNT 选项指定的值, 在第一次迭代就将数据集包含的所有元素都返回给用户。
    hscan student 0 match * count 2 – 迭代student里的field字段,下标0开始,过滤条件*全部,但是因为其编码为压缩列表, 所以countr 2不起作用

hash的优点:

  • 节约内存空间
  • 每创建一个键,它都会为这个键储存一些附加的管理信息(比如这个键的类型,这个键最后一次被访问的时间等等)
  • 所以数据库里面的键越多,redis数据库服务器在储存附加管理信息方面耗费的内存就越多,花在管理数据库键上的CPU也会越多在字段对应的值上进行浮点数的增量计算

不适合hash的情况

  • 使用二进制位操作命令:
    因为Redis目前支持对字符串键进行SETBIT、GETBIT、BITOP等操作,如果你想使用这些操作,那么只能使用字符串键,虽然散列也能保存二进制数据
  • 使用过期键功能:
    Redis的键过期功能目前只能对键进行过期操作,而不能对散列的字段进行过期操作,因此如果你要对键值对数据使用过期功能的话,那么只能把键值对储存在字符串里面

使用案例:

  • 微博的好友关注
    用户ID为key,Field为好友ID,Value为关注时间
    user:1000 user:606 20150808 (hlen user:1000得到粉丝数)

  • 用户维度统计
    统计数包括:关注数、粉丝数、喜欢商品数、发帖数
    用户为Key,不同维度为Field,Value为统计数

    比如关注了5人
    HSET user:100000 follow 5
    HINCRBY user:100000 follow 1

5. set

  • 无序的、去重的
  • 元素是字符串类型
  • 最多包含2^32-1元素

SADD key member [member ...]
增加一个或多个元素;如果元素已经存在,则自动忽略

SREM key member [member ...]
移除一个或者多个元素;元素不存在,自动忽略

SMEMBERS key
返回集合包含的所有元素;
如果集合元素过多,例如百万个,需要遍历,可能会造成服务器阻塞,生产环境应避免使用
注意, SMEMBERS 有可能返回不同的结果,所以,如果需要存储有序且不重复的数据使用有序集合,存储有序可重复的使用列表

SISMEMBER key member
检查给定元素是否存在于集合中

SRANDMEMBER key [count]
随机返回集合中指定个数的,适合抽奖

  • 如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合 最多返回整个集合 conut>=0
  • 如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值 count < 0 长度为count绝对值,元素可能重复
  • 如果 count 为 0,返回空
  • 如果 count 不指定,随机返回一个元素

SCARD key
返回集合中元素的个数
键的结果会保存信息,集合长度就记录在里面,所以不需要遍历

SPOP key
随机从集合中移除并返回这个被移除的元素

SMOVE source destination member
把元素从源集合移动到目标集合

SDIFF key [key ...]
取差集,具有方向性
从第一个key的集合中去除其他集合和自己的交集部分

SDIFFSTORE destination key [key ...]
取差集;将差集结果存储在目标key中

SINTER key [key ...]
取所有集合交集部分

SINTERSTORE destination key [key ...]
将交集结果存储在目标key中

SUNION key [key ...]
取所有集合并集

SUNIONSTORE destination key [key ...]
将并集结果存储在目标key中

新浪微博的共同关注
需求:当用户访问另一个用户的时候,会显示出两个用户共同关注哪些相同的用户

设计:将每个用户关注的用户放在集合中,求交集即可

实现如下:
peter={‘john’,‘jack’,‘may’}
ben={‘john’,‘jack’,‘tom’}
那么peter和ben的共同关注为:
SINTER peter ben
结果为 {‘john’,‘jack’}

sscan key cursor [match pattern] [count count]
用于遍历集合中键的元素,sscan继承自scan,具体可以参考scan,上面第三章有说明

  • key:迭代指定元素
  • cursor:游标(告诉迭代器从哪开始迭代)
  • [match pattern]:过滤筛选条件
  • [count count]:迭代的个数

例子(每次迭代两个):

127.0.0.1:6379> sscan setA 0 match * count 2
        1) "1"
        2) 1) "zhangsan"
           2) "lisi"
127.0.0.1:6379> sscan setA 1 match * count 2
        1) "0"
        2) 1) "wangwu"
           2) "baobao"

6. SortedSet

  • 类似Set集合
  • 有序的、去重的
  • 元素是字符串类型
  • 每一个元素都关联着一个浮点数分值(Score),并按照分值从小到大的顺序排列集合中的元素。分值可以相同
  • 最多包含2^32-1元素

ZADD key score member [score member ...]
增加一个或多个元素;如果元素已经存在,则使用新的score值

ZREM key member [member ...]
移除一个或者多个元素;元素不存在,自动忽略

ZSCORE key member
显示分值

ZINCRBY key increment member
增加或者减少分值 浮点值;increment为负数就是减少

ZRANK key member
返回元素的排名(索引)

ZREVRANK key member
返回元素的逆序排名
首先按照分值从大到小排列,然后再看索引。

ZRANGE key start stop [WITHSCORES]
返回指定索引区间元素;start和stop是按照排名来分割的。
如果score相同,则按照字典序lexicographical order 排列;
默认按照score从小到大,如果需要score从大到小排列,使用ZREVRANGE

ZREVRANGE key start stop [WITHSCORES]
返回指定索引区间元素
如果score相同,则按照字典序lexicographical order 的 逆序 排列
默认按照score从大到小,如果需要score从小到大排列,使用ZRANGE

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
返回指定分值区间元素
返回score默认属于[min,max]之间,元素按照score升序排列,score相同字典序
LIMIT中offset代表跳过多少个元素,count是返回几个。类似于Mysql
使用小括号,修改区间为开区间,例如(5、(10、5
-inf和+inf表示负无穷和正无穷

ZREVRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
返回指定分值区间元素
返回score默认属于[min,max]之间,元素按照score降序排列,score相同字典降序
LIMIT中offset代表跳过多少个元素,count是返回几个。类似于Mysql
使用小括号,修改区间为开区间,例如(5、(10
-inf和+inf表示负无穷和正无穷

ZREMRANGEBYRANK key start stop
移除指定排名范围的元素

ZREMRANGEBYSCORE key min max
移除指定分值范围的元素

ZCARD key
返回集合中元素个数

ZCOUNT key min max
返回指定范围中元素的个数

ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
求并集
ZUNIONSTORE scores-all2 2 scores1 scores2 WEIGHTS 1 0.5 AGGREGATE SUM

  • numkeys
    指定key的数量,必须
  • WEIGHTS
    与前面设定的key对应,对应key中每一个score都要乘以这个权重
  • AGGREGATE
    指定并集结果的聚合方式
  • SUM:
    将所有集合中某一个元素的score值之和作为结果集中该成员的score值
  • MIN:
    将所有集合中某一个元素的score值中最小值作为结果集中该成员的score值
  • MAX:
    将所有集合中某一个元素的score值中最大值作为结果集中该成员的score值

ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
求交集

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

theONLY0318

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值