redis五种数据结构相关命令

nge

127.0.0.1:6379> spop stest 3

1) "5"

2) "3"

3) "1"

127.0.0.1:6379> sadd stest 1 2 3 4 5 6

(integer) 6

127.0.0.1:6379> smembers stest

1) "1"

2) "2"

3) "3"

4) "4"

5) "5"

6) "6"

127.0.0.1:6379> spop stest 10

1) "1"

2) "2"

3) "3"

4) "4"

5) "5"

6) "6"

Srandmember

127.0.0.1:6379> smembers stest

1) "1"

2) "2"

3) "3"

4) "4"

5) "5"

127.0.0.1:6379> srandmember stest -1

1) "3"

127.0.0.1:6379> srandmember stest -10

 1)"3"

 2)"1"

 3)"3"

 4)"4"

 5)"3"

 6)"4"

 7)"3"

 8)"3"

 9)"1"

10) "3"

127.0.0.1:6379> srandmember stest 10

1) "1"

2) "2"

3) "3"

4) "4"

5) "5"

Srem

127.0.0.1:6379> smembers stest

1) "1"

2) "2"

3) "3"

4) "4"

5) "5"

127.0.0.1:6379> srem stest 10 9

(integer) 0

127.0.0.1:6379> srem stest 1 3 5

(integer) 3

127.0.0.1:6379> smembers stest

1) "2"

2) "4"

Sunion

127.0.0.1:6379> smembers stest

1) "2"

2) "4"

127.0.0.1:6379> smembers stest2

1) "4"

2) "5"

3) "6"

4) "7"

5) "8"

127.0.0.1:6379> sunion stest stest2

1) "2"

2) "4"

3) "5"

4) "6"

5) "7"

6) "8"

Sunionstore

127.0.0.1:6379> smembers stest3

1) "1"

2) "2"

127.0.0.1:6379> smembers stest

1) "2"

2) "4"

127.0.0.1:6379> smembers stest2

1) "4"

2) "5"

3) "6"

4) "7"

5) "8"

127.0.0.1:6379> sunionstore stest3 steststest2

(integer) 6

127.0.0.1:6379> smembers stest3

1) "2"

2) "4"

3) "5"

4) "6"

5) "7"

6) "8"

注意:

在测试的时候发现一个问题,介绍set集合的时候总是说 set集合是无序的可以有的情况set确是有序的,下面演示

127.0.0.1:6379> smember stest

(error) ERR unknown command 'smember'

127.0.0.1:6379> sadd stest 1

(integer) 1

127.0.0.1:6379> smembers stest

1) "1"

127.0.0.1:6379> sadd stest 4

(integer) 1

127.0.0.1:6379> sadd stest 2

(integer) 1

127.0.0.1:6379> sadd stest -1

(integer) 1

127.0.0.1:6379> sadd stest 10

(integer) 1

127.0.0.1:6379> smembers stest

1) "-1"

2) "1"

3) "2"

4) "4"

5) "10"

可以看到我按照无序添加元素,最后获取出来还是有序的为什么呢?

在redis里,集合的编码有两种,intset(整数集合)或者hashtable(哈希表)。intset编码的集合里面的元素是有序的(按照整数从小到大排列),hashtable编码的集合是无序的。

1.当集合同时满足下面两个条件时,会使用intset编码:

保存的所有元素都是整数

2.元素数量不超过512个(这个值可以通过配置文件里的set-max-intset-entries进行调整)

127.0.0.1:6379> object encoding stest

"intset"

127.0.0.1:6379> sadd stest2 c c# javaphp go

(integer) 5

127.0.0.1:6379> smembers stest2

1) "c#"

2) "php"

3) "c"

4) "java"

5) "go"

127.0.0.1:6379> object encoding stest2

"hashtable"

Sortedset数据结构

String数据结构

介绍:key-value型的数据,根据redis官方文档,value的最大值为512M

命令

描述

用法

Set

(1)    将字符串值value关联到key

(2)    Key已关联则覆盖,无视类型

(3)    原来key带有生存时间TTL,那么TTL被清除

SET key value  [EX seconds] [PX milliseconds] [NX|XX]

Get

(1)    返回key关联的字符串值

(2)    可以不存在返回nil

(3)    Key存储的不是字符串,返回错误,因为get只用于处理字符串

Get  key

mset

(1)    同时设置一个或多个          key-value键值对

(2)    某个给定的key已经存在,    那么mset会覆盖旧值

(3)    如果上面的覆盖不是希望的,  那么使用MSETNX命令,      所有key都不存在才会进行覆盖

(4)    MSET是一个原子性操作,所有key都会同一时间被设置,不会存在有些更新有些没有更新的情况

Mset  key value [key value]

Msetnx

和mset一样只是key重复是不覆盖,所有key都不存在才会进行覆盖,当有重复时返回0

Msetnx  key value [key value]

mget

(1)    返回一个或多个给定key对应的value

(2)    某个key不存在这个key返回nil

Mget  key [key key]

 

Setex

(1)    将value关联到key

(2)    设置key生存时间为seconds,单位秒

(3)    如果可以key对应的value已经存在,则覆盖旧值

(4)    Set也可以设置失效时间,但是不同于setnx是一个原子操作,及关联值于设置生存时间同一时间完成

Setex  key seconds value

Setnx

(1)    将key的值设置成value,当且仅当key不存在

(2)    若给定的key已经存在,sexnx不做任何动作

 

一些特殊的string命令·

命令

描述

用法

INCR

(1)Key中存储的数字值+1,返回增加之后的值

(2)Key不存在,那么Key的值被初始化为0再执行INCR

(3)如果值包含错误类型或者字符串不能被表示为数字,那么返回错误

(4)值限制在64位有符号数字表示之内,即-9223372036854775808~9223372036854775807

INCR key

DECR

(1)Key中存储的数字值-1

(2)其余同INCR

DECR key

INCRBY

(1)将key所存储的值加上增量返回增加之后的值

(2)其余同INCR

INCRBY key increment

DECRBY

(1)将key所存储的值减去减量decrement

(2)其余同INCR

DECRBY key decrement

使用场景

1.原先单机环境中统计在线人数,变成分布式部署之后可以使用INCR/DECR

2.由于Redis本身极高的读写性能,一些秒杀的场景库存增减可以基于Redis来做而不是直接操作DB

结果展示

Incr:

127.0.0.1:6379> incr zbh

(error) ERR value is not an integer or outof range

127.0.0.1:6379> incr zy

(integer) 322

127.0.0.1:6379> get zy

"322"

127.0.0.1:6379> incr zy

(integer) 323

127.0.0.1:6379> get zy

"323"

decr

127.0.0.1:6379> decrzbh

(error) ERR value is not an integer or outof range

127.0.0.1:6379> get zy

"323"

127.0.0.1:6379> decr zy

(integer) 322

127.0.0.1:6379> get zy

"322"

127.0.0.1:6379>

127.0.0.1:6379> get zbh

"zzh"

incrby

127.0.0.1:6379> incrby zbh 10

(error) ERR value is not an integer or outof range

127.0.0.1:6379> get zy

"332"

127.0.0.1:6379> incrby zy 3

(integer) 335

127.0.0.1:6379> get zy

"335"

decrby

127.0.0.1:6379> decrby zbh 1

(error) ERR value is not an integer or outof range

127.0.0.1:6379> get zbh

"zzh"

127.0.0.1:6379> get zy

"335"

127.0.0.1:6379> decrby zy 23123

(integer) -22788

127.0.0.1:6379> get zy

"-22788"

Hash数据结构

Hash与string的区别,其实就是在key-value外面套了一层

命令

描述

用法

Hset

将哈希表ke中的field的值设为value

Key不存在,创建新的hash表

Field已存在,覆盖旧值

 

HSET key field  value

HGET

返回哈希表key中给定域field的值

HGET key field

HEXISTS

查看哈希表key中,给定域field是否存在,存在返回1,不存在返回0

HEXISTS key  field

HGETALL

返回哈希表key中,所有的域和值

HGETALL key

HKEYS

返回哈希表key中的所有域

HKEYS key

Hvals

返回哈希表key中所有的域和值

HVALS key

HINCRBY

(1)为哈希表key中的域field加上增量increment

(2)其余同INCR命令

 

HINCRYBY key  filed increment

HLEN

返回哈希表key中域的数量 

HLEN key 

HMGET

(1)返回哈希表key中,一个或多个给定域的值

(2)如果给定的域不存在于哈希表,那么返回一个nil值

 

HMGET key  field [field ...]

HMSET

(1)同时将多个field-value对设置到哈希表key中

(2)会覆盖哈希表中已存在的域

(3)key不存在,那么一个空哈希表会被创建并执行HMSET操作

 

HMSET key  field value [field value ...]

HDEL

(1)删除哈希表key中的一个或多个指定域

(2)不存在的域将被忽略

 

HDEL key filed  [field ...]

结果展示:

Hset: key = thash field =zzh

127.0.0.1:6379> hset thash zzh 111

(integer) 1

127.0.0.1:6379> hset t zzh 111

(integer) 1

Hget:

127.0.0.1:6379> hget t zzh

"111"

Hexists

127.0.0.1:6379> hexists t zzh

(integer) 1

127.0.0.1:6379> hexists t z

(integer) 0

Hgetall:

127.0.0.1:6379> hgetall t

1) "zzh"

2) "111"

3) "1"

4) "1"

127.0.0.1:6379> hgetall thash

1) "zzh"

2) "111"

Hkeys:

127.0.0.1:6379> hkeys thash

1) "zzh"

127.0.0.1:6379> hkeys t

1) "zzh"

2) "1"

Hvals:

127.0.0.1:6379> hgetall thash

1) "zzh"

2) "101"

3) "z"

4) "123"

5) "zz"

6) "321"

7) "zzz"

8) "231"

127.0.0.1:6379> hvals thash

1) "101"

2) "123"

3) "321"

4) "231"

hincrby

127.0.0.1:6379> hkeys thash

1) "zzh"

127.0.0.1:6379> hincrby thash z -1

(integer) -1

127.0.0.1:6379> hget thash z

"-1"

Hlen

127.0.0.1:6379> hlen thash

(integer) 2

Hmget:

127.0.0.1:6379> hkeys thash

1) "zzh"

2) "z"

127.0.0.1:6379> hmget thash zzh z zz z1

1) "101"

2) "-1"

3) (nil)

4) (nil)

Hmset

127.0.0.1:6379> hkeys thash

1) "zzh"

2) "z"

127.0.0.1:6379> hmset thash z 123 zz 321zzz 231

OK

127.0.0.1:6379> hgetall thash

1) "zzh"

2) "101"

3) "z"

4) "123"

5) "zz"

6) "321"

7) "zzz"

8) "231"

Hdel

127.0.0.1:6379> hkeys thash

1) "zzh"

2) "z"

3) "zz"

4) "zzz"

127.0.0.1:6379> hdel thash z zz z1

(integer) 2

127.0.0.1:6379> hkeys thash

1) "zzh"

2) "zzz"

List数据结构

命令

描述

用法

LPUSH

(1)将一个或多个值value插入到列表key的表头

(2)如果有多个value值,那么各个value值按从左到右的顺序依次插入表头

(3)key不存在,一个空列表会被创建并执行LPUSH操作

(4)key存在但不是列表类型,返回错误

 

LPUSH key value [value ...]

LPUSHX

(1)将值value插入到列表key的表头,当且仅当key存在且为一个列表

(2)key不存在时,LPUSHX命令什么都不做

 

LPUSHX key value

LPOP

移除并返回列表key的头元素

LPOP key

LRANGE

(1)返回列表key中指定区间内的元素,区间以偏移量start和stop指定

(2)start和stop都以0位底

(3)可使用负数下标,-1表示列表最后一个元素,-2表示列表倒数第二个元素,以此类推

(4)start大于列表最大下标,返回空列表

(5)stop大于列表最大下标,stop=列表最大下标

LRANGE key start stop

LREM

(1)根据count的值,移除列表中与value相等的元素

(2)count>0表示从头到尾搜索,移除与value相等的元素,数量为count

(3)count<0表示从从尾到头搜索,移除与value相等的元素,数量为count

(4)count=0表示移除表中所有与value相等的元素

 

LREM key count value

LSET

(1)将列表key下标为index的元素值设为value

(2)index参数超出范围,或对一个空列表进行LSET时,返回错误

 

LSET key index value

LINDEX

返回列表key中,下标为index的元素

LINDEX key index

LINSERT

(1)将值value插入列表key中,位于pivot前面或者后面

(2)pivot不存在于列表key时,不执行任何操作

(3)key不存在,不执行任何操作

 

LINSERT key BEFORE|AFTER pivot value

LLEN

(1)返回列表key的长度

(2)key不存在,返回0

LLEN key

RPOP

移除并返回列表key的尾元素

RPOP key

RPOPLPUSH

在一个原子时间内,执行两个动作:

(1)将列表source中最后一个元素弹出并返回给客户端

(2)将source弹出的元素插入到列表desination,作为destination列表的头元素

(3)source和destination必须都是list类型

(4)当destination不存在时则创建

 

RPOPLPUSH source destination

RPUSH

1.将一个或多个值value插入到列表key的表尾

2.Key不存在则创建

3.返回list长度

RPUSH key value [value ...]

RPUSHX

(1)将value插入到列表key的表尾,当且仅当key存在并且是一个列表

(2)key不存在,RPUSHX什么都不做

 

RPUSHX key value

LTRIM

对一个列表进行修剪,让列表只返回指定区间内的元素,不存在指定区间内的都将被移除

LTRIM key start stop

结果展示

Lpush

127.0.0.1:6379> lpush ltest 1 2 3 4 5

(integer) 5

Lpushx

127.0.0.1:6379> lpushx ltest -1

(integer) 6

127.0.0.1:6379> lpushx ll -1

(integer) 0

Lpop

127.0.0.1:6379> lpop ltest

"-1"

Lrange

127.0.0.1:6379> lrange ltest -1 -3

(empty list or set)

127.0.0.1:6379> lrange ltest 0 3

1) "5"

2) "4"

3) "3"

4) "2"127.0.0.1:6379> lrangeltest 0 -1

1) "5"

2) "4"

3) "3"

4) "2"

5) "1"

127.0.0.1:6379> lrange ltest -3 -1

1) "3"

2) "2"

3) "1"

127.0.0.1:6379> lrange ltest 0 100

1) "5"

2) "4"

3) "3"

4) "2"

5) "1"

Lset

127.0.0.1:6379> lrange ltest 0 100

1) "5"

2) "4"

3) "3"

4) "2"

5) "1"

127.0.0.1:6379> lset ltest 100 23

(error) ERR index out of range

127.0.0.1:6379> lset ltest 0 -1

OK

127.0.0.1:6379> lrange ltest 0 100

1) "-1"

2) "4"

3) "3"

4) "2"

5) "1"

lindex

127.0.0.1:6379> lindex ltest 100

(nil)

127.0.0.1:6379> lindex ltest -1

"1"

127.0.0.1:6379> lindex ltest -100

(nil)

Linsert

127.0.0.1:6379> linsert ltest before -1100

(integer) 6

127.0.0.1:6379> linsert ltest after -1100

(integer) 7

Llen

127.0.0.1:6379> llen ltes

(integer) 0

127.0.0.1:6379> llen ltest

(integer) 7

Rpop

127.0.0.1:6379> rpop ltest

"1"

rpoplpush

127.0.0.1:6379> rpoplpush ltest ltest2

"2"

127.0.0.1:6379> rpoplpush ll ltest2

(nil)

127.0.0.1:6379> rpoplpush t ltest2

(error) WRONGTYPE Operation against a keyholding the wrong kind of value

127.0.0.1:6379> rpoplpush t t

(error) WRONGTYPE Operation against a keyholding the wrong kind of value

127.0.0.1:6379> rpoplpush ltest ltest

"3"

Rpush/rpushx

127.0.0.1:6379> rpush ltest 1 2 3 4

(integer) 9

127.0.0.1:6379> rpush ltest4 1 2 3

(integer) 3

127.0.0.1:6379> rpushx llll -1

(integer) 0

lrem

127.0.0.1:6379> lrange ltest 0 -1

1) "2"

2) "3"

3) "100"

4) "-1"

5) "100"

6) "4"

7) "1"

8) "2"

9) "4"

127.0.0.1:6379> lrem ltest -1 4

(integer) 1

127.0.0.1:6379> lrange ltest 0 -1

1) "2"

2) "3"

3) "100"

4) "-1"

5) "100"

6) "4"

7) "1"

8) "2"

127.0.0.1:6379> lrem ltest 1 4

(integer) 1

127.0.0.1:6379> lrange ltest 0 -1

1) "2"

2) "3"

3) "100"

4) "-1"

5) "100"

6) "1"

7) "2"

127.0.0.1:6379> lrem ltest 0 100

(integer) 2

127.0.0.1:6379> lrange ltest 0 -1

1) "2"

2) "3"

3) "-1"

4) "1"

5) "2"

Lrim

127.0.0.1:6379> lrange ltest 0 -1

1) "2"

2) "3"

3) "-1"

4) "1"

5) "2"

127.0.0.1:6379> ltrim ltest 0 2

OK

127.0.0.1:6379> lrange ltest 0 -1

1) "2"

2) "3"

3) "-1"

注意:

操作List千万注意区分LPUSH、RPUSH两个命令,把数据添加到表头和把数据添加到表尾是完全不一样的两种结果

另外List还有BLPOP、BRPOP、BRPOPLPUSH三个命令没有说,它们是几个POP的阻塞版本,即没有数据可以弹出的时候将阻塞客户端直到超时或者发现有可以弹出的元素为止

Set数据结构

命令

描述

用法

SADD 

(1)将一个或多个member元素加入到key中,已存在在集合的member将被忽略

(2)假如key不存在,则只创建一个只包含member元素做成员的集合

(3)当key不是set集合类型时,将返回一个错误 

SADD key number [member ...] 

SCARD 

 (1)返回key对应的集合中的元素数量

 SCARD key

SDIFF

 (1)返回一个集合的全部成员,该集合是第一个Key对应的集合和后面key对应的集合的差集

 SDIFF key [key ...]

 SDIFFSTORE

(1)和SDIFF类似,但结果保存到destination集合而不是简单返回结果集

(2) destination如果已存在,则覆盖

SDIFFSTORE destionation key [key ...] 

 SINTER

 (1)返回一个集合的全部成员,该集合是所有给定集合的交集

(2)不存在的key被视为空集

SINTER key [key ...] 

SINTERSTORE 

(1)和SINTER类似,但结果保存早destination集合而不是简单返回结果集

(2)如果destination已存在,则覆盖

(3)destination可以是key本身

SINTERSTORE destination key [key ...] 

SISMEMBER 

(1)判断member元素是否key的成员,0表示不是,1表示是 

SISMEMBER key member 

SMEMBERS

 (1)返回集合key中的所有成员

(2)不存在的key被视为空集

SMEMBERS key 

SMOVE 

(1)原子性地将member元素从source集合移动到destination集合

(2)source集合中不包含member元素,SMOVE命令不执行任何操作,仅返回0

(3)destination中已包含member元素,SMOVE命令只是简单做source集合的member元素移除

 SMOVE source desination member

SPOP

(1)如果不指定count,移除第一个

(2)count为正数且小于集合元素数量,那么返回一个count个元素的数组且数组中的元素各不相同而且随机and删除

(3)count为正数且大于等于集合元素数量,那么返回整个集合并移除

(4)count为负数时报错

Error ERR index out of range

(5)当移除之后发现集合为空删除key

SPOP key [count]

SRANDMEMBER

(1)返回集合中的一个随机元素,如果count不指定那么随机返回一个随机元素

(2)count为正数且小于集合元素数量,那么返回一个count个随机元素的数组且数组中的元素各不相同

(3)count为正数且大于等于集合元素数量,那么返回整个集合不重复

(4)count为负数那么命令返回一个数组,数组中的元素可能重复多次,数量为count的绝对值

(5)注意不移除

SRANDMEMBER key [count]

SREM

(1)移除集合key中的一个或多个member元素,不存在的member将被忽略

SREM key member [member ...]

SUNION

(1)返回一个集合的全部成员,该集合是所有给定集合的并集

(2)不存在的key被视为空集

SUNION key [key ...]

SUNIONSTORE

(1)类似SUNION,但结果保存到destination集合而不是简单返回结果集

(2)destination已存在,覆盖旧值

(3)destination可以是key本身

SUNION destination key [key ...]

结果展示:

Sadd

127.0.0.1:6379> sadd stest 1 2 3 4 5

(integer) 5

Sacrd

127.0.0.1:6379> scard stest

(integer) 5

Sdiff

127.0.0.1:6379> sadd stest2 3 4 5 6 7

(integer) 5

127.0.0.1:6379> sdiff stest stest2

1) "1"

2) "2"

smembers

127.0.0.1:6379> smembers set

(empty list or set)

127.0.0.1:6379> smembers stest

1) "1"

2) "2"

3) "3"

4) "4"

5) "5"

Sdiffstore

127.0.0.1:6379> smembers stest3

1) "1"

2) "2"

3) "3"

4) "4"

127.0.0.1:6379> sdiffstore stest3 steststest2

(integer) 2

127.0.0.1:6379> smembers stest3

1) "1"

2) "2"

Sinter

127.0.0.1:6379> smembers stest

1) "1"

2) "2"

3) "3"

4) "4"

5) "5"

127.0.0.1:6379> smembers stest2

1) "3"

2) "4"

3) "5"

4) "6"

5) "7"

127.0.0.1:6379> sinter stest stest2

1) "3"

2) "4"

3) "5"

Sinterstore

127.0.0.1:6379> smembers stest3

1) "1"

2) "2"

127.0.0.1:6379> smembers stest

1) "1"

2) "2"

3) "3"

4) "4"

5) "5"

127.0.0.1:6379> smembers stest2

1) "3"

2) "4"

3) "5"

4) "6"

5) "7"

127.0.0.1:6379> sinterstore stest3 steststest2

(integer) 3

127.0.0.1:6379> smembers stest3

1) "3"

2) "4"

3) "5"

Sismember

127.0.0.1:6379> sismember stest 1

(integer) 1

127.0.0.1:6379> sismember stest 10

(integer) 0

Smove

127.0.0.1:6379> smembers stest2

1) "1"

2) "3"

3) "4"

4) "5"

5) "6"

6) "7"

127.0.0.1:6379> smove stest stest2 2

(integer) 1

127.0.0.1:6379> smembers sets2

(empty list or set)

127.0.0.1:6379> smembers stest2

1) "1"

2) "2"

3) "3"

4) "4"

5) "5"

6) "6"

7) "7"

Spop

127.0.0.1:6379> sadd stest 7 6 5 4 3 2 1

(integer) 7

127.0.0.1:6379> smembers stest

1) "1"

2) "2"

3) "3"

4) "4"

5) "5"

6) "6"

7) "7"

127.0.0.1:6379> spop stest -1

(error) ERR index out of range

127.0.0.1:6379> spop stest 3

1) "5"

2) "3"

3) "1"

127.0.0.1:6379> sadd stest 1 2 3 4 5 6

(integer) 6

127.0.0.1:6379> smembers stest

1) "1"

2) "2"

3) "3"

4) "4"

5) "5"

6) "6"

127.0.0.1:6379> spop stest 10

1) "1"

2) "2"

3) "3"

4) "4"

5) "5"

6) "6"

Srandmember

127.0.0.1:6379> smembers stest

1) "1"

2) "2"

3) "3"

4) "4"

5) "5"

127.0.0.1:6379> srandmember stest -1

1) "3"

127.0.0.1:6379> srandmember stest -10

 1)"3"

 2)"1"

 3)"3"

 4)"4"

 5)"3"

 6)"4"

 7)"3"

 8)"3"

 9)"1"

10) "3"

127.0.0.1:6379> srandmember stest 10

1) "1"

2) "2"

3) "3"

4) "4"

5) "5"

Srem

127.0.0.1:6379> smembers stest

1) "1"

2) "2"

3) "3"

4) "4"

5) "5"

127.0.0.1:6379> srem stest 10 9

(integer) 0

127.0.0.1:6379> srem stest 1 3 5

(integer) 3

127.0.0.1:6379> smembers stest

1) "2"

2) "4"

Sunion

127.0.0.1:6379> smembers stest

1) "2"

2) "4"

127.0.0.1:6379> smembers stest2

1) "4"

2) "5"

3) "6"

4) "7"

5) "8"

127.0.0.1:6379> sunion stest stest2

1) "2"

2) "4"

3) "5"

4) "6"

5) "7"

6) "8"

Sunionstore

127.0.0.1:6379> smembers stest3

1) "1"

2) "2"

127.0.0.1:6379> smembers stest

1) "2"

2) "4"

127.0.0.1:6379> smembers stest2

1) "4"

2) "5"

3) "6"

4) "7"

5) "8"

127.0.0.1:6379> sunionstore stest3 steststest2

(integer) 6

127.0.0.1:6379> smembers stest3

1) "2"

2) "4"

3) "5"

4) "6"

5) "7"

6) "8"

注意:

在测试的时候发现一个问题,介绍set集合的时候总是说 set集合是无序的可以有的情况set确是有序的,下面演示

127.0.0.1:6379> smember stest

(error) ERR unknown command 'smember'

127.0.0.1:6379> sadd stest 1

(integer) 1

127.0.0.1:6379> smembers stest

1) "1"

127.0.0.1:6379> sadd stest 4

(integer) 1

127.0.0.1:6379> sadd stest 2

(integer) 1

127.0.0.1:6379> sadd stest -1

(integer) 1

127.0.0.1:6379> sadd stest 10

(integer) 1

127.0.0.1:6379> smembers stest

1) "-1"

2) "1"

3) "2"

4) "4"

5) "10"

可以看到我按照无序添加元素,最后获取出来还是有序的为什么呢?

在redis里,集合的编码有两种,intset(整数集合)或者hashtable(哈希表)。intset编码的集合里面的元素是有序的(按照整数从小到大排列),hashtable编码的集合是无序的。

1.当集合同时满足下面两个条件时,会使用intset编码:

保存的所有元素都是整数

2.元素数量不超过512个(这个值可以通过配置文件里的set-max-intset-entries进行调整)

127.0.0.1:6379> object encoding stest

"intset"

127.0.0.1:6379> sadd stest2 c c# javaphp go

(integer) 5

127.0.0.1:6379> smembers stest2

1) "c#"

2) "php"

3) "c"

4) "java"

5) "go"

127.0.0.1:6379> object encoding stest2

"hashtable"

Sortedset数据结构

命令

描述

用法

ZADD

(1)将一个或多个member元素及其score值加入有序集key中

(2)如果member已经是有序集的成员,那么更新member对应的score并重新插入member保证member在正确的位置上

(3)score可以是整数值或双精度浮点数

ZADD key score member [[score member] [score member] ...]

ZCARD

 (1)返回有序集key的元素个数

ZCARD key 

 ZCOUNT 

(1)返回有序集key中,score值>=min且<=max的成员的数量

ZCOUNT key min max 

ZRANGE 

 (1)返回有序集key中指定区间内的成员,成员位置按score从小到大排序

(2)具有相同score值的成员按字典序排列

(3)需要成员按score从大到小排列,使用ZREVRANGE命令

(4)下标参数start和stop都以0为底,也可以用负数,-1表示最后一个成员,-2表示倒数第二个成员

(5)可通过WITHSCORES选项让成员和它的score值一并返回

ZRANGE key start stop [WITHSCORES] 

ZRANK

 (1)返回有序集key中成员member的排名,有序集成员按score值从小到大排列

(2)排名以0为底,即score最小的成员排名为0

(3)ZREVRANK命令可将成员按score值从大到小排名

ZRANK key number 

ZREM

(1)移除有序集key中的一个或多个成员,不存在的成员将被忽略

(2)当key存在但不是有序集时,返回错误 

ZREM key member [member ...] 

ZREMRANGEBYRANK

(1)移除有序集key中指定排名区间内的所有成员 

ZREMRANGEBYRANK key start stop 

ZREMRANGEBYSCORE

(1)移除有序集key中,所有score值>=min且<=max之间的成员 

ZREMRANGEBYSCORE key min max 

结果展示:

Zadd

127.0.0.1:6379> zadd ztest 1 5 -1 10 7 33 11

(integer) 4

127.0.0.1:6379> zadd ztest2 10 java 5php 7 c# 6 c

(integer) 4

127.0.0.1:6379> zadd ztest3 java 4 c 5

(error) ERR value is not a valid float

Zcard

127.0.0.1:6379> zcard ztest

(integer) 4

127.0.0.1:6379> zcard ztest3

(integer) 0

Zcount

127.0.0.1:6379> zcount ztest 5 10

(integer) 1

Zrange

127.0.0.1:6379> zrange ztest2 0 -1

1) "js"

2) "php"

3) "c"

4) "c#"

5) "java"

127.0.0.1:6379> zrange ztest2 0 -1withscores

 1)"js"

 2)"5"

 3)"php"

 4)"5"

 5)"c"

 6)"6"

 7)"c#"

 8)"7"

 9)"java"

10) "10"

Zrevrange

127.0.0.1:6379> zrevrange ztest2 0 -1

1) "java"

2) "c#"

3) "c"

4) "php"

5) "js"

127.0.0.1:6379> zrevrange ztest2 0 -1withscores

 1)"java"

 2)"10"

 3)"c#"

 4)"7"

 5)"c"

 6)"6"

 7)"php"

 8)"5"

 9)"js"

10) "5"

Zrank

127.0.0.1:6379> zrange ztest 0 -1withscores

1) "10"

2) "-1"

3) "5"

4) "1"

5) "11"

6) "3"

7) "3"

8) "7"

127.0.0.1:6379> zrank ztest 10

(integer) 0

Zrem

127.0.0.1:6379> zrange ztest 0 -1

1) "10"

2) "5"

3) "11"

4) "3"

127.0.0.1:6379> zrem ztest 11

(integer) 1

127.0.0.1:6379> zrange ztest 0 -1

1) "10"

2) "5"

3) "3"

Zremrangebyrank

127.0.0.1:6379> zrange ztest 0 -1withscores

1) "10"

2) "-1"

3) "5"

4) "1"

5) "3"

6) "7"

127.0.0.1:6379> zremrangebyrank ztest 510

(integer) 0

127.0.0.1:6379> zremrangebyrank ztest 23

(integer) 1

127.0.0.1:6379> zrange ztest 0 -1withscores

1) "10"

2) "-1"

3) "5"

4) "1"

Zremrangebyscores

127.0.0.1:6379> zrange ztest2 0 -1withscores

 1)"js"

 2)"5"

 3)"php"

 4)"5"

 5)"c"

 6)"6"

 7)"c#"

 8)"7"

 9)"java"

10) "10"

127.0.0.1:6379> zremrangebyscore ztest26 10

(integer) 3

127.0.0.1:6379> zrange ztest2 0 -1withscores

1) "js"

2) "5"

3) "php"

4) "5"

注意:

这个地方排名的时候稍微注意下,和我们认为的排名有些微区别,比如1 1 23,由于有两个1,因此3正序的Rank应当为2(以0为下标),但实际上会是3,所以Rank应当理解为元素在集合中的下标位置更加准确

  
   
   
   
   
   
   
   
   

结果展示:

Zadd

127.0.0.1:6379> zadd ztest 1 5 -1 10 7 33 11

(integer) 4

127.0.0.1:6379> zadd ztest2 10 java 5php 7 c# 6 c

(integer) 4

127.0.0.1:6379> zadd ztest3 java 4 c 5

(error) ERR value is not a valid float

Zcard

127.0.0.1:6379> zcard ztest

(integer) 4

127.0.0.1:6379> zcard ztest3

(integer) 0

Zcount

127.0.0.1:6379> zcount ztest 5 10

(integer) 1

Zrange

127.0.0.1:6379> zrange ztest2 0 -1

1) "js"

2) "php"

3) "c"

4) "c#"

5) "java"

127.0.0.1:6379> zrange ztest2 0 -1withscores

 1)"js"

 2)"5"

 3)"php"

 4)"5"

 5)"c"

 6)"6"

 7)"c#"

 8)"7"

 9)"java"

10) "10"

Zrevrange

127.0.0.1:6379> zrevrange ztest2 0 -1

1) "java"

2) "c#"

3) "c"

4) "php"

5) "js"

127.0.0.1:6379> zrevrange ztest2 0 -1withscores

 1)"java"

 2)"10"

 3)"c#"

 4)"7"

 5)"c"

 6)"6"

 7)"php"

 8)"5"

 9)"js"

10) "5"

Zrank

127.0.0.1:6379> zrange ztest 0 -1withscores

1) "10"

2) "-1"

3) "5"

4) "1"

5) "11"

6) "3"

7) "3"

8) "7"

127.0.0.1:6379> zrank ztest 10

(integer) 0

Zrem

127.0.0.1:6379> zrange ztest 0 -1

1) "10"

2) "5"

3) "11"

4) "3"

127.0.0.1:6379> zrem ztest 11

(integer) 1

127.0.0.1:6379> zrange ztest 0 -1

1) "10"

2) "5"

3) "3"

Zremrangebyrank

127.0.0.1:6379> zrange ztest 0 -1withscores

1) "10"

2) "-1"

3) "5"

4) "1"

5) "3"

6) "7"

127.0.0.1:6379> zremrangebyrank ztest 510

(integer) 0

127.0.0.1:6379> zremrangebyrank ztest 23

(integer) 1

127.0.0.1:6379> zrange ztest 0 -1withscores

1) "10"

2) "-1"

3) "5"

4) "1"

Zremrangebyscores

127.0.0.1:6379> zrange ztest2 0 -1withscores

 1)"js"

 2)"5"

 3)"php"

 4)"5"

 5)"c"

 6)"6"

 7)"c#"

 8)"7"

 9)"java"

10) "10"

127.0.0.1:6379> zremrangebyscore ztest26 10

(integer) 3

127.0.0.1:6379> zrange ztest2 0 -1withscores

1) "js"

2) "5"

3) "php"

4) "5"

注意:

这个地方排名的时候稍微注意下,和我们认为的排名有些微区别,比如1 1 23,由于有两个1,因此3正序的Rank应当为2(以0为下标),但实际上会是3,所以Rank应当理解为元素在集合中的下标位置更加准确

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值