Redis之所以被广泛使用,不只是因为它快,还因为它除了支持最简单的字符串(String)类型外,它还支持好几种数据类型:
- 哈希(Hash)
- 列表(List)
- 集合(Set)
- 有序集合(Sorted Set)
- 位图 ( Bitmap )
String为最简单的类型,一个key对应一个value,它还可以存二进制的对象(Bitmap)。
示例:
127.0.0.1:6379> set mykey "aminglinux.com"OK127.0.0.1:6379> get mykey"aminglinux.com"127.0.0.1:6379> mset key1 1 key2 a key3 c127.0.0.1:6379> mget key1 key2 key31) "1"2) "a"3) "c"Hash
Hash是键值对的集合。在 Redis 中,Hash是字符串字段和字符串值之间的映射。因此,它们适合表示对象。比如用户的昵称、年龄、性别、积分等。示例:
127.0.0.1:6379> hset hash1 name aming127.0.0.1:6379> hget hash1 name"aming"127.0.0.1:6379> hset hash1 age 30127.0.0.1:6379> hget hash1 age"30"127.0.0.1:6379> hgetall hash11) "name"2) "aming"3) "age"4) "30List
List是一个链表结构,主要功能是push、pop获取一个范围的所有值等等。操作中key理解为链表的名字。使用List 结构,我们可以轻松地实现最新消息排行等功能(比如新浪微博的 TimeLine )。List 的另一个应用就是消息队列,可以利用List的push操作,将任务存在List 中,然后工作线程再用pop操作将任务取出进行执行。
示例:
127.0.0.1:6379> LPUSH list1 "aminglinux"127.0.0.1:6379> LPUSH list1 "1 2 3"127.0.0.1:6379> LPUSH list1 "aaa bbb"127.0.0.1:6379> LRANGE list1 0 -11) "aaa bbb"2) "1 2 3"3) "aminglinux“127.0.0.1:6379> LPOP list1Set
Set是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合求交并差等操作。操作中key理解为集合的名字。比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。因为Redis非常人性化的为集合提供了求交集、并集、差集等操作,那么就可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。
示例
127.0.0.1:6379> SADD set1 a127.0.0.1:6379> SADD set1 b127.0.0.1:6379> SADD set1 c127.0.0.1:6379> SADD set1 d127.0.0.1:6379> SMEMBERS set11) "d"2) "b"3) "a"4) "c"127.0.0.1:6379> SREM set1 c//删除元素127.0.0.1:6379> SADD set2 a 2 b127.0.0.1:6379> SINTER set1 set2 //交集127.0.0.1:6379> SUNION set1 set2 //并集127.0.0.1:6379> SDIFF set1 set2 //差集Sorted set
Sorted Set是有序集合,它比set多了一个权重参数score,使得集合中的元素能够按score进行有序排列,比如一个存储全班同学成绩的Sorted Set,其集合value 可以是同学的学号,而score就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。示例
127.0.0.1:6379> ZADD set3 12 abc127.0.0.1:6379> ZADD set3 2 "cde 123"127.0.0.1:6379> ZADD set3 24 "123-aaa"127.0.0.1:6379> ZADD set3 4 "a123a"127.0.0.1:6379> ZRANGE set3 0 -11) "cde 123"2) "a123a"3) "abc"4) "123-aaa"
倒序
127.0.0.1:6379> ZREVRANGE set3 0 -11) "123-aaa"2) "abc"3) "a123a"4) "cde 123"Bitmap
Bitmap,即位图,它从严格意义上来说,并不是一种独立的数据类型,而是一种特殊的String数据类型。它是一串连续的二进制数组(0和1),可以通过偏移量(offset)定位元素。
BitMap通过最小的单位bit来进行0|1的设置,表示某个元素的值或者状态,时间复杂度为O(1)。
由于bit是计算机中最小的单位,使用它进行储存将非常节省空间,特别适合一些数据量大且使用二值统计的场景。
示例
127.0.0.1:6379> setbit aaa:001 10001 1 # 返回操作之前的数值(integer) 0127.0.0.1:6379> setbit aaa:001 10002 2 # 如果值不是0或1就报错(error) ERR bit is not an integer or out of range127.0.0.1:6379> setbit aaa:001 10002 0(integer) 0127.0.0.1:6379> setbit aaa:001 10003 1(integer) 0由于这种数据场景用的并不多,所以不多做解释了。