Redis 不仅仅是简单的 key-value 存储器,同时也是一种 data structures server。传统的 key-value 是指支持使用一个 key 字符串来索引 value 字符串的存储,而 Redis 中,value 不仅仅支持字符串,还支持更多的复杂结构,包括列表、集合、哈希表等。
Redis keys 是采用二进制安全,这就意味着你可以使用任何二进制序列作为重点,比如:"foo" 可以联系一个 JPEG 文件;空字符串也是一个有效的密钥。
redis String
> set mykey somevalue > get mykey
可以使用 set 和 get 命令来创建和检索 strings。注意:set 命令将取代现有的任何已经存在的 key。set 命令还有一个提供附加参数的选项,我们能够让 set 命令只有在没有相同 key 的情况下成功,反之亦然,可以让 set 命令在有相同 key 值的情况下成功:
> set mykey newval nx #只有在没有key的情况下成功 > set mykey newval xx #只有在有key的情况下成功
Redis 可以运用 mset 和 mget 命令一次性完成多个 key-value 的对应关系,使用 mget 命令,Redis 返回一个 value 数组:
> mset a 10 b 20 c 30 > mget a b c
redis Lists
> rpush mylist A > rpush mylist B > lpush mylist first > lrange mylist 0 -1 1) "first" 2) "A" 3) "B"
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边),lpush 命令插入一个新的元素到头部,而 rpush 命令插入一个新元素到尾部。当这两个操作中的任一操作在一个空的 Key 上执行时就会创建一个新的列表。相似的,如果一个列表操作清空一个列表,那么对应的 key 将被从 key 空间删除。
注意:lrange 需要两个索引,0 表示 list 开头第一个,-1 表示 list 的倒数第一个,即最后一个。-2 则是 list 的倒数第二个,以此类推。
push可以一次加入多个元素放入 list:
> rpush mylist 1 2 3 4 5 "foo bar" > lrange mylist 0 -1
与push相对的则是pop命令。 它可以弹出一个元素,简单的理解就是获取并删除第一个元素,和 push 类似的是它也支持双边的操作,可以从右边弹出一个元素也可以从左边弹出一个元素,对应的指令为 rpop 和 lpop:
> del mylist > rpush mylist a b c > rpop mylist > lrange mylist 0 -1 > lpop mylist > lrange mylist 0 -1 1) "b"
list的阻塞操作
>brpop mylist 2
Redis 提供了阻塞式访问 brpop 和 blpop 命令。用户可以在获取数据不存在时阻塞请求队列,如果在时限内获得数据则立即返回,如果超时还没有数据则返回 null。假如在指定时间内没有任何元素被弹出,则返回一个 nil 和等待时长。 反之,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值。
应用场景:
List 元素是线性有序的,很容易就可以联想到聊天记录,你一言我一语都有先后,因此 List 很适合用来存储聊天记录等顺序结构的数据。
redis Hashes
> hmset user:1000 username antirez birthyear 1977 verified 1 > hget user:1000 username > hget user:1000 birthyear > hgetall user:1000 1) "username" 2) "antirez" 3) "birthyear" 4) "1977" 5) "verified" 6) "1"
hmset 命令设置一个多域的 hash 表,hget 命令获取指定的单域,hgetall 命令获取指定 key 的所有信息。hmget 类似于 hget,只是返回一个 value 数组。
同样可以根据需要对 hash 表的表项进行单独的操作,例如 hincrby:
> hincrby user:1000 birthyear 10 > hincrby user:1000 birthyear 10 (integer) 1997
注意:Redis Hincrby 命令用于为哈希表中的字段值加上指定增量值。
Redis Set
Redis 集合拥有令人满意的不允许包含相同成员的属性,多次添加相同的元素,最终在集合里只会有一个元素,这意味着它可以非常方便地对数据进行去重操作,一个 Redis 集合的非常有趣的事情是它支持一些服务端的命令从现有的集合出发去进行集合运算,因此你可以在非常短的时间内进行合并(unions), 求交集(intersections), 找出不同的元素(differences of sets)。
> sadd myset 1 2 3 > smembers myset
sadd 命令产生一个无序集合,返回集合的元素个数。smembers 用于查看集合。
> sismember myset 3 > sismember myset 30 > sismember mys 3 (integer) 0
sismember 用于查看集合是否存在,匹配项包括集合名和元素个数。匹配成功返回 1,匹配失败返回 0。
Redis 有序集合
Redis 有序集合与普通集合非常相似,是一个没有重复元素的字符串集合。不同之处是有序集合的每一个成员都关联了一个权值,这个权值被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是权值可以是重复的。
> zadd hackers 1940 "Alan Kay" > zadd hackers 1957 "Sophie Wilson" > zadd hackers 1953 "Richard Stallman" > zrange hackers 0 -1 > zrevrange hackers 0 -1 1) "Sophie Wilson" 2) "Richard Stallman" 3) "Alan Kay"
Redis Zadd 命令用于将一个或多个成员元素及其分数值加入到有序集当中。
注:查看集合:zrange 是查看正序的集合,zrevrange 是查看反序的集合。0 表示集合第一个元素,-1 表示集合的倒数第一个元素。