Redis 的五种数据类型:String, Hash, Lists, Sets, Sorted Sets.
String
在redis中,String是最常见的数据类型。简单举例如下:
1 2 3 4 5 6 7 |
set users:leto "{name: leto, planet: dune, likes: [spice]}" strlen users:leto (integer) 42 getrange users:leto 27 40 "likes: [spice]" append users:leto " OVER 9000!!" (integer) 54 |
虽然,Redis并不关心value的值及其类型,但是少数命令例外。
1 2 3 4 5 6 7 8 |
incr stats:page:about (integer) 1 incr stats:page:about (integer) 2 incrby ratings:video:12333 5 (integer) 5 incrby ratings:video:12333 3 (integer) 8 |
Hash
Hash存储并不是简单的序列化的值,我们可以对其中的一部分数据,进行更新或者删除。
1 2 3 4 5 |
hmset users:goku race saiyan age 737 hmget users:goku race powerlevel hgetall users:goku hkeys users:goku hdel users:goku age |
Lists
对于给定的键,List可以管理值的一个数组,并且通过索引,可以获取相应的值。
1 2 |
rpush newusers goku # 增加一个值 ltrim newusers 0 50 #对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除 |
上面,ltrim保留最新的50个值。ltrim操作的时间复杂度是O(N),N指的是删除值的个数。一般情况下,执行完插入操作后,马上执行ltrim操作,那么时间复杂度是O(1),因为只有一个值会删除。
Sets
Set是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合求交并差等操作,操作中key理解为集合的名字。
一个经典的例子是粉丝列表:
1 2 |
sadd friends:leto ghanima paul chani jessica sadd friends:duncan paul jessica alia |
我们可以查找用户A是否是用户B的一个粉丝。
1 2 |
sismember friends:leto jessica sismember friends:leto vladimir |
时间复杂度是O(1)。
我们也可以查找两个用户之间的共同粉丝。
1 |
sinter friends:leto friends:duncan |
Sorted Sets
Sorted Sets 与Set类似,但是有一个分数(score)与之关联。分数提供了排序的功能。默认排序是从小到大的,最常见的应用是排行榜。