redis数据结构 – strings
有人说,如果只使用redis中的字符串类型,且不使用redis的持久化功能,那么,redis就和memcache非常非常的像了。这说明strings类型是一个很基础的数据类型,也是任何存储系统都必备的数据类型。
我们来看一个最简单的例子:
setmystr"hello world!"//设置字符串类型getmystr//读取字符串类型
字符串类型的用法就是这么简单,因为是二进制安全的,所以你完全可以把一个图片文件的内容作为字符串来存储。
另外,我们还可以通过字符串类型进行数值操作:
127.0.0.1:6379>setmynum"2"OK127.0.0.1:6379>getmynum"2"127.0.0.1:6379>incrmynum(integer) 3127.0.0.1:6379>getmynum"3"
看,在遇到数值操作时,redis会将字符串类型转换成数值。
redis数据结构 – lists
redis的另一个重要的数据结构叫做lists,翻译成中文叫做“列表”。
首先要明确一点,redis中的lists在底层实现上并不是数组,而是链表,也就是说对于一个具有上百万个元素的lists来说,在头部和尾部插入一个新元素,其时间复杂度是常数级别的,比如用LPUSH在10个元素的lists头部插入新元素,和在上千万元素的lists头部插入新元素的速度应该是相同的。
虽然lists有这样的优势,但同样有其弊端,那就是,链表型lists的元素定位会比较慢,而数组型lists的元素定位就会快得多。
lists的常用操作包括LPUSH、RPUSH、LRANGE等。我们可以用LPUSH在lists的左侧插入一个新元素,用RPUSH在lists的右侧插入一个新元素,用LRANGE命令从lists中指定一个范围来提取元素。我们来看几个例子:
//新建一个list叫做mylist,并在列表头部插入元素"1"127.0.0.1:6379> lpush mylist"1"//返回当前mylist中的元素个数(integer)1//在mylist右侧插入元素"2"127.0.0.1:6379> rpush mylist"2"(integer)2//在mylist左侧插入元素"0"127.0.0.1:6379> lpush mylist"0"(integer)3//列出mylist中从编号0到编号1的元素127.0.0.1:6379>lrangemylist011)"0"2)"1"//列出mylist中从编号0到倒数第一个元素127.0.0.1:6379>lrangemylist0-11)"0"2)"1"3)"2"
redis数据结构 – 集合
redis的集合,是一种无序的集合,集合中的元素没有先后顺序。
集合相关的操作也很丰富,如添加新元素、删除已有元素、取交集、取并集、取差集等。我们来看例子:
//向集合myset中加入一个新元素"one"127.0.0.1:6379> sadd myset"one"(integer)1127.0.0.1:6379> sadd myset"two"(integer)1//列出集合myset中的所有元素127.0.0.1:6379> smembers myset1)"one"2)"two"//判断元素1是否在集合myset中,返回1表示存在127.0.0.1:6379> sismember myset"one"(integer)1//判断元素3是否在集合myset中,返回0表示不存在127.0.0.1:6379> sismember myset"three"(integer)0//新建一个新的集合yourset127.0.0.1:6379> sadd yourset"1"(integer)1127.0.0.1:6379> sadd yourset"2"(integer)1127.0.0.1:6379> smembers yourset1)"1"2)"2"//对两个集合求并集127.0.0.1:6379> sunion myset yourset1)"1"2)"one"3)"2"4)"two"
redis数据结构 – 有序集合
redis不但提供了无需集合(sets),还很体贴的提供了有序集合(sorted sets)。有序集合中的每个元素都关联一个序号(score),这便是排序的依据。
很多时候,我们都将redis中的有序集合叫做zsets,这是因为在redis中,有序集合相关的操作指令都是以z开头的,比如zrange、zadd、zrevrange、zrangebyscore等等
//新增一个有序集合myzset,并加入一个元素baidu.com,给它赋予的序号是1:127.0.0.1:6379> zadd myzset1baidu.com(integer)1//向myzset中新增一个元素360.com,赋予它的序号是3127.0.0.1:6379> zadd myzset3360.com(integer)1//向myzset中新增一个元素google.com,赋予它的序号是2127.0.0.1:6379> zadd myzset2google.com(integer)1//列出myzset的所有元素,同时列出其序号,可以看出myzset已经是有序的了。127.0.0.1:6379> zrange myzset0-1with scores1)"baidu.com"2)"1"3)"google.com"4)"2"5)"360.com"6)"3"//只列出myzset的元素127.0.0.1:6379> zrange myzset0-11)"baidu.com"2)"google.com"3)"360.com"
redis数据结构 – 哈希
最后要给大家介绍的是hashes,即哈希。哈希是从redis-2.0.0版本之后才有的数据结构。
hashes存的是字符串和字符串值之间的映射,比如一个用户要存储其全名、姓氏、年龄等等,就很适合使用哈希。
我们来看一个例子:
//建立哈希,并赋值127.0.0.1:6379> HMSETuser:001username antirez password P1pp0 age34OK//列出哈希的内容127.0.0.1:6379> HGETALLuser:0011)"username"2)"antirez"3)"password"4)"P1pp0"5)"age"6)"34"//更改哈希中的某一个值127.0.0.1:6379> HSETuser:001password12345(integer)0//再次列出哈希的内容127.0.0.1:6379> HGETALLuser:0011)"username"2)"antirez"3)"password"4)"12345"5)"age"6)"34"