Redis的操作键(key)和命令,Redis的数据类型,Redis常用的五种数据类型;

1、Redis的操作键:key操作命令;

常用的Redis操作键命令解释:
keys *:查看当前数据库的所有key;
exists key:查看当前某个key是否存在;0为不存在,1位存在
del key:删除某个key;
type key:查看当前key的数据类型
expire key seconds:设置当前键的过期时间,以秒为单位
ttl key:查看当前key的过期时间,-1为永不过时,-2为已过时
select ID:切换数据库
dbsize:查看当前数据库的key数量,返回值为数量
flushdb:清空当前数据库
flushall:清空所有的数据库

1、#在Shell命令行下启动Redis客户端工具。

[root@node1 ~]# redis-cli 
127.0.0.1:6379> 

2、#清空当前选择的数据库

127.0.0.1:6379> flushdb
OK

3、创建数据#添加String类型的模拟数据。

redis 127.0.0.1:6379>set mykey 2
OK
redis 127.0.0.1:6379>set mykey2 "hello"
OK

4、查看键的数据

127.0.0.1:6379> get mykey2
"hello"
127.0.0.1:6379> get mykey
"2"

5、查看所有的键:

127.0.0.1:6379> keys *
1) "mykey"
2) "mykey2"

6、删除键:

127.0.0.1:6379> del mykey mykey2
(integer) 2

7、查看当前键是否存在:0 为不存在,1表示存在

127.0.0.1:6379> exists mykey
(integer) 0
127.0.0.1:6379> exists mykey2
(integer) 1

8、切换数据库ID为1的数据库

127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> 

9、设置该键的超时被100秒。

127.0.0.1:6379> expire mykey 100
(integer) 1

10、用ttl命令看一下当前还剩下多少秒,从结果中可以看出还剩下96秒。

127.0.0.1:6379> ttl mykey
(integer) 97

2、Redis的数据类型

2.1、string 类型及操作

概述:

string字符串类型是Redis中最为基础的数据存储类型,一个key对应一个value
它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的string 类型及操作 数据,如JPEG图像数据或Json对象描述信息等。
在Redis中string类型的Value最多可以容纳的数据长度是512M

string的命令示例:

exists:判断该键是否存在,存在返回1,否则返回0
append:返回当前Value的长度,追加后Value的长度
get:获取键值
strlen:获取指定Key的字符长度,等效于C库中strlen函数。
getset:在取计数器原有值的同时,并将其设置为新值
setex:设置指定Key的过期时间为10秒
setrange:设定可以修改的值的位置为哪个
getrange:截取该键的位置范围值
mset:可以批量设置键的值
mget:可以批量获取键的值
msetnx:批量设置键和值,成功返回1,不成功返回0;

1. > redis-cli   #执行Redis客户端工具。
#判断该键是否存在,存在返回1,否则返回0。
redis 127.0.0.1:6379>exists mykey   
(integer) 0
#该键并不存在,因此append命令返回当前Value的长度。
redis 127.0.0.1:6379> append mykey "hello" 
(integer) 5
#该键已经存在,因此返回追加后Value的长度。
redis 127.0.0.1:6379>append mykey " world"
(integer) 11
#通过get命令获取该键,以判断append的结果。
redis 127.0.0.1:6379>get mykey  
"hello world"
#通过set命令为键设置新值,并覆盖原有值。
redis 127.0.0.1:6379>set mykey "this is a test"
OK
redis 127.0.0.1:6379>get mykey
"this is a test"
#获取指定Key的字符长度,等效于C库中strlen函数。
redis 127.0.0.1:6379>strlen mykey  
(integer) 14

2. INCR/DECR/INCRBY/DECRBY:	#递增-递减-
#设置Key的值为20
redis 127.0.0.1:6379>set mykey 20
OK
#该Key的值递增1
redis 127.0.0.1:6379>incr mykey
(integer) 21
#该Key的值递减1
redis 127.0.0.1:6379>decr mykey
(integer) 20
#对空值执行递增操作,其原值被设定为0,递增后的值为1
redis 127.0.0.1:6379> incr mykey
(integer) 1
#将该键的Value设置为不能转换为整型的普通字符串。
redis 127.0.0.1:6379>set mykey hello
OK
#在该键上再次执行递增操作时,Redis将报告错误信息。
redis 127.0.0.1:6379>incr mykey
(error) ERR value is not an integer or out of range


3. GETSET:
#将计数器的值原子性的递增1
redis 127.0.0.1:6379>incr mycounter 
(integer) 1
#在取计数器原有值的同时,并将其设置为新值,这两个操作原子性的同时完成。
redis 127.0.0.1:6379>getset mycounter 0 
"1"
#查看设置后的结果。
redis 127.0.0.1:6379>get mycounter
"0"

4. SETEX:
#设置指定Key的过期时间为10秒。
redis 127.0.0.1:6379>setex mykey 10 "hello"   
OK
#通过ttl命令查看一下指定Key的剩余存活时间(秒数)0表示已经过期,-1表示永不过期。
redis 127.0.0.1:6379>ttl mykey 
(integer) 4


5. SETNX:
#删除该键,以便于下面的测试验证。
redis 127.0.0.1:6379>del mykey 
(integer) 1
#该键并不存在,因此该命令执行成功。
redis 127.0.0.1:6379>setnx mykey "hello" 
(integer) 1
#该键已经存在,因此本次设置没有产生任何效果。
redis 127.0.0.1:6379>setnx mykey "world" 
(integer) 0
#从结果可以看出,返回的值仍为第一次设置的值。
redis 127.0.0.1:6379>get mykey 
"hello"

6. SETRANGE/GETRANGE:
#设定初始值。
redis 127.0.0.1:6379>set mykey "hello world" 
OK
#从第六个字节开始替换2个字节(dd只有2个字节)
redis 127.0.0.1:6379>setrange mykey 6 dd   
(integer) 11
#查看替换后的值。
redis 127.0.0.1:6379>get mykey
"hello ddrld"
#offset已经超过该Key原有值的长度了,该命令将会在末尾补0。
redis 127.0.0.1:6379>setrange mykey 20 dd 
(integer) 22
#查看补0后替换的结果。
redis 127.0.0.1:6379>get mykey 
"hello ddrld\x00\x00\x00\x00\x00\x00\x00\x00\x00dd"
#删除该Key。
redis 127.0.0.1:6379>del mykey 
(integer) 1
#替换空值。
redis 127.0.0.1:6379>setrange mykey 2 dd 
(integer) 4
#查看替换空值后的结果。
redis 127.0.0.1:6379>get mykey 
"\x00\x00dd"   
#设置新值。
redis 127.0.0.1:6379>set mykey "0123456789"   
OK
#截取该键的Value,从第一个字节开始,到第二个字节结束。
redis 127.0.0.1:6379>getrange mykey 1 2 
"12"
#20已经超过Value的总长度,因此将截取第一个字节后面的所有字节。
redis 127.0.0.1:6379>getrange mykey 1 20   
"123456789"

7. SETBIT/GETBIT:
redis 127.0.0.1:6379>del mykey
(integer) 1
#设置从0开始计算的第七位BIT值为1,返回原有BIT0
redis 127.0.0.1:6379> setbit mykey 7 1   
(integer) 0
#获取设置的结果,二进制的0000 0001的十六进制值为0x01
redis 127.0.0.1:6379>get mykey
"\x01"
#设置从0开始计算的第六位BIT值为1,返回原有BIT0
redis 127.0.0.1:6379>setbit mykey 6 1   
(integer) 0
#获取设置的结果,二进制的0000 0011的十六进制值为0x03
redis 127.0.0.1:6379>get mykey
"\x03"
#返回了指定Offset的BIT值。
redis 127.0.0.1:6379>getbit mykey 6
(integer) 1
#Offset已经超出了value的长度,因此返回0。
redis 127.0.0.1:6379>getbit mykey 10
(integer) 0

8. MSET/MGET/MSETNX:
#批量设置了key1和key2两个键。
redis 127.0.0.1:6379>mset key1 "hello" key2 "world"  
OK
#批量获取了key1和key2两个键的值。
redis 127.0.0.1:6379>mget key1 key2 
1) "hello"
2) "world"
#批量设置了key3和key4两个键,因为之前他们并不存在,所以该命令执行成功并返回1。
redis 127.0.0.1:6379>msetnx key3 "stephen" key4 "liu"
(integer) 1
redis 127.0.0.1:6379>mget key3 key4 
1) "stephen"
2) "liu"
#批量设置了key3和key5两个键,但是key3已经存在,所以该命令执行失败并返回0。
redis 127.0.0.1:6379>msetnx key3 "hello" key5 "world"
(integer) 0
#批量获取key3和key5,由于key5没有设置成功,所以返回nil。
redis 127.0.0.1:6379>mget key3 key5 
1) "stephen"
2) (nil)

2.2 hash 类型及操作

概述:
Redis hash 数据类型是一个键值对集合
Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象,类似Java里面的Map<String,Object>
用户ID为查找的key,存储的value用户对象包含姓名,年龄,生日等信息,如果用普通的key/value结构来存储,主要有以下2种存储方式:

我们可以将Redis中的Hashes类型看成具有String Key和String Value的map容器。所以该类型非常适合于存储值对象的信息。如Username、Password和Age等。如果Hash中包含很少的字段,那么 该类型的数据也将仅占用很少的磁盘空间。每一个Hash可以存储4294967295个键值对。

hash的命令示例:

hset:设置hash键值的字段和值
hget:获取该键的字段中的值
hexists:判断键中是否存在该字段,存在返回1,不存在返回0;
hlen:获取该键中的字段数量
hsetnx:为键新添加字段;
hdel:删除该hash键的字段。成功返回1;不成功返回0;
hincrby:设定键的数据可以增加多少或减少多少数值;

hmset:为该键一次性可以设置多个字段;
hmget:获取该键的多个字段
hgetall:获取该键的所有字段和其值
hkeys:获取该键中所有字段的名字
hvals:获取该键中所有字段的值

1. HSET/HGET/HDEL/HEXISTS/HLEN/HSETNX:
#给键值为myhash的键设置字段为field1,值为stephen。
redis 127.0.0.1:6379>hset myhash field1 "stephen"
(integer) 1
#获取键值为myhash,字段为field1的值。
redis 127.0.0.1:6379>hget myhash field1
"stephen"
#myhash键中不存在field2字段,因此返回nil。
redis 127.0.0.1:6379>hget myhash field2
(nil)
#给myhash关联的Hashes值添加一个新的字段field2,其值为liu。
redis 127.0.0.1:6379>hset myhash field2 "liu"
(integer) 1
#获取myhash键的字段数量。
redis 127.0.0.1:6379>hlen myhash
(integer) 2
#判断myhash键中是否存在字段名为field1的字段,由于存在,返回值为1。
redis 127.0.0.1:6379>hexists myhash field1
(integer) 1
#删除myhash键中字段名为field1的字段,删除成功返回1。
redis 127.0.0.1:6379>hdel myhash field1
(integer) 1
#再次删除myhash键中字段名为field1的字段,由于上一条命令已经将其删除,因为没有删除,返回0。
redis 127.0.0.1:6379>hdel myhash field1
(integer) 0
#判断myhash键中是否存在field1字段,由于上一条命令已经将其删除,因为返回0。
redis 127.0.0.1:6379>hexists myhash field1
(integer) 0
#通过hsetnx命令给myhash添加新字段field1,其值为stephen,因为该字段已经被删除,所以该命令添加成功并返回1。
redis 127.0.0.1:6379>hsetnx myhash field1 stephen
(integer) 1
#由于myhash的field1字段已经通过上一条命令添加成功,因为本条命令不做任何操作后返回0。
redis 127.0.0.1:6379>hsetnx myhash field1 stephen
(integer) 0

2. HINCRBY:
#准备测试数据,该myhash的field字段设定值1。
redis 127.0.0.1:6379>hset myhash field 5
(integer) 1
#给myhash的field字段的值加1,返回加后的结果。
redis 127.0.0.1:6379>hincrby myhash field 1
(integer) 6
#给myhash的field字段的值加-1,返回加后的结果。
redis 127.0.0.1:6379>hincrby myhash field -1
(integer) 5
#给myhash的field字段的值加-10,返回加后的结果。
redis 127.0.0.1:6379>hincrby myhash field -10
(integer) -5   

3. HGETALL/HKEYS/HVALS/HMGET/HMSET:
#删除该键,便于后面示例测试。
redis 127.0.0.1:6379>del myhash
(integer) 1
#为该键myhash,一次性设置多个字段,分别是field1 = "hello", field2 = "world"。
redis 127.0.0.1:6379>hmset myhash field1 "hello" field2 "world"
OK
#获取myhash键的多个字段,其中field3并不存在,因为在返回结果中与该字段对应的值为nil。
redis 127.0.0.1:6379>hmget myhash field1 field2 field3
1) "hello"
2) "world"
3) (nil)
#返回myhash键的所有字段及其值,从结果中可以看出,他们是逐对列出的。
redis 127.0.0.1:6379>hgetall myhash
1) "field1"
2) "hello"
3) "field2"
4) "world"
#仅获取myhash键中所有字段的名字。
redis 127.0.0.1:6379>hkeys myhash
1) "field1"
2) "field2"
#仅获取myhash键中所有字段的值。
redis 127.0.0.1:6379> hvals myhash
1) "hello"
2) "world" 

2.3 list 类型及操作

Redis-list 属于单键多值

简单理解:Redis列表(List)是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或者尾部(右边)。
它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。

在Redis中,List类型是的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的 元素。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。 List中可以包含的最大元素数量是4294967295。

从元素插入和删除的效率视角来看,如果我们是在链表的两头插入或删除元素,这将会是非常高效的操作,即使链表中已经存储了百万条记录,该操作也可以在常量 时间内完成。然而需要说明的是,如果元素插入或删除操作是作用于链表中间,那将会是非常低效的。.

list命令示例

lpush:创建list将参数中的values从左到右依次插入
lpushx:当队列存在时,从队到左边入队一个元素
lrange:从列表中获取指定返回的元素

lpop:从队列的左边出对一个元素
llen:获取队列list的长度

lrem:从列表中删除元素
lset:设置队列里面一个元素的值
lindex:获取一个元素,通过其索引列表
ltrim:修剪到指定范围内的清单

linsert:在列表中的另一个元素之前或之后插入一个元素
rpush:从队列的左边入队一个或多个元素

1. LPUSH/LPUSHX/LRANGE:
#mykey键并不存在,该命令会创建该键及与其关联的List,之后在将参数中的values从左到右依次插入。
redis 127.0.0.1:6379>lpush mykey a b c d
(integer) 4

#取链表中的全部元素,其中0表示第一个元素,-1表示最后一个元素。
redis 127.0.0.1:6379> lrange mykey 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
#mykey键此时已经存在,所以该命令插入成功,并返回链表中当前元素的数量。
redis 127.0.0.1:6379> lpushx mykey e
(integer) 5
#获取该键的List Value的头部元素。
redis 127.0.0.1:6379> lrange mykey 0 0
1) "e"

2. LPOP/LLEN:
redis 127.0.0.1:6379>lpush mykey a b c d
(integer) 4
redis 127.0.0.1:6379>lpop mykey
"d"
redis 127.0.0.1:6379>lpop mykey
"c"
#在执行lpop命令两次后,链表头部的两个元素已经被弹出,此时链表中元素的数量是2
redis 127.0.0.1:6379>llen mykey
(integer) 2

3. LREM/LSET/LINDEX/LTRIM:
#为后面的示例准备测试数据。
redis 127.0.0.1:6379>lpush mykey a b c d a c
(integer) 6
#从头部(left)向尾部(right)变量链表,删除2个值等于a的元素,返回值为实际删除的数量。
redis 127.0.0.1:6379> lrem mykey 2 a
(integer) 2
#看出删除后链表中的全部元素。
redis 127.0.0.1:6379> lrange mykey 0 -1
1) "c"
2) "d"
3) "c"
4) "b"
#获取索引值为1(头部的第二个元素)的元素值。
redis 127.0.0.1:6379> lindex mykey 1
"d"
#将索引值为1(头部的第二个元素)的元素值设置为新值e。
redis 127.0.0.1:6379> lset mykey 1 e
OK
#查看是否设置成功。
redis 127.0.0.1:6379> lindex mykey 1
"e"
#索引值6超过了链表中元素的数量,该命令返回nil。
redis 127.0.0.1:6379> lindex mykey 6
(nil)
#设置的索引值6超过了链表中元素的数量,设置失败,该命令返回错误信息。
redis 127.0.0.1:6379>lset mykey 6 hh
(error) ERR index out of range
#仅保留索引值02之间的3个元素,注意第0个和第2个元素均被保留。
redis 127.0.0.1:6379> ltrim mykey 0 2
OK
#查看trim后的结果。
redis 127.0.0.1:6379> lrange mykey 0 -1
1) "c"
2) "e"
3) "c"

4. LINSERT:
#为后面的示例准备测试数据。
redis 127.0.0.1:6379>lpush mykey a b c d e
(integer) 5
#在a的前面插入新元素a1。
redis 127.0.0.1:6379> linsert mykey before a a1
(integer) 6
#查看是否插入成功,从结果看已经插入。注意lindex的index值是0-based。
redis 127.0.0.1:6379>lindex mykey 0
"e"
#在e的后面插入新元素e2,从返回结果看已经插入成功。
redis 127.0.0.1:6379> linsert mykey after e e2
(integer) 7
#再次查看是否插入成功。
redis 127.0.0.1:6379> lindex mykey 1
"e2"
#在不存在的元素之前或之后插入新元素,该命令操作失败,并返回-1。
redis 127.0.0.1:6379>linsert mykey after k a
(integer) -1
#为不存在的Key插入新元素,该命令操作失败,返回0。
redis 127.0.0.1:6379> linsert mykey1 after a a2
(integer) 0

5. RPUSH/RPUSHX/RPOP/RPOPLPUSH:
#从链表的尾部插入参数中给出的values,插入顺序是从左到右依次插入。
redis 127.0.0.1:6379>rpush mykey a b c d
(integer) 4
#通过lrange的可以获悉rpush在插入多值时的插入顺序。
127.0.0.1:6379> LRANGE mykey 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> keys *		能够查看所有定义的数据

2.4 Set 类型及操作

概述:
Redis集合(Set)对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重,当需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。

在Redis中,我们可以将Set类型看作为没有排序的字符集合,和List类型一样,我们也可以在该类型的数据值上执行添加、删除或判断某一元素是否存 在等操作。需要说明的是,这些操作的时间复杂度为O(1),即常量时间内完成次操作。
Set可包含的最大元素数量是4294967295。和List类型不同的是,这一点和C++标准库中的set容器是完全相同的。换句话说,如果多次添加相同元素,Set 中将仅保留该元素的一份拷贝。和List类型相比,Set类型在功能上还存在着一个非常重要的特性,即在服务器端完成多个Sets之间的聚合计算操作,如 unions、intersections和differences。由于这些操作均在服务端完成,因此效率极高,而且也节省了大量的网络IO开销。

set命令类型:

sadd:添加一个或者多个元素到集合(set)里;
sismember:确定一个给定的值是否是一个set里的成员;
smembers:获取集合set里面的所有元素;

spop:删除并获取一个集合里面的元素;
srem:从集合set里面删除一个或多个元素
srandmember:从集合set里面随机获取一个元素
smove:移动集合set里面的一个元素到另一个集合

sdiff:获取队列不存在的元素;
sdiffstore:获取队列不存在的元素,并存储在一个关键的结果集
sinter:获取两个集合set的交集
sinterstore:获取两个集合set的交集,并存储在一个关键的结果集;

1. SADD/SMEMBERS/SCARD/SISMEMBER:
#插入测试数据,由于该键myset之前并不存在,因此参数中的三个成员都被正常插入。
redis 127.0.0.1:6379>sadd myset a b c
(integer) 3
#由于参数中的a在myset中已经存在,因此本次操作仅仅插入了d和e两个新成员。
redis 127.0.0.1:6379>sadd myset a d e
(integer) 2
#判断a是否已经存在,返回值为1表示存在。
redis 127.0.0.1:6379>sismember myset a
(integer) 1
#判断f是否已经存在,返回值为0表示不存在。
redis 127.0.0.1:6379>sismember myset f
(integer) 0
#通过smembers命令查看插入的结果,从结果可以,输出的顺序和插入顺序无关。
redis 127.0.0.1:6379> smembers myset
1) "c"
2) "d"
3) "a"
4) "b"
5) "e"
#获取Set集合中元素的数量。
redis 127.0.0.1:6379>scard myset
(integer) 5

2. SPOP/SREM/SRANDMEMBER/SMOVE:
#删除该键,便于后面的测试。
redis 127.0.0.1:6379>del myset
(integer) 1
#为后面的示例准备测试数据。
redis 127.0.0.1:6379>sadd myset a b c d
(integer) 4
#查看Set中成员的位置。
redis 127.0.0.1:6379> smembers myset
1) "c"
2) "d"
3) "a"
4) "b"
#从结果可以看出,该命令确实是随机的返回了某一成员。
redis 127.0.0.1:6379>srandmember myset
"c"
#Set中尾部的成员b被移出并返回,事实上b并不是之前插入的第一个或最后一个成员。
redis 127.0.0.1:6379>spop myset
"b"
#查看移出后Set的成员信息。
redis 127.0.0.1:6379> smembers myset
1) "c"
2) "d"
3) "a"
#从Set中移出a、d和f三个成员,其中f并不存在,因此只有a和d两个成员被移出,返回为2。
redis 127.0.0.1:6379>srem myset a d f
(integer) 2
#查看移出后的输出结果。
redis 127.0.0.1:6379>smembers myset
1) "c"
#为后面的smove命令准备数据。
redis 127.0.0.1:6379>sadd myset a b
(integer) 2
redis 127.0.0.1:6379>sadd myset2 c d
(integer) 2
#将a从myset移到myset2,从结果可以看出移动成功。
redis 127.0.0.1:6379>smove myset myset2 a
(integer) 1
#再次将a从myset移到myset2,由于此时a已经不是myset的成员了,因此移动失败并返回0。
redis 127.0.0.1:6379>smove myset myset2 a
(integer) 0
#分别查看myset和myset2的成员,确认移动是否真的成功。
redis 127.0.0.1:6379>smembers myset
1) "b"
redis 127.0.0.1:6379> smembers myset2
1) "c"
2) "d"
3) "a"

3. SDIFF/SDIFFSTORE/SINTER/SINTERSTORE:
#为后面的命令准备测试数据。
redis 127.0.0.1:6379>sadd myset a b c d
(integer) 4
redis 127.0.0.1:6379> sadd myset2 c
(integer) 1
redis 127.0.0.1:6379>sadd myset3 a c e
(integer) 3
#myset和myset2相比,a、b和d三个成员是两者之间的差异成员。再用这个结果继续和myset3进行差异比较,b和d是myset3不存在的成员。
redis 127.0.0.1:6379>sdiff myset myset2 myset3
1) "d"
2) "b"
#将3个集合的差异成员存在在diffkey关联的Set中,并返回插入的成员数量。
redis 127.0.0.1:6379>sdiffstore diffkey myset myset2 myset3
(integer) 2
#查看一下sdiffstore的操作结果。
redis 127.0.0.1:6379>smembers diffkey
1) "d"
2) "b"
#从之前准备的数据就可以看出,这三个Set的成员交集只有c。
redis 127.0.0.1:6379>sinter myset myset2 myset3
1) "c"
#将3个集合中的交集成员存储到与interkey关联的Set中,并返回交集成员的数量。
redis 127.0.0.1:6379> sinterstore interkey myset myset2 myset3
(integer) 1
#查看一下sinterstore的操作结果。
redis 127.0.0.1:6379>smembers interkey
1) "c"
#获取3个集合中的成员的并集。
redis 127.0.0.1:6379>sunion myset myset2 myset3
1) "b"
2) "c"
3) "d"
4) "e"
5) "a"
#将3个集合中成员的并集存储到unionkey关联的set中,并返回并集成员的数量。
redis 127.0.0.1:6379>sunionstore unionkey myset myset2 myset3
(integer) 5
#查看一下suiionstore的操作结果。
redis 127.0.0.1:6379>smembers unionkey
1) "b"
2) "c"
3) "d"
4) "e"
5) "a"

set应用范围:
1). 可以使用Redis的Set数据类型跟踪一些唯一性数据,比如访问某一博客的唯一IP地址信息。对于此场景,我们仅需在每次访问该博客时将访问者的IP存入Redis中,Set数据类型会自动保证IP地址的唯一性。
2). 充分利用Set类型的服务端聚合操作方便、高效的特性,可以用于维护数据对象之间的关联关系。比如所有购买某一电子设备的客户ID被存储在一个指定的 Set中,而购买另外一种电子产品的客户ID被存储在另外一个Set中,如果此时我们想获取有哪些客户同时购买了这两种商品时,Set的 intersections命令就可以充分发挥它的方便和效率的优势了。

set案例:
案例:
    
1、设计四个好友
[root@localhost ~]# redis-cli
127.0.0.1:6379> set it_user:id:1:username tom
OK
127.0.0.1:6379> set it_user:id:1:email tom@qq.ocm
OK
127.0.0.1:6379> set it_user:id:2:username john
OK
127.0.0.1:6379> set it_user:id:2:email john@qq.ocm
OK
127.0.0.1:6379> set it_user:id:3:username bob
OK
127.0.0.1:6379> set it_user:id:3:email bob@qq.com
OK
127.0.0.1:6379> set it_user:id:4:username smith
OK
127.0.0.1:6379> set it_user:id:4:email smith@qq.com
OK
127.0.0.1:6379> keys it_user:id*
1) "it_user:id:4:username"
2) "it_user:id:1:username"
3) "it_user:id:2:username"
4) "it_user:id:2:email"
5) "it_user:id:1:email"
6) "it_user:id:3:email"
7) "it_user:id:4:email"
8) "it_user:id:3:username"


2、设定好友集合
1号好友为2号和3号
127.0.0.1:6379> sadd set:user:id:1:friend 2
(integer) 1
127.0.0.1:6379> sadd set:user:id:1:friend 3
(integer) 1
127.0.0.1:6379> SMEMBERS set:user:id:1:friend
1) "2"
2) "3"
    
4号好友为3号
127.0.0.1:6379> sadd set:user:id:4:friend 3
(integer) 1
127.0.0.1:6379> SMEMBERS set:user:id:4:friend
1) "3"

3、好友关系
共同好友(交集)
127.0.0.1:6379> SINTER set:user:id:1:friend set:user:id:4:friend
1) "3"
    
全部好友(并集)
127.0.0.1:6379> sunion set:user:id:1:friend set:user:id:4:friend
1) "2"
2) "3"

推荐好友(差集)
127.0.0.1:6379> SDIFF set:user:id:1:friend set:user:id:4:friend
1) "2"

2.5 zset 类型及操作

概述:

Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中。它们之间的主要差别是Sorted- Sets中的每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。然而需要额外指出的是,尽管 Sorted-Sets中的成员必须是唯一的,但是分数(score)却是可以重复的。

在Sorted-Set中添加、删除或更新一个成员都是非常快速的操作,其时间复杂度为集合中成员数量的对数。由于Sorted-Sets中的成员在集 合中的位置是有序的,因此,即便是访问位于集合中部的成员也仍然是非常高效的。事实上,Redis所具有的这一特征在很多其它类型的数据库中是很难实现 的,换句话说,在该点上要想达到和Redis同样的高效,在其它数据库中进行建模是非常困难的。

zset命令格式:

zadd:添加到有序set的一个或多个成员,或更新的分数;
zcard:获取一个排序的集合中的成员数量;
zcount:返回分数范围内的成员数量;
zrem:从排序的集合中删除一个或多个成员;
zincrby:增量的一名成员在排序设置的评分;
zscore:获取成员在排序设置相关的比分;
zrange:根据指定的index返回,返回zset的成员列表;
zrank:确定在排序集合成员的索引;

zrangebyscore:返回有序集合中指定分数区间内的成员,分数由低到高的排序
zremrangerbyrank:在排序设置的所有成员在给定的索引中删除;
zremrangebyscore:删除一个排序的设置在给定的分数所有成员;

zreverange:在排序的设置返回的成员范围,通过索引,下令从分数高到低;
zrevrangebyscore:返回有序集合中指定分数区间内的成员,分数由高到低排序;
zrevrank:确定指数在排序集的成员,下令从分数高到低;

1. ZADD/ZCARD/ZCOUNT/ZREM/ZINCRBY/ZSCORE/ZRANGE/ZRANK:
#添加一个分数为1的成员。
redis 127.0.0.1:6379> zadd myzset 1 "one"
(integer) 1
#添加两个分数分别是23的两个成员。
redis 127.0.0.1:6379>zadd myzset 2 "two" 3 "three"
(integer) 2
#0表示第一个成员,-1表示最后一个成员。WITHSCORES选项表示返回的结果中包含每个成员及其分数,否则只返回成员。
redis 127.0.0.1:6379>zrange myzset 0 -1 WITHSCORES
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
#获取成员one在Sorted-Set中的位置索引值。0表示第一个位置。
redis 127.0.0.1:6379>zrank myzset one
(integer) 0
#成员four并不存在,因此返回nil。
redis 127.0.0.1:6379>zrank myzset four
(nil)
#获取myzset键中成员的数量。
redis 127.0.0.1:6379> zcard myzset
(integer) 3
#返回与myzset关联的Sorted-Set中,分数满足表达式1 <= score <= 2的成员的数量。
redis 127.0.0.1:6379>zcount myzset 1 2
(integer) 2
#删除成员one和two,返回实际删除成员的数量。
redis 127.0.0.1:6379>zrem myzset one two
(integer) 2
#查看是否删除成功。
redis 127.0.0.1:6379>zcard myzset
(integer) 1
#获取成员three的分数。返回值是字符串形式。
redis 127.0.0.1:6379>zscore myzset three
"3"
#由于成员two已经被删除,所以该命令返回nil。
redis 127.0.0.1:6379>zscore myzset two
(nil)
#将成员one的分数增加2,并返回该成员更新后的分数。
redis 127.0.0.1:6379>zincrby myzset 2 one
"3"
#将成员one的分数增加-1,并返回该成员更新后的分数。
redis 127.0.0.1:6379>zincrby myzset -1 one
"2"
#查看在更新了成员的分数后是否正确。
redis 127.0.0.1:6379>zrange myzset 0 -1 WITHSCORES
1) "one"
2) "2"
3) "two"
4) "2"
5) "three"
6) "3"

   2. ZRANGEBYSCORE/ZREMRANGEBYRANK/ZREMRANGEBYSCORE
redis 127.0.0.1:6379>del myzset
(integer) 1
redis 127.0.0.1:6379>zadd myzset 1 one 2 two 3 three 4 four
(integer) 4
#获取分数满足表达式1 <= score <= 2的成员。
redis 127.0.0.1:6379> zrangebyscore myzset 1 2
1) "one"
2) "two"
#获取分数满足表达式1 < score <= 2的成员。
redis 127.0.0.1:6379>zrangebyscore myzset (1 2
1) "two"
#-inf表示第一个成员,+inf表示最后一个成员,limit后面的参数用于限制返回成员的自己,
#2表示从位置索引(0-based)等于2的成员开始,去后面3个成员。
redis 127.0.0.1:6379>zrangebyscore myzset -inf +inf limit 2 3
1) "three"
2) "four"
#删除分数满足表达式1 <= score <= 2的成员,并返回实际删除的数量。
redis 127.0.0.1:6379>zremrangebyscore myzset 1 2
(integer) 2
#看出一下上面的删除是否成功。
redis 127.0.0.1:6379>zrange myzset 0 -1
1) "three"
2) "four"
#删除位置索引满足表达式0 <= rank <= 1的成员。
redis 127.0.0.1:6379>zremrangebyrank myzset 0 1
(integer) 2
#查看上一条命令是否删除成功。
redis 127.0.0.1:6379>zcard myzset
(integer) 0
  
   3. ZREVRANGE/ZREVRANGEBYSCORE/ZREVRANK:
#为后面的示例准备测试数据。
redis 127.0.0.1:6379>del myzset
(integer) 0
redis 127.0.0.1:6379>zadd myzset 1 one 2 two 3 three 4 four
(integer) 4
#以位置索引从高到低的方式获取并返回此区间内的成员。
redis 127.0.0.1:6379>zrevrange myzset 0 -1 WITHSCORES
1) "four"
2) "4"
3) "three"
4) "3"
5) "two"
6) "2"
7) "one"
8) "1"
#由于是从高到低的排序,所以位置等于0的是four,1是three,并以此类推。
redis 127.0.0.1:6379>zrevrange myzset 1 3
1) "three"
2) "two"
3) "one"
#由于是从高到低的排序,所以one的位置是3。
redis 127.0.0.1:6379>zrevrank myzset one
(integer) 3
#由于是从高到低的排序,所以four的位置是0。
redis 127.0.0.1:6379>zrevrank myzset four
(integer) 0
#获取分数满足表达式3 >= score >= 0的成员,并以相反的顺序输出,即从高到底的顺序。
redis 127.0.0.1:6379>zrevrangebyscore myzset 3 0
1) "three"
2) "two"
3) "one"
#该命令支持limit选项,其含义等同于zrangebyscore中的该选项,只是在计算位置时按照相反的顺序计算和获取。
redis 127.0.0.1:6379> zrevrangebyscore myzset 4 0 limit 1 2
1) "three"
2) "two"

zset应用范围:
1). 可以用于一个大型在线游戏的积分排行榜。每当玩家的分数发生变化时,可以执行ZADD命令更新玩家的分数,此后再通过ZRANGE命令获取积分TOP TEN的用户信息。当然我们也可以利用ZRANK命令通过username来获取玩家的排行信息。最后我们将组合使用ZRANGE和ZRANK命令快速的 获取和某个玩家积分相近的其他用户的信息。
2). Sorted-Sets类型还可用于构建索引数据。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值