一.前言
redis并不是简单的key-value数据容器,不能将其理解为静态存储数据,它是动态交互的数据结构服务器,可以被用作缓存,高性能k-v数据库等。
它支持很多种类型的数据结构,不仅支持string类型的value,还支持很多种复杂类型的数据。以下简单列出redis支持的数据类型,后续再对每种数据类型以及它们的常用操作命令做详细介绍
1.安全二进制氏String类型:将String类型作为元素值;
2.Lists类型:根据插入顺序的String类型为元素的集合,基于Linked List实现,非Array型;
3.Sets类型:无重复且无序的String类型为元素的集合;
4.Sorted Set类型:无重复且有序的String类型为元素的集合;
5.Hashes类型:映射域到值类型的数据结构,其中域和值都是String类型;
二.Redis数据类型详解
在介绍数据类型之前,先让我们来看看Redis k-v数据结构中非常重要的key形式。redis中的key是二进制安全的也就是说任何二进制序列都可以作为key,譬如:字符串“foo”,一张图片的内容等。甚至空字符串都可以。
良好的key的命名规则如下:
1.key不要太长。在redis中可以的最大容量是512M,但是实际中key超过1024byte就非良好的设计方式了。key值太大不仅浪费内存空间,更是在请求中对于key'的查找需要更多的时间进行比较;
2.key值不宜太短。这个原则貌似与第一条相冲突,实则不然。有时key的变长使得增加空间相对于使得key更具可读性更显次要;
3.key的命名中可以使用冒号和破折号加以细分,使key更具可读性,灵活性。例如:aticle:1000:tags。其中第一位表示类型,第二位表示该类型对象的Id,第三位表示Id为1000的文章中的标记;
作用于Key的常用命令:
redis提供很多非常实用而有效的命令,这些命令作用于redis中的Key,管理Key的空间。
1.EXISTS
exists主要是查找指定的键是否存在,如果存在则返回(Integer) 1,否则返回(Integer) 0。使用情况如下:
首先实用redis-cli命令进入redis的客户端命令行模式:
127.0.0.1:6379> SET mystring "mystring0"
OK
127.0.0.1:6379> GET mystring
"mystring0"
127.0.0.1:6379> EXISTS mystring
(integer) 1
127.0.0.1:6379> EXISTS mystring1
(integer) 0
127.0.0.1:6379>
2.DEL
del主要用来删除Key,并将Key对应的值随之删除。
127.0.0.1:6379> EXISTS mystring
(integer) 1
127.0.0.1:6379>
127.0.0.1:6379> DEL mystring
(integer) 1
127.0.0.1:6379> EXISTS mystring
(integer) 0
127.0.0.1:6379> GET mystring
(nil)
127.0.0.1:6379>
expire设置Key的有效期,如果超过设定的存活时间,Key将自动失效并随之删除。与之相反的命令PERSIST使Key永久有效,与之协作的命令TTL查看Key剩余有效时间。
127.0.0.1:6379> SET mystring1 "string1"
OK
127.0.0.1:6379> EXISTS mystring1
(integer) 1
127.0.0.1:6379> EXPIRE mystring1 10000
(integer) 1
127.0.0.1:6379> GET mystring1
"string1"
127.0.0.1:6379> TTL mystring1
(integer) 9976
127.0.0.1:6379> TTL mystring1
(integer) 9975
127.0.0.1:6379> TTL mystring1
127.0.0.1:6379>
127.0.0.1:6379> SET mystring2 "string2"
OK
127.0.0.1:6379> EXPIRE mystring2 20
(integer) 1
127.0.0.1:6379>
127.0.0.1:6379> GET mystring2
"string2"
127.0.0.1:6379> TTL mystring2
(integer) 6
127.0.0.1:6379> TTL mystring2
(integer) 5
127.0.0.1:6379> TTL mystring2
(integer) 2
127.0.0.1:6379> TTL mystring2
(integer) 1
127.0.0.1:6379> GET mystring2
(nil)
127.0.0.1:6379>
redis中Value的数据类型
- Sting类型
127.0.0.1:6379> SET mystring7 string7
OK
127.0.0.1:6379> GET mystring7
"string7"
127.0.0.1:6379> SET mystring8 "string8"
OK
127.0.0.1:6379> GET mystring8
"string8"
从以上命令中可以看到GET返回的值是String类型,且SET命令中的value参数可以含有双引号也不含有。SET和GET命令是设置和获取String类型的基本命令,且它们可以附加参数,但这里不加以讨论其命令,在稍后的章节中再详细介绍命令的使用详情。
127.0.0.1:6379> SET mystring12 100
OK
127.0.0.1:6379> INCR mystring12
(integer) 101
127.0.0.1:6379> GET mystring12
"101"
127.0.0.1:6379> INCRBY mystring12 35
(integer) 136
127.0.0.1:6379> GET mystring12
"136"
127.0.0.1:6379> DECR mystring12
(integer) 135
127.0.0.1:6379> GET mystring12
"135"
127.0.0.1:6379> DECRBY mystring12 200
(integer) -65
127.0.0.1:6379> GET mystring12
"-65"
String类型非常简单,我们就介绍的这里。以后介绍命令时候再进行补充!
- Lists类型
127.0.0.1:6379> LPUSH mylist0 name age address phoneNo
(integer) 4
127.0.0.1:6379> RPUSH mylist1 name age address phoneNo
(integer) 4
127.0.0.1:6379> LRANGE mylist0 0 -1
1) "phoneNo"
2) "address"
3) "age"
4) "name"
127.0.0.1:6379> LRANGE mylist1 0 -1
1) "name"
2) "age"
3) "address"
4) "phoneNo"
其中LRANGE中的第二个参数表示要查找元素的起始位,第三个元素表示结束位(若为负数,表示从List尾部开始计数。例如:-1表示倒数第一位,-2表示倒数第二位),其中mylist0和mylist1元素位置刚好相反。
127.0.0.1:6379> RPOP mylist1
"phoneNo"
127.0.0.1:6379> RPOP mylist1
"address"
127.0.0.1:6379> RPOP mylist1
"age"
127.0.0.1:6379> RPOP mylist1
"name"
127.0.0.1:6379> RPOP mylist1
(nil)
RPOP命令使得mylist1一直从右边弹出新的元素,并且移除。直到元素为空。
127.0.0.1:6379> EXISTS mylist1
(integer) 0
这时发现mylist1键已经不存在。redis提供了非常棒的功能:自动创建或者移除Key。意思是说,不需要预先创建值为空的Key,在向指定的Key中存入元素的时候如果发现Key不存在就自动创建Key。同理,也不需要删除元素为空的键,在复杂类型中如果元素为空,则Key将会被自动删除。这样可以保证更有效的利用Key空间!
Blocking on List
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379> BRPOP mylist 10000
如上使用BRPOP命令,则客户端阻塞等待。第二个参数是超时时间,如果为0表示一直等待。再打开一个redis-cli命令窗口,向mylist中添加新的元素:
127.0.0.1:6379> LPUSH mylist lxy
(integer) 1
127.0.0.1:6379>
则等待的客户端得到通知,返回新的元素:
127.0.0.1:6379> BRPOP mylist 10000
1) "mylist"
2) "lxy"
(218.69s)
127.0.0.1:6379>
因为BRPOP可以等待多个List,所以返回时候同时返回List名的元素。第三个参数为已等待时间。
A few things to note about BRPOP:
- Clients are served in an ordered way: the first client that blocked waiting for a list, is served first when an element is pushed by some other client, and so forth.
- The return value is different compared to RPOP: it is a two-element array since it also includes the name of the key, because BRPOP and BLPOP are able to block waiting for elements from multiple lists.
- If the timeout is reached, NULL is returned.
- Sets类型
127.0.0.1:6379> SADD myset 0 0 1 2 3 4 5 6 6 6 7 8 8
(integer) 9
从上可以看出,虽然有很多重复元素,但是直插入了9个元素。
127.0.0.1:6379> SISMEMBER myset 0
(integer) 1
127.0.0.1:6379> SISMEMBER myset 9
(integer) 0
127.0.0.1:6379> SISMEMBER myset 7
(integer) 1
127.0.0.1:6379>
3.SMEBERS
127.0.0.1:6379> SMEMBERS myset
1) "0"
2) "1"
3) "2"
4) "3"
5) "4"
6) "5"
7) "6"
8) "7"
9) "8"
127.0.0.1:6379>
- Sorted Set类型
127.0.0.1:6379> ZADD mysortset 1 "BACD"
(integer) 1
127.0.0.1:6379> ZADD mysortset 2 "ABCD<span style="font-family: Arial, Helvetica, sans-serif;">"</span>
(integer) 0
127.0.0.1:6379> ZADD mysortset 2 "BCDE"
(integer) 1
zadd中1,2,2就是这个元素的score,根据score进行排序元素。
127.0.0.1:6379> ZRANGE mysortset 0 -1
1) "BACD"
2) "ABCD"
3) "BCDE"
127.0.0.1:6379>
127.0.0.1:6379> ZREVRANGE mysortset 0 -1
1) "BCDE"
2) "ABCD"
3) "BACD"
127.0.0.1:6379>
以上后去元素还可以携带参数,输出score
127.0.0.1:6379> ZRANGE mysortset 0 -1 withscores
1) "BACD"
2) "1"
3) "ABCD"
4) "2"
5) "BCDE"
6) "2"
127.0.0.1:6379>
Sorted Set不仅仅以上的功能,它还提供了在范围上的操作:
127.0.0.1:6379> ZRANGEBYSCORE mysortset -inf 4 withscores
1) "BACD"
2) "1"
3) "ABCD"
4) "2"
5) "BCDE"
6) "2"
127.0.0.1:6379>
2.ZREMRANGBYSCORE
127.0.0.1:6379> ZREMRANGEBYSCORE mysortset 2 6
(integer) 3
127.0.0.1:6379>
以上只是Sorted Set的简单命令使用,对于复杂的命令将在后续章节中详细介绍,这里只讨论数据类型。
- Hashes类型
redis中的Hashes类型类似Java中map,key-value键值对映射型数据结构。redis提供了很多命令用于操作Hashes。
1.HMSET
hmset用于向Hashes中插入元素,插入元素的规则如下:
127.0.0.1:6379> HMSET usr:1000 username lxy birth 1991 verified 1
OK
127.0.0.1:6379>
2.HMGET、HGET
hmge和HGET都是用于获取Hashes中的元素,规则如下:
127.0.0.1:6379> HMGET usr:1000 username birth verified
1) "lxy"
2) "1991"
3) "1"
127.0.0.1:6379> <span style="font-family: Arial, Helvetica, sans-serif;"> </span>
127.0.0.1:6379> HGET usr:1000 username birth
(error) ERR wrong number of arguments for 'hget' command
127.0.0.1:6379>
127.0.0.1:6379> HGET usr:1000 username
"lxy"
127.0.0.1:6379>
从以上的使用情况可以看出,HMGET是同时获取Hashes中的多个Key的值,而HGET一次只能获取一个!
如发现文章中有错误的地方,希望广大读者们及时与我沟通,帮我纠正错误,谢谢各位的支持!
本篇文章参考:
An introduction to Redis data types and abstractions:http://redis.io/topics/data-types-intro