• Redis的5大数据类型


    Redis的5大数据类型

    这里说的数据类型是value的数据类型,key的类型都是字符串。

    5种数据类型:

    • redis字符串(String)
    • redis列表(List)
    • redis集合(Set)
    • redis哈希表(Hash)
    • redis有序集合(Zset)

    redis键(key)

    • keys *:查看当前库所有的key
    • exists key:判断某个key是否存在
    • type key:查看你的key是什么类型
    • del key:删除指定的key数据
    • unlink key:根据value删除非阻塞删除,仅仅将keys从keyspace元数据中删除,真正的删除会在后续异步中操作。
    • expire key 10:为指定的key设置有效期10秒
    • ttl key:查看指定的key还有多少秒过期,-1:表示永不过期,-2:表示已过期
    • select dbindex:切换数据库【0-15】,默认为0
    • dbsize:查看当前数据库key的数量
    • flushdb:清空当前库
    • flushall:通杀全部库

    redis字符串(String)

    简介

    String是Redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。

    String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象。

    String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M。

    常用命令

    set:添加键值对

    127.0.0.1:6379> set key value [EX seconds|PX milliseconds|EXAT timestamp|PXAT milliseconds-timestamp|KEEPTTL] [NX|XX] [GET]
    
    • 1

    SET命令有EX、PX、NX、XX以及KEEPTTL五个可选参数,其中KEEPTTL为6.0版本添加的可选参数,其它为2.6.12版本添加的可选参数。

    • value:若包含空格、特殊字符,需用双引号包裹

    • EX seconds:以秒为单位设置过期时间

    • PX milliseconds:以毫秒为单位设置过期时间,与EX互斥

    • EXAT timestamp:设置以秒为单位的UNIX时间戳所对应的时间为过期时间

    • PXAT milliseconds-timestamp:设置以毫秒为单位的UNIX时间戳所对应的时间为过期时间,与EX互斥

    • NX:键不存在的时候设置键值

    • XX:键存在的时候设置键值

    • KEEPTTL:保留设置前指定键的生存时间

    • GET:返回指定键原本的值,若键不存在时返回nil

    其中,SET命令使用EX、PX、NX参数,其效果等同于SETEX、PSETEX、SETNX命令。根据官方文档的描述,未来版本中SETEX、PSETEX、SETNX命令可能会被淘汰。EXAT、PXAT以及GET为Redis 6.2新增的可选参数。一般情况下,命令“set key value”足够了。

    get:获取值

    get <key>
    
    • 1

    示例:

    127.0.0.1:6379> set name zhangsan
    OK
    127.0.0.1:6379> get name
    "zhangsan"
    
    • 1
    • 2
    • 3
    • 4

    apend:追加值

    append <key> <value>
    
    • 1

    将给定的value追加到原值的末尾。

    示例:

    127.0.0.1:6379> set k1 hello
    OK
    127.0.0.1:6379> append k1 world
    (integer) 10
    127.0.0.1:6379> get k1
    "helloworld"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    strlen:获取值的长度

    strlen <key>
    
    • 1

    示例:

    127.0.0.1:6379> set name zhangsan
    OK
    127.0.0.1:6379> strlen name
    (integer) 8
    
    • 1
    • 2
    • 3
    • 4

    setnx:key不存在时,设置key的值

    setnx <key> <value>
    
    • 1

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> setnx name "zhangsan" #name不存在,返回1,表示设置成功
    (integer) 1
    127.0.0.1:6379> setnx site "zhangsan" #再次通过setnx设置name,由于已经存在了,所以设置失败,返回0
    (integer) 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    incr:原子递增1

    incr <key>
    
    • 1

    将key中存储的值增1,只能对数字值操作,如果key不存在,则会新建一个,值为1。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> set age 30 #age值为30
    OK
    127.0.0.1:6379> incr age #age增加1,返回31
    (integer) 31
    127.0.0.1:6379> get age #获取age的值
    "31"
    127.0.0.1:6379> incr salary #salary不存在,自动创建一个,值为1
    (integer) 1
    127.0.0.1:6379> get salary #获取salary的值
    "1"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    decr:原子递减1

    decr <key>
    
    • 1

    将key中存储的值减1,只能对数字值操作,如果为空,新增值为-1。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> set age 30 #age值为30
    OK
    127.0.0.1:6379> decr age #age递减1,返回29
    (integer) 29
    127.0.0.1:6379> get age #获取age的值
    "29"
    127.0.0.1:6379> decr salary #salary不存在,自动创建一个,值为-1
    (integer) -1
    127.0.0.1:6379> get salary #获取salary
    "-1"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    incrby/decrby:递增或者递减指定的数字

    incrby/decrby <key> <步长>
    
    • 1

    将key中存储的数字值递增指定的步长,若key不存在,则相当于在原值为0的值上递增指定的步长。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> set salary 10000 #设置salary为10000
    OK
    127.0.0.1:6379> incrby salary 5000 #salary添加5000,返回15000
    (integer) 15000
    127.0.0.1:6379> get salary #获取salary
    "15000"
    127.0.0.1:6379> decrby salary 800 #salary减去800,返回14200
    (integer) 14200
    127.0.0.1:6379> get salary #获取salary
    "14200"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    mset:同时设置多个key-value

    mset <key1> <value1> <key2> <value2> ...
    
    • 1

    示例:

    127.0.0.1:6379> mset name zhangsan age 30
    OK
    127.0.0.1:6379> get name
    "zhangsan"
    127.0.0.1:6379> get age
    "30"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    mget:获取多个key对应的值

    mget <key1> <value1> <key2> <value2> ...
    
    • 1

    示例:

    127.0.0.1:6379> mset name zhangsan age 30 #同时设置name和age
    OK
    127.0.0.1:6379> mget name age #同时读取name和age的值
    1) "zhangsan"
    2) "30"
    
    • 1
    • 2
    • 3
    • 4
    • 5

    msetnx:当多个key都不存在时,则设置成功

    msetnx <key1> <value1> <key2> <value2> ...
    
    • 1

    这是一个原子性的操作,要么都成功,或者都失败。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> set k1 abc #设置k1
    OK
    127.0.0.1:6379> msetnx k1 abc k2 xyz #当k1和k2都不存在的时候,同时设置k1和k2,由于k1已存在,所以这个操作失败
    (integer) 0
    127.0.0.1:6379> mget k1 k2 #获取k1、k2,k2不存在
    1) "abc"
    2) (nil)
    127.0.0.1:6379> msetnx k2 xyz k3 123 #当k2、h3都不存在的时候,同时设置k2和k3,设置成功
    (integer) 1
    127.0.0.1:6379> mget k1 k2 k3 #后去k1、k2、k3的值
    1) "abc"
    2) "xyz"
    3) "123"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    getrange:获取值的范围,类似java中的substring

    getrange key start end
    
    • 1

    获取[start, end]返回为的字符串。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> set k1 helloworld
    OK
    127.0.0.1:6379> getrange k1 0 4
    "hello"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    setrange:覆盖指定位置的值

    setrange <key> <起始位置> <value>
    
    • 1

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> set k1 helloworld
    OK
    127.0.0.1:6379> get k1
    "helloworld"
    127.0.0.1:6379> setrange k1 1 java
    (integer) 10
    127.0.0.1:6379> get k1
    "hjavaworld"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    setex:设置键值&过期时间(秒)

    setex <key> <过期时间()> <value>
    
    • 1

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> setex k1 100 v1 #设置k1的值为v1,有效期100秒
    OK
    127.0.0.1:6379> get k1 #获取k1的值
    "v1"
    127.0.0.1:6379> ttl k1 #获取k1还有多少秒失效
    (integer) 90
    #100秒,再获取k1
    127.0.0.1:6379> get k1
    (nil)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    getset:以新换旧,设置新值同时返回旧值

    getset <key> <value>
    
    • 1

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> set name zhangsan #设置name为zhangsan
    OK
    127.0.0.1:6379> getset name lisi #设置name为lisi,返回name的旧值
    "zhangsan"
    127.0.0.1:6379> getset age 30 #设置age为30,age未设置过,返回age的旧值为null
    (nil)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    数据结构

    String的数据结构为简单动态字符串(Simple Dynamic String,缩写SDS)。是可以修改的字符串,内部结构上类似于Java的ArrayList,采用分配冗余空间的方式来减少内存的频繁分配。但是作者认为,它更像是Java中的BufferBuilder。这么解释的原因是让各位有宏观上的认知。

    redis列表(List)

    简介

    单键多值,redis列表是简单的字符串列表,按照插入顺序排序。

    可以添加一个元素到列表的头部(左边)或者尾部(右边)。

    它的底层实际上是使用双向链表实现的,对两端的操作性能很高,通过索引下标操作中间节点性能会较差。

    常用命令

    lpush/rpush:从左边或者右边插入一个或多个值

    lpush/rpush <key1> <value1> <value2> <value3> ...
    
    • 1

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> rpush name zhangsan lisi "wangwu" #列表name的左边插入3个元素
    (integer) 4
    127.0.0.1:6379> lrange name 1 2 #从左边取出索引位于[1,2]范围内的元素
    1) "lisi"
    2) "wangwu"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    lrange:从列表左边获取指定范围内的值

    lrange <key> <star> <stop>
    
    • 1

    返回列表key中指定区间内的元素,区间以偏移量start和stop指定。以0表示列表的第一个元素,以1表示列表的第二个元素,以此类推。你也可以使用负数下标,以-1表示列表的最后一个元素, -2表示列表的倒数第二个元素,以此类推。

    返回值是一个列表,包含指定区间内的元素。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> rpush name zhangsan lisi "wangwu" "zhaoliu" #列表name的左边插入4个元素
    (integer) 6
    127.0.0.1:6379> lrange name 0 -1  #取出name集合中所有元素
    1) "zhangsan"
    2) "lisi"
    3) "wangwu"
    4) "zhaoliu"
    127.0.0.1:6379> lrange name 1 3 #获取name集合索引[1,3]范围内的元素
    1) "lisi"
    2) "wangwu"
    3) "zhaoliu"	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    lpop/rpop:从左边或者右边弹出多个元素

    lpop/rpop <key> <count>
    
    • 1

    count可以省略,默认值为1。lpop/rpop操作之后,弹出来的值会从列表中删除。还有值的情况key还在,值都清空了,key就没了。弹出可以理解为删除掉。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> rpush name zhangsan lisi "wangwu" "zhaoliu" #列表name的左边插入4个元素
    (integer) 4
    127.0.0.1:6379> lpop name 2 #从左边弹出2个元素
    1) "zhangsan"
    2) "lisi"
    127.0.0.1:6379> rpop name 1 #从右边弹出1个元素 1可以省略
    1) "zhaoliu"
    127.0.0.1:6379> lrange name 0 -1  #取出name集合中所有元素 还剩下1个元素
    1) "wangwu"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    rpoplpush:从一个列表右边弹出一个元素放到另外一个列表中

    rpoplpush source destination
    
    • 1

    从source的右边弹出一个元素放到destination列表的左边。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> rpush k1 1 2 3 4 #列表k1的右边添加3个元素[1,2,3,4]
    (integer) 4
    127.0.0.1:6379> lrange k1 0 -1 #从左到右输出k1列表中的全部元素
    1) "1"
    2) "2"
    3) "3"
    4) "4"
    127.0.0.1:6379> rpush k2 a b c d #列表k1的右边添加3个元素[a,b,c,d]
    (integer) 4
    127.0.0.1:6379> lrange k2 0 -1 #从左到右输出k2列表中的全部元素
    1) "a"
    2) "b"
    3) "c"
    4) "d"
    127.0.0.1:6379> rpoplpush k1 k2 #从k1的右边弹出一个元素放到k2的左边
    "4"
    127.0.0.1:6379> lrange k1 0 -1 #从左到右输出k1列表中的全部元素,4没了
    1) "1"
    2) "2"
    3) "3"
    127.0.0.1:6379> lrange k2 0 -1 #从左到右输出k2列表中的全部元素,4在左边
    1) "4"
    2) "a"
    3) "b"
    4) "c"
    5) "d"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    lindex:获取指定索引位置的元素(从左到右)

    lindex key index
    
    • 1

    返回列表key中,下标为index的元素。下标(index)参数start和stop都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。也可以使用负数下标,以-1表示列表的最后一个元素,-2表示列表的倒数第二个元素,以此类推。如果key不是列表类型,返回一个错误。返回值是列表中下标为index的元素。如果index参数的值不在列表的区间范围内(out of range),返回nil。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> rpush name zhangsan lisi wangwu zhangliu #列表name的左边插入4个元素
    (integer) 4
    127.0.0.1:6379> lindex name 2 #返回索引位置2的元素
    "wangwu"
    127.0.0.1:6379> lindex name 200#返回索引位置200的元素,没有
    (nil)
    127.0.0.1:6379> lindex name -1 #返回最后一个元素
    "zhangliu"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    llen:获得列表长度

    llen key
    
    • 1

    key是列表类型的,返回列表key的长度。key不存在返回0,如果key不是列表类型,返回一个错误。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> rpush name zhangsan lisi wangwu zhangliu
    (integer) 4
    127.0.0.1:6379> llen name
    (integer) 4
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    linsert:在某个值的前或者后面插入一个值

    linsert <key> before|after <value> <newvalue>
    
    • 1

    将值newvalue插入到列表key当中,位于值 value之前或之后。当value不存在于列表key时,不执行任何操作。当key不存在时,key被视为空列表,不执行任何操作。如果key不是列表类型,返回一个错误。如果命令执行成功,返回插入操作完成之后,列表的长度。如果没有找到value ,返回-1 。如果key不存在或为空列表,返回0 。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> rpush name zhangsan lisi wangwu zhangliu #列表name中添加4个元素
    (integer) 4
    127.0.0.1:6379> lrange name 0 -1 #name列表所有元素
    1) "zhangsan"
    2) "lisi"
    3) "wangwu"
    4) "zhangliu"
    127.0.0.1:6379> linsert name before lisi lily #lisi前面添加lily
    (integer) 5
    127.0.0.1:6379> lrange name 0 -1 #name列表所有元素
    1) "zhangsan"
    2) "lily"
    3) "lisi"
    4) "wangwu"
    5) "zhangliu"
    127.0.0.1:6379> linsert name before xxx mike #xxx前面添加lily,由于xxx元素不存在,插入失败,返回-1
    (integer) -1
    127.0.0.1:6379> lrange name 0 -1
    1) "zhangsan"
    2) "lily"
    3) "lisi"
    4) "wangwu"
    5) "zhangliu"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    lrem:删除指定数量的某个元素

    lrem key count value
    
    • 1

    根据参数count的值,移除列表中与参数value相等的元素。当count > 0时,从表头开始向表尾搜索,移除与value相等的元素,数量为count 。当count < 0时,从表尾开始向表头搜索,移除与value相等的元素,数量为count的绝对值。当count = 0时,移除表中所有与value相等的值。返回值是被移除元素的数量。由于不存在的key被视作空表(empty list),所以当key不存在时,总是返回 0 。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> rpush k1 a b c b b a
    (integer) 6
    127.0.0.1:6379> lrange k1 0 -1
    1) "a"
    2) "b"
    3) "c"
    4) "b"
    5) "b"
    6) "a"
    127.0.0.1:6379> lrem k1 2 b #k1集合中从左边删除2个b
    (integer) 2
    127.0.0.1:6379> lrange k1 0 -1 #输出列表,列表中还有1个b,前面2个b删除了
    1) "a"
    2) "c"
    3) "b"
    4) "a"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    lset:替换指定位置的值

    lset <key> <index> <value>
    
    • 1

    将列表key下标为index的元素的值设置替换为value 。当index参数超出范围,或对一个空列表(key不存在)进行lset时,返回一个错误。操作成功返回 ok ,否则返回错误信息。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> rpush name zhangsan lisi wangwu zhangliu #列表name中添加4个元素
    (integer) 4
    127.0.0.1:6379> lrange name 0 -1
    1) "zhangsan"
    2) "lisi"
    3) "wangwu"
    4) "zhangliu"
    127.0.0.1:6379> lset name 1 lily #将name集合中第2个元素lisi替换为lily
    OK
    127.0.0.1:6379> lrange name 0 -1 #name列表所有元素
    1) "zhangsan"
    2) "lily"
    3) "wangwu"
    4) "zhangliu"
    127.0.0.1:6379> lset name 10 lily #索引超出范围,报错
    (error) ERR index out of range
    127.0.0.1:6379> lset name1 1 lily #name1集合不存在,报错
    (error) ERR no such key
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    数据结构

    List的数据结构为快速链表quickList,首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,也就是压缩列表。它将所有的元素紧挨着一起存储,分配的是一块连续的内存。当就比较多的时候才会改成quickList。因为普通的链表需要的附加指针空间太大,会比较浪费空间,比如这个列表里存储的只是int类型的书,结构上还需要2个额外的指针prev和next。redis将链表和ziplist结合起来组成了quicklist。也就是将多个ziplist使用双向指针串起来使用,这样既满足了快速的插入删除性能,又不会出现太大的空间冗余。

    redis集合(Set)

    简介

    redis的set对外提供的功能与list类似,是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择。

    redis的set是string类型的无序集合,他的底层实际是一个value为null的hash表。

    常用命令

    sadd:添加一个或多个元素

    sadd <key> <value1> <value2> ...
    
    • 1

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> sadd name zhangsan lisi wangwu zhaoliu zhangsan #name中放入5个元素,会自动去重,成功插入4个
    (integer) 4
    
    • 1
    • 2
    • 3
    • 4

    smembers:取出所有元素

    smembers <key>
    
    • 1

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> sadd name zhangsan lisi wangwu zhaoliu
    (integer) 4
    127.0.0.1:6379> smembers name
    1) "zhangsan"
    2) "zhangliu"
    3) "wangwu"
    4) "lisi"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    sismember:判断集合中是否有某个值

    sismember <key> <value>
    
    • 1

    断集合key中是否包含元素value,1:有,0:没有

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> sadd name zhangsan lisi wangwu zhaoliu
    (integer) 4
    127.0.0.1:6379> sismember zhangsan #判断name中是否包含zhangsan,1:有
    (integer) 1
    127.0.0.1:6379> sismember mike #判断name中是否包含mike,0:无
    (integer) 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    scard:返回集合中元素的个数

    scard <key>
    
    • 1

    返回集合key的基数(集合中元素的数量),当key不存在时,返回0 。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> sadd name zhangsan lisi wangwu zhaoliu
    (integer) 4
    127.0.0.1:6379> scard name
    (integer) 4
    127.0.0.1:6379> scard name1
    (integer) 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    srem:删除多个元素

    srem key member [member ...]
    
    • 1

    移除集合key中的一个或多个member元素,不存在的member元素会被忽略。当key不是集合类型,返回一个错误。当删除成功时,返回成功移除的元素的数量,不包括被忽略的元素。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> sadd name zhangsan lisi wangwu zhaoliu
    (integer) 4
    127.0.0.1:6379> smembers name #无须集合,排列不是按顺序
    1) "zhangsan"
    2) "zhaoliu"
    3) "wangwu"
    4) "lisi"
    127.0.0.1:6379> srem name zhangsan lisi #删除name集合中的zhangsan和lisi
    (integer) 2
    127.0.0.1:6379> smembers name #获取name集合所有元素,剩下2个了
    1) "zhangliu"
    2) "wangwu"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    spop:随机弹出多个值

    spop <key> <count>
    
    • 1

    随机从key集合中弹出(弹出即是删除)count个元素,count默认值为1。返回被移除的随机元素。当key不存在或key是空集时,返回nil。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> sadd name zhangsan lisi wangwu zhaoliu
    (integer) 4
    127.0.0.1:6379> smembers name #无须集合,排列不是按顺序
    1) "zhangsan"
    2) "zhaoliu"
    3) "wangwu"
    4) "lisi"
    127.0.0.1:6379> spop name #随机弹出1个元素,被弹出的元素会被删除,随机情况我本机执行如此结果
    "wangwu"
    127.0.0.1:6379> spop name 2 #随机弹出2个元素,随机情况我本机执行如此结果
    1) "lisi"
    2) "zhangsan"
    127.0.0.1:6379> smembers name #输出剩下的元素
    1) "zhaoliu"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    srandmember:随机获取多个元素,不会从集合中删除

    srandmember <key> <count>
    
    • 1

    从key指定的集合中随机返回count个元素,count可以不指定,默认值是1。只提供key参数时,返回一个元素;如果集合为空,返回nil。如果提供了count参数,那么返回一个数组;如果集合为空,返回空数组。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> sadd name zhangsan lisi wangwu zhaoliu
    (integer) 4
    127.0.0.1:6379> smembers name #无须集合,排列不是按顺序
    1) "zhangsan"
    2) "zhaoliu"
    3) "wangwu"
    4) "lisi"
    127.0.0.1:6379> srandmember name
    "zhaoliu"
    127.0.0.1:6379> srandmember name 3
    1) "zhangsan"
    2) "lisi"
    3) "wangwu"
    127.0.0.1:6379> smembers name #输出name集合中所有元素,元素个数未变
    1) "zhangsan"
    2) "zhaoliu"
    3) "wangwu"
    4) "lisi"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    smove:将某个原创从一个集合移动到另一个集合

    smove <source> <destination> member
    
    • 1

    将member元素从source集合移动到destination集合。如果source集合不存在或不包含指定的member元素,则smove命令不执行任何操作,仅返回0。否则,member元素从source集合中被移除,并添加到destination集合中去。当destination集合已经包含member元素时,smove命令只是简单地将source集合中的member元素删除。当source或destination不是集合类型时,返回一个错误。如果member元素被成功移除,返回1。如果member元素不是source集合的成员,并且没有任何操作对destination集合执行,那么返回0。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> sadd name1 zhangsan lisi
    (integer) 2
    127.0.0.1:6379> sadd name2 wangwu zhaoliu
    (integer) 2
    127.0.0.1:6379> smove name1 name2 zhangsan #将name1中的zhangsan移动到name2
    (integer) 1
    127.0.0.1:6379> smembers name1 #输出name1集合
    1) "lisi"
    127.0.0.1:6379> smembers name2 #输出name2集合
    1) "zhangsan"
    2) "zhaoliu"
    3) "wangwu"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    sinter:取多个集合的交集

    sinter key [key ...]
    
    • 1

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> sadd name1 zhangsan lisi
    (integer) 2
    127.0.0.1:6379> sadd name2 wangwu zhaoliu zhangsan
    (integer) 3
    127.0.0.1:6379> sinter name1 name2 #返回2个集合的交集,只有:[zhangsan]
    1) "zhangsan"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    sinterstore:将多个集合的交集放到一个新的集合中

    sinterstore destination key [key ...]
    
    • 1

    这个命令类似于sinter命令,但它将结果保存到destination集合,而不是简单地返回结果集。执行成功后,返回结果集中的成员数量。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    127.0.0.1:6379> sadd name1 zhangsan lisi
    (integer) 2
    127.0.0.1:6379> sadd name2 wangwu zhaoliu zhangsan
    (integer) 3
    127.0.0.1:6379> sinterstore name3 name1 name2 #返回2个集合的交集并放入name3中,只有:[zhangsan]
    (integer) 1
    127.0.0.1:6379> smembers name3
    1) "zhangsan"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    sunion:取多个集合的并集,自动去重

    sunion key [key ...]
    
    • 1

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    127.0.0.1:6379> sadd name1 zhangsan lisi
    (integer) 2
    127.0.0.1:6379> sadd name2 wangwu zhaoliu zhangsan
    (integer) 3
    127.0.0.1:6379> sunion name1 name2 #返回2个集合的并集,去重复
    1) "zhangsan"
    2) "zhaoliu"
    3) "wangwu"
    4) "lisi"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    sunionstore:将多个集合的并集放到一个新的集合中

    sunionstore destination key [key ...]
    
    • 1

    这个命令类似于sunion命令,但它将结果保存到destination集合,而不是简单地返回结果集。执行成功后,返回结果集中的成员数量。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    127.0.0.1:6379> sadd name1 zhangsan lisi
    (integer) 2
    127.0.0.1:6379> sadd name2 wangwu zhaoliu zhangsan
    (integer) 3
    127.0.0.1:6379> sunionstore name3 name1 name2 #返回2个集合的并集并放入那么3,去重复
    (integer) 4
    127.0.0.1:6379> smembers name3
    1) "zhangsan"
    2) "zhaoliu"
    3) "wangwu"
    4) "lisi"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    sdiff:取多个集合的差集

    sdiff key [key ...]
    
    • 1

    返回一个集合的全部成员,该集合是所有给定集合之间的差集。不存在的key被视为空集。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    127.0.0.1:6379> sadd name1 zhangsan lisi
    (integer) 2
    127.0.0.1:6379> sadd name2 wangwu zhaoliu zhangsan
    (integer) 3
    127.0.0.1:6379> sdiff name1 name2 #返回name1中有的而name2中没有的元素
    1) "lisi"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    sdiffstore:将多个集合的差集放到一个新的集合中

    sdiffstore destination key [key ...]
    
    • 1

    类似sdiff命令,但它将结果保存到destination集合,而不是简单地返回结果集。执行成功后,返回结果集中的成员数量。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    127.0.0.1:6379> sadd name1 zhangsan lisi
    (integer) 2
    127.0.0.1:6379> sadd name2 wangwu zhaoliu zhangsan
    (integer) 3
    127.0.0.1:6379> sdiffstore name3 name1 name2 #返回name1中有的而name2中没有的元素,存入name3中
    (integer) 1
    127.0.0.1:6379> smembers name3 #输出name3
    1) "lisi"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    数据结构

    set数据结构是字典,字典是用hash表实现的。Java中的HashSet的内部实现使用HashMap,只不过所有的value都指向同一个对象。Redis的set结构也是一样的,它的内部也使用hash结构,所有的value都指向同一个内部值。

    redis哈希(Hash)

    简介

    Redis hash是一个键值对集合。

    Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。

    类似于java里面的Map

    常用命令

    hset:设置多个field的值

    hset key field value [field value ...]
    
    • 1

    将哈希表key中的域field的值设为 value 。如果key不存在,一个新的哈希表被创建并进行hset操作。如果域field已经存在于哈希表中,旧值将被覆盖。如果field是哈希表中的一个新建域,并且值设置成功,返回1。如果哈希表中域field已经存在且旧值已被新值覆盖,返回0。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> hset user name zhangsan age 30 #哈希表user中设置2个域:name和age,name的值为zhangsan,age的值为30
    (integer) 2
    
    • 1
    • 2
    • 3
    • 4

    hget:获取指定filed的值

    hget key field
    
    • 1

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> hset user name zhangsan age 30 #哈希表user中设置2个域:name和age,name的值为zhangsan,age的值为30
    (integer) 2
    127.0.0.1:6379> hget user name #获取user中的name
    "zhangsan"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    hgetall:返回hash表所有的域和值

    hgetall key
    
    • 1

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> hset user name zhangsan age 30 #哈希表user中设置2个域:name和age,name的值为zhangsan,age的值为30
    (integer) 2
    127.0.0.1:6379> hgetall user #获取user所有信息
    1) "name"
    2) "zhangsan"
    3) "age"
    4) "30"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    hmset:和hset类似(已弃用)

    hmset key field value [field value ...]
    
    • 1

    hexists:判断给定的field是否存在,1:存在,0:不存在

    hexists key field
    
    • 1

    查看哈希表key中,给定域field是否存在。如果哈希表含有给定域,返回1。如果哈希表不含有给定域,或key不存在,返回0。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> hset user name zhangsan age 30 #哈希表user中设置2个域:name和age,name的值为zhangsan,age的值为30
    (integer) 2
    127.0.0.1:6379> hexists user name #user中存在name域
    (integer) 1
    127.0.0.1:6379> hexists user address #user中不存在address域,返回0
    (integer) 0
    127.0.0.1:6379> hexists user1 address #user1这个key不存在,返回0
    (integer) 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    hkeys:列出所有的filed

    hkeys key
    
    • 1

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> hset user name zhangsan age 30 #哈希表user中设置2个域:name和age,name的值为zhangsan,age的值为30
    (integer) 2
    127.0.0.1:6379> hkeys user #获取user中的所有filed
    1) "name"
    2) "age"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    hvals:列出所有的value

    hvals key
    
    • 1

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> hset user name zhangsan age 30 #哈希表user中设置2个域:name和age,name的值为zhangsan,age的值为30
    (integer) 2
    127.0.0.1:6379> hvals user #获取user中的所有filed的值列表
    1) "zhangsan"
    2) "30"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    hlen:返回filed的数量

    hlen key
    
    • 1

    返回哈希表key中域的数量。当key不存在时,返回0。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> hset user name zhangsan age 30 #哈希表user中设置2个域:name和age,name的值为zhangsan,age的值为30
    (integer) 2
    127.0.0.1:6379> hlen user
    (integer) 2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    hincrby:filed的值加上指定的增量

    hincrby key field increment
    
    • 1

    为哈希表key中的域field的值加上增量increment。增量也可以为负数,相当于对给定域进行减法操作。如果key不存在,一个新的哈希表被创建并执行hincrby命令。如果域field不存在,那么在执行命令前,域的值被初始化为0。对一个储存字符串值的域field 执行hincrby命令将造成一个错误。执行hincrby命令之后,哈希表key中域field的值。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> hset user name zhangsan age 30 #哈希表user中设置2个域:name和age,name的值为zhangsan,age的值为30
    127.0.0.1:6379> hget user age #获取user中age的值
    "30"
    127.0.0.1:6379> hincrby user age 10 #user中的age值增加10
    (integer) 40
    127.0.0.1:6379> hincrby user height 500 #user中的height值增加500,height这个域不存在,则会先添加,然后再执行hincrby
    (integer) 500
    127.0.0.1:6379> hincrby user name 10 #user中的name值不是数值的,报错
    (error) ERR hash value is not an integer
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    hsetnx:当filed不存在的时候,设置filed的值

    hsetnx key field value
    
    • 1

    将哈希表key中的域field的值设置为value,当且仅当域field不存在。若域field已经存在,该操作无效。如果key不存在,一个新哈希表被创建并执行hsetnx命令。如果执行成功,返回1。如果给定域已经存在且没有操作被执行,返回0。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> hset user name zhangsan age 30 #哈希表user中设置2个域:name和age,name的值为zhangsan,age的值为30
    127.0.0.1:6379> hsetnx user name lisi #name已存在,设置失败,返回0
    (integer) 0
    127.0.0.1:6379> hget user name #name依旧是zhangsan
    "zhangsan"
    127.0.0.1:6379> hsetnx user address beijing #address不存在,设置成功
    (integer) 1
    127.0.0.1:6379> hget user address #输出address的值
    "beijing"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    数据结构

    Hash类型对应的数据结构是2中:ziplist(压缩列表),hashtable(哈希表)。

    当field-value长度较短个数较少时,使用ziplist,否则使用hashtable。

    redis有序集合Zset(Sorted Set)

    简介

    redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。

    不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。

    集合的成员是唯一的,但是评分是可以重复的。

    因为元素是有序的,所以你可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。

    访问有序集合中的中间元素也是非常快的,因为你能够使用有序集合作为一个没有重复成员你的智能列表。

    常用命令

    zadd:添加元素

    zadd <key> <score1> <member1> <score2> <member2> ...
    
    • 1

    将一个或多个member元素及其score值加入到有序集key当中。如果某个member已经是有序集的成员,那么更新这个member的score 值,并通过重新插入这个member元素,来保证该member在正确的位置上。score值可以是整数值或双精度浮点数。如果key不存在,则创建一个空的有序集并执行zadd操作。当key存在但不是有序集类型时,返回一个错误。执行成功后,返回被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> zadd chengji 100 java 80 c 90 c++ 50 php 70 js #创建名称为chengji的zset,添加了5个元素
    (integer) 5
    
    • 1
    • 2
    • 3
    • 4

    zrange:score升序,获取指定索引范围的元素

    zrange key start top [withscores]
    
    • 1

    返回存储在有序集合key中的指定范围的元素。 返回的元素可以认为是按score从最低到最高排列,如果得分相同,将按字典排序。下标参数start和stop都以0为底,以0表示有序集第一个成员,以1表示有序集第二个成员,以此类推。你也可以使用负数下标,以-1表示最后一个成员,-2表示倒数第二个成员,以此类推。如果使用withscores,表示让成员和它的score值一并返回,返回列表以value1, score1, …, valueN, scoreN 的格式表示。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> zadd chengji 100 java 80 c 90 c++ 50 php 70 js #创建名称为chengji的zset,添加了5个元素
    (integer) 5
    127.0.0.1:6379> zrange chengji 0 -1 #按score升序,返回chengji中所有元素的值
    1) "php"
    2) "js"
    3) "c"
    4) "c++"
    5) "java"
    127.0.0.1:6379> zrange chengji 0 -1 withscores #按score升序,返回所有元素的值以及score
    1) "php"
    2) "50"
    3) "js"
    4) "70"
    5) "c"
    6) "80"
    7) "c++"
    8) "90"
    9) "java"
    10) "100"
    127.0.0.1:6379> zrange chengji 2 4 #返回索引范围[2,4]内的3个元素
    1) "c"
    2) "c++"
    3) "java"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    zrevrange:score降序,获取指定索引范围的元素

    zrevrange key start stop [withscores]
    
    • 1

    返回存储在有序集合key中的指定范围的元素。 返回的元素可以认为是按score最高到最低排列, 如果得分相同,将按字典排序。返回的元素可以认为是按score从最低到最高排列,如果得分相同,将按字典排序。下标参数start和stop都以0为底,以0表示有序集第一个成员,以1表示有序集第二个成员,以此类推。你也可以使用负数下标,以-1表示最后一个成员,-2表示倒数第二个成员,以此类推。如果使用withscores,表示让成员和它的score值一并返回,返回列表以value1, score1, …, valueN, scoreN 的格式表示。

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> zadd chengji 100 java 80 c 90 c++ 50 php 70 js #创建名称为chengji的zset,添加了5个元素
    (integer) 5
    127.0.0.1:6379> zrevrange chengji 0 -1 #按照score降序获取所有元素
    1) "java"
    2) "c++"
    3) "c"
    4) "js"
    5) "php"
    127.0.0.1:6379> zrevrange chengji 0 2 #按照score降序获取前3名
    1) "java"
    2) "c++"
    3) "c"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    zrangebyscore:按照score升序,返回指定score范围内的数据

    zrangebyscore key min max [withscores] [limit offset count]
    
    • 1

    返回有序集key中,所有score值介于min和max之间(包括等于min或max)的成员。有序集成员按score值递增(从小到大)次序排列。具有相同score值的成员按字典序来排列(该属性是有序集提供的,不需要额外的计算)。可选的limit参数指定返回结果的数量及区间(就像SQL中的 select limit offset, count ),注意当offset很大时,定位offset的操作可能需要遍历整个有序集,此过程最坏复杂度为 O(N) 时间。如果使用withscores,表示将有序集成员及其score值一起返回。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> zadd chengji 100 java 80 c 90 c++ 50 php 70 js #创建名称为chengji的zset,添加了5个元素
    (integer) 5
    127.0.0.1:6379> zrangebyscore chengji 70 90 #score升序,获取score位于[70,90]区间中的元素值
    1) "js"
    2) "c"
    3) "c++"
    127.0.0.1:6379> zrangebyscore chengji 70 90 withscores #score升序,获取score位于[70,90]区间中的元素值及score
    1) "js"
    2) "70"
    3) "c"
    4) "80"
    5) "c++"
    6) "90"
    127.0.0.1:6379> zrangebyscore chengji 70 90 withscores limit 1 2 #相当于:select value, score from chengji集合 where score>=70 and score<=90 order by score asc limit 1,2
    1) "c"
    2) "80"
    3) "c++"
    4) "90"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    zrevrangebyscore:按照score降序,返回指定score范围内的数据

    zrevrangebyscore key max min [withscores] [limit offset count]
    
    • 1

    除了成员按score值递减的次序排列这一点外, zrevrangebyscore命令的其它方面和zrangebyscore命令一样。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> zadd chengji 100 java 80 c 90 c++ 50 php 70 js #创建名称为chengji的zset,添加了5个元素
    (integer) 5
    127.0.0.1:6379> zrevrangebyscore chengji 100 90 #score降序,获取score位于[70,90]区间中的元素值
    1) "java"
    2) "c++"
    127.0.0.1:6379> zrevrangebyscore chengji 100 90 withscores #score降序,获取score位于[70,90]区间中的元素值及score
    1) "java"
    2) "100"
    3) "c++"
    4) "90"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    zincrby:为指定元素的score加上指定的增量

    zincrby key increment member
    
    • 1

    为有序集key的成员member的score值加上增量increment。可以通过传递一个负数值increment ,让score减去相应的值,比如zincrby key -5 member,就是让member的score值减去5。当key不存在,或member不是key的成员时, zincrby key increment member等同于 zadd key increment member。当key不是有序集类型时,返回一个错误。score值可以是整数值或双精度浮点数。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> zadd chengji 90 java 70 c 80 c++ #集合chengji中添加3个元素:java、c、c++,对应的score分别是:90、70、80
    (integer) 3
    127.0.0.1:6379> zrevrange chengji 0 -1 withscores #输出集合chengji中的元素,包含score
    1) "java"
    2) "90"
    3) "c++"
    4) "80"
    5) "c"
    6) "70"
    127.0.0.1:6379> zincrby chengji 5 java #对chengji中的元素java的score加5,变成95了
    "95"
    127.0.0.1:6379> zrevrange chengji 0 -1 withscores # 输出集合元素,注意java的score是95了
    1) "java"
    2) "95"
    3) "c++"
    4) "80"
    5) "c"
    6) "70"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    zrem:删除集合中多个元素

    zrem key member [member ...]
    
    • 1

    移除有序集key中的一个或多个成员,不存在的成员将被忽略。当key存在但不是有序集类型时,返回一个错误。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> zadd chengji 90 java 70 c 80 c++ #集合chengji中添加3个元素:java、c、c++,对应的score分别是:90、70、80
    (integer) 3
    127.0.0.1:6379> zrange chengji 0 -1 #输出集合chengji中所有元素
    1) "c"
    2) "c++"
    3) "java"
    127.0.0.1:6379> zrem chengji c c++ #删除集合chengji中的2个元素:c、c++
    (integer) 2
    127.0.0.1:6379> zrange chengji 0 -1 #输出集合chengji中所有元素
    1) "java"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    zremrangebyrank:根据索引范围删除元素

    zremrangebyrank key start stop
    
    • 1

    移除有序集key中,指定排名(rank)区间内的所有成员。区间分别以下标参数start和stop指出,包含start和stop在内。下标参数start和stop都以0为底,以0表示有序集第一个成员,以1表示有序集第二个成员,以此类推。你也可以使用负数下标,以-1表示最后一个成员,-2表示倒数第二个成员,以此类推。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> zadd chengji 90 java 70 c 80 c++ #集合chengji中添加3个元素:java、c、c++,对应的score分别是:90、70、80
    (integer) 3
    127.0.0.1:6379> zrange chengji 0 -1 #输出集合topx中所有元素
    1) "c"
    2) "c++"
    3) "java"
    127.0.0.1:6379> zremrangebyrank chengji 0 1 #删除索引范围[0,1]的数据
    (integer) 2
    127.0.0.1:6379> zrange chengji 0 -1 #输出chengji中所有元素
    1) "java"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    zremrangebyscore:根据score的范围删除元素

    zremrangebyscore key min max
    
    • 1

    移除有序集key中,所有score值介于min和max之间(包括等于min或max)的成员。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> zadd chengji 90 java 70 c 80 c++ 50 php #chengji集合中添加4个元素
    (integer) 4
    127.0.0.1:6379> zrange chengji 0 -1 withscores #输出chengji中所有元素值、score
    1) "php"
    2) "50"
    3) "c"
    4) "70"
    5) "c++"
    6) "80"
    7) "java"
    8) "90"
    127.0.0.1:6379> zremrangebyscore chengji 70 80 #删除score位于[70,80]区间的元素
    (integer) 2
    127.0.0.1:6379> zrange chengji 0 -1 withscores #输出剩下的元素
    1) "php"
    2) "50"
    3) "java"
    4) "90"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    zcount:统计指定score范围内元素的个数

    zcount key min max
    
    • 1

    返回有序集key中, score值在min和max之间(默认包括score值等于min或max)的成员的数量。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> zadd chengji 90 java 70 c 80 c++ 50 php #chengji集合中添加4个元素
    (integer) 4
    127.0.0.1:6379> zcount chengji 80 100 #统计score位于[80,100]区间中的元素个数
    (integer) 2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    zrank:按照score升序,返回某个元素在集合中的排名

    zrank key member
    
    • 1

    返回有序集key中成员member的排名。其中有序集成员按score值递增(从小到大)顺序排列。排名以0为底,score值最小的成员排名为0。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> zadd chengji 90 java 70 c 80 c++ 50 php #chengji集合中添加4个元素
    (integer) 4
    127.0.0.1:6379> zrank chengji c #获取元素c的排名,返回1表示排名第2
    (integer) 1
    127.0.0.1:6379> zrange chengji 0 -1 #输出集合中所有元素,看一下c的位置确实是2
    1) "php"
    2) "c"
    3) "c++"
    4) "java"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    zrevrank:按照score降序,返回某个元素在集合中的排名

    zrevrank key member
    
    • 1

    zrevrank与上面的zrank原理一样,只不过是降序排名。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> zadd chengji 90 java 70 c 80 c++ 50 php #chengji集合中添加4个元素
    (integer) 4
    127.0.0.1:6379> zrange chengji 0 -1
    1) "php"
    2) "c"
    3) "c++"
    4) "java"
    127.0.0.1:6379> zrevrank chengji java #score降序,得到java的排名,排在第1位
    (integer) 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    zscore:返回集合中指定元素的score

    zscore key member
    
    • 1

    返回有序集key中,成员member的score值。如果member元素不是有序集key的成员,或key不存在,返回nil。

    示例:

    127.0.0.1:6379> flushdb #清空db,方便测试
    OK
    127.0.0.1:6379> zadd chengji 90 java 70 c 80 c++ 50 php #chengji集合中添加4个元素
    (integer) 4
    127.0.0.1:6379> zrange chengji 0 -1 #输出chengji集合所有元素
    1) "php"
    2) "c"
    3) "c++"
    4) "java"
    127.0.0.1:6379> zscore chengji java #获取集合chengji中java的score
    "90"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    数据结构

    SortedSet(zset)是redis提供的一个非常特别的数据结构,内部使用到了2种数据结构。

    • hash表

      类似于java中的Map,key为集合中的元素,value为元素对应的score,可以用来快速定位元素定义的score。

    • 跳表

      类似java中的ConcurrentSkipListSet,根据score的值排序后生成的一个跳表,可以快速按照位置的顺序或者score的顺序查询元素。

  • 相关阅读:
    springboot 集成webSocket
    QT 第五天 TCP通信与数据库
    用了10年开源工具,换了Smartbi后,3分钟搞定一份报表
    IDEA配置tomcat运行环境
    a16z:推翻互联网的偶然君主制,如何设计Web3平台治理?
    GNU LD脚本命令语言(一)
    insufficient permissions for device
    Ubuntu-Docker-STF(devicefarmer)环境搭建 (android 12)
    C++ 核心指南之资源管理(中)分配和释放
    杰理之音频解码的使用流程【篇】
  • 原文地址:https://blog.csdn.net/lili40342/article/details/127897689