|
安装Redis之后大家肯定都试过get set 命令了,也了解了最基本的数据类型字符串,下面让我们认识以下Redis 中的其他成员吧。
- 二进制安全(Binary-safe)的字符串(String)
- 二进制安全的字符串列表(List)
- 二进制安全的字符串集合(Set)
- 有序的集合(SortedSet)
1RedisKeys
这里的key指的是Redis 键值对的key。
Redis Key 是二进制安全的,也就是说你可以用任意二进制序列作为key,从一个简单的字符串到一个jpg图片内容。空字符串也是有效的key值。
key个几个规则:
- 不要太长。这个大家都明白,越长越消耗内存,查找时的计算代价也越高。
- 不要太短。太短的key不容已阅读和理解,比如user:100:password 写成u:1000:p,会让人不明所以。因为key相对与value总是很小的,所以由此带来的一点点的空间节省并无太大优势。
- 遵循一种模式。比如“对象类型:id:字段名”,就行上面提到的user:100:password,如果有多个单词,可以用一个点来代替空格:comment:1234:reply.to
2字符串
这个是Redis 最简单的数据类型,如果还没有安装Redis,那么到下面网页感受一下把:
http://redis.io/commands/get
ps: 本文的例子都是在线录入的。直接在Example 下面的文本框里输入命令,回车。
redis>set 我alan
OK
redis>get 我
"alan"
redis>set 暗号"还记得大名湖畔的 唉冬瓜吗 "
OK
redis>get 暗号
"还记得大名湖畔的 唉冬瓜吗 "
redis>
这里我直接用中文作为key,没有一点问题。
前面提到key 可以是任意二进制字符串,那么值也同样,你可以保存一副图片(值大小不能超过512M)。
虽然字符串是基本类型,也可以进行一些有趣的操作:
redis>set qty 256
OK
redis>get qty
"256"
redis>incr qty
(integer)257
redis>get qty
"257"
redis>incrby qty 100
(integer)357
redis>get qty
"357"
redis>
incr 命令把字符串解析成整型,然后+1,再保存为字符串。类似的命令还有incrby, decr, decrby。
如果字符串值不能解析成整数,incr命令会报错,如ERR value is not an integer or out of range。
redis>set name alan
OK
redis>incr name
ERR valueis not an integer or out of range
redis>
incr 叫做atomic increment,其atomic (原子)特性的意义:如果两个客户端同时发送incr 命令,客户端会同时读到“10”,对它们+1,最终的结果一定为12,要更多了解可以去官网查看相关资料。
3列表(list)
首先讲一下list的理论背景,list这个词很多时候都被不恰当的使用,比如python 的list,她们实际上是数组。一般意义上讲,list就是有序元素的集合。而使用数组 实现,和使用 linked list实现的list在属性上有所不同。
Redis 的list 是使用Linked List 实现的,其优点是在list的两端添加元素其时间复杂度是常数级的。也就是说你在‘10个元素的list头部添加新元素,和在一亿个元素的list头部添加消耗的时间相同;而使用数组实现list的优势在于索引速度非常快。
Redis使用Linked List实现的原因是:对于一个数据库系统来说,能快速在很大的列表上添加元素至关重要。
3.1第一步
添加新元素的命令是lpush 和rpush,分别在左边(头部)和右边(尾部)添加一个元素。lrange接受三个参数,列表的key,范围的开始,范围的结束,返回一个列表的片段。
redis>lpush message "你好,很高兴认识你"
(integer)1
redis>lpush message "我也很高兴认识你,我是alan"
(integer)2
redis>lpush message "我的名字是bruce "
(integer)3
redis>lrange message 0 2
1) "我的名字是bruce "
2)"我也很高兴认识你,我是alan"
3)"你好,很高兴认识你"
redis>
由上面例子里,我们每次都在列表头部添加一个元素。
lrange也可已接受负数来表示范围,-1 是最后一个元素,-2是倒数第二个元素。
redis>lrange message -1 -1
1)"你好,很高兴认识你"
redis>lrange message -1 2
1)"你好,很高兴认识你"
redis>lrange message -2 2
1)"我也很高兴认识你,我是alan"
2)"你好,很高兴认识你"
redis>
由上例,list可以应用到聊天系统;可以用在评级系统里,比如reddit.com;用在博客引擎中,每篇日志都是一个list,然后向里面放入评论;等等。
3.2在List中放入ID,而不是数据
上例中,我们直接将数据对象(消息的内容)放入了list,由于对象可能多次被引用,通常我们不那样做,而是存放ID到list中。
上面聊天的例子,我们用新的方式来存储:
redis>incr next.message.id
(integer)1
redis>set message:1:sender alan
OK
redis>set message:1:content "hello, something else"
OK
redis>lpush messages 1
(integer)1
redis>incr next.message.id
(integer)2
redis>set message:2:sender bruce
OK
redis>set message:2:content "something else else ..."
OK
redis>lpush messages 2
(integer)2
这次,我们先通过incr 生成一个唯一的ID,然后创建对象,并为对象赋值,最后把这个对象的id 放入list中。
在命令参考里可以看到更多关于list的命令,Redis命令参考传送
4集合Set
Redis的Set 是无序的,元素是二进制安全的字符串。
- sadd命令可以向集合中添加一个元素
- scard命令获得集合中元素的个数
- smembers命令获得集合中所有元素(无序)
- srem 移除集合中的一个或者多个元素
redis>sadd myset 1
(integer)1
redis>sadd myset 2
(integer)1
redis>scard myset
(integer)2
redis>sadd myset 3
(integer)1
redis>scard myset
(integer)3
redis>smembers myset
1) "1"
2) "2"
3) "3"
redis>srem myset 1
(integer)1
redis>srem myset 2 3
(integer)2
redis>smembers myset
(empty listor set)
redis>
redis>sadd myset 2
(integer)1
redis>sismember myset 2
(integer)1
redis>sismember myset 22
(integer)0
如果元素存在返回1,不存在返回0。
redis>sadd set1 1
(integer)1
redis>sadd set1 2
(integer)1
redis>sadd set1 3
(integer)1
redis>sadd set2 2
(integer)1
redis>sadd set2 3
(integer)1
redis>sadd set2 4
(integer)1
redis>sinter set1 set2
1) "2"
2) "3"
redis>
5有序集合Sorted Set / ZSet
关于有序集合的意义不多说,可以用zadd 来创建一个有序集合,用zrange 获取元素:
redis>zadd students 15 tom
(integer)1
redis>zadd students 33 bill
(integer)1
redis>zadd students 18 alis
(integer)1
redis>zadd students 18 alan
(integer)1
redis>zrange students 0 -1
1) "tom"
2) "alan"
3) "alis"
4) "bill"
ZSet 的每个元素都有一个评分,Redis通过这个评分排序。上面例子中15 33 18 18 都是评分,如果评分相同那么会根据元素进行排序。上面alan 排在了alis 的前面。
redis>zrevrange students 0 -1
1) "bill"
2) "alis"
3) "alan"
4) "tom"
- 通过zrangebyscore 来获取ZSet 的片段,比如我们要获得评分在18 - 30 之间的元素:
redis>zrangebyscore students 18 30
1) "alan"
2) "alis"
可以看到评分为 18 的元素都包含进来了。
- inf 代表正的极限,-inf 代表负的极限,可以用这个来获取大/小于某个评分的元素
redis>zrangebyscore students -inf 30
1) "tom"
2) "alan"
3) "alis"
redis>zremrangebyscore students -inf 30
(integer)3
redis>zrange students 0 -1
1) "bill"
redis>
可以看到评分为-inf 到30 的元素都被删除了(共3个),最后只剩下了一个元素。
参考:http://redis.io/topics/data-types-intro |
|
|
|
|
|
|