存储结构
redis支持的数据类型包括字符串、散列表、列表、集合、有序集合五种类型。
1、字符串:是redis中最基本的数据类型,它能存储任何形式的字符串,包括二进制数据。一个字符串类型键允许存储的数据最大容量为512MB。
常用的命令:
1).set/get:
127.0.0.1:6379[2]> set key hello
OK
127.0.0.1:6379[2]> get key
"hello"
127.0.0.1:6379[2]> set key "hello world"
OK
127.0.0.1:6379[2]> get key
"hello world"
127.0.0.1:6379[2]>
如果字符串之间有空格,需要用双引号引起。
2).append(在字符串的尾部追加字符串)
127.0.0.1:6379[2]> set key hello
OK
127.0.0.1:6379[2]> append key " world"
(integer) 11
127.0.0.1:6379[2]> get key
"hello world"
127.0.0.1:6379[2]>
3).strlen key(获取键值的长度)
127.0.0.1:6379[2]> get key
"hello world"
127.0.0.1:6379[2]> strlen key
(integer) 11
127.0.0.1:6379[2]>
4).同时获得/设置多个键值
127.0.0.1:6379[2]> mset key1 "hello" key2 "world" key3 "china"
OK
127.0.0.1:6379[2]> mget key1 key2 key3
1) "hello"
2) "world"
3) "china"
127.0.0.1:6379[2]>
2、散列类型:Redis是采用字典结构以键值对的形式存储数据的,而散列类型(hash)的键值也是一种字典结构,其存储了字段和字段值的映射。但字段值只能是字符串,不支持其它数据类型,即不能嵌套其它数据类型。
常用的命令:
1)赋值/取值(hset/hget、hmset/hmget、hgetall)
127.0.0.1:6379[2]> hset person name lisi
(integer) 1
127.0.0.1:6379[2]> hget person name
"lisi"
127.0.0.1:6379[2]> hmset person name lisi sex man birthday 2001-09-26
OK
127.0.0.1:6379[2]> hmget person name sex birthday
1) "lisi"
2) "man"
3) "2001-09-26"
127.0.0.1:6379[2]> hgetall person
1) "name"
2) "lisi"
3) "sex"
4) "man"
5) "birthday"
6) "2001-09-26"
127.0.0.1:6379[2]>
2).判断字段是否存在
127.0.0.1:6379[2]> hexists person address
(integer) 0
127.0.0.1:6379[2]> hexists person sex
(integer) 1
127.0.0.1:6379[2]>
3).判断当字段不存在时赋值,否则不做处理(hsetnx).
127.0.0.1:6379[2]> hexists person address
(integer) 0
127.0.0.1:6379[2]> hexists person sex
(integer) 1
127.0.0.1:6379[2]> hsetnx person address "北京市"
(integer) 1
127.0.0.1:6379[2]> hexists person address
(integer) 1
127.0.0.1:6379[2]>
3、列表类型:可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素或者获得列表的某一个片段。列表类型内部是使用双向链表实现的。
常用的命令:
1).获取/增加元素(lpop/lpush)
127.0.0.1:6379[2]> lpush lkey 1
(integer) 1
127.0.0.1:6379[2]> lpop lkey
"1"
127.0.0.1:6379[2]>
2).一次设置多个元素(lpush key value1 valu2....)、获取指定key的指定范围的元素值(lrange key start end).
127.0.0.1:6379[2]> lpush lkey 1 2 3 4 5
(integer) 5
127.0.0.1:6379[2]> lrange lkey 0 3
1) "5"
2) "4"
3) "3"
4) "2"
127.0.0.1:6379[2]>
3).获取/设置指定索引的元素值(lindex/lset).
127.0.0.1:6379[2]> lpush lkey1 1 2 3 4 5
(integer) 5
127.0.0.1:6379[2]> lrange lkey1 0 4
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379[2]> lindex lkey1 5
(nil)
127.0.0.1:6379[2]> lindex lkey1 4
"1"
127.0.0.1:6379[2]> lset lkey1 4 0
OK
127.0.0.1:6379[2]> lindex lkey1 4
"0"
127.0.0.1:6379[2]>
4).向列表中插入元素(linsert key before|after pivot value).
127.0.0.1:6379[2]> linsert lkey1 after 5 6
(integer) 6
127.0.0.1:6379[2]> lrange lkey1 0 -1
1) "5"
2) "6"
3) "4"
4) "3"
5) "2"
6) "0"
127.0.0.1:6379[2]>
4、集合类型:集合类型在redis内部使用值为空的散列表(hash table)实现的,最方便的是多个集合类型键之间可以进行并集、交集和差集运算.
常用的命令:sadd、srem、smembers、sismember、sdiff、sinter、sunion。
1).增加(sadd)、删除(srem)、获取所有增加的元素(smembers)、判断指定元素是否存在(sismembers)。
127.0.0.1:6379[2]> sadd skey a b c d e
(integer) 5
127.0.0.1:6379[2]> smembers skey
1) "d"
2) "b"
3) "a"
4) "c"
5) "e"
127.0.0.1:6379[2]> srem skey a c
(integer) 2
127.0.0.1:6379[2]> smembers skey
1) "d"
2) "b"
3) "e"
127.0.0.1:6379[2]> sismember skey a
(integer) 0
127.0.0.1:6379[2]>
2).集合运算(sdiff、sinter、sunion).
127.0.0.1:6379[2]> sadd set1 a b c d
(integer) 4
127.0.0.1:6379[2]> sadd set2 c d e f g
(integer) 5
127.0.0.1:6379[2]> sdiff set1 set2
1) "b"
2) "a"
127.0.0.1:6379[2]> sdiff set2 set1
1) "f"
2) "g"
3) "e"
127.0.0.1:6379[2]> sinter set1 set2
1) "d"
2) "c"
127.0.0.1:6379[2]> sunion set1 set2
1) "d"
2) "a"
3) "c"
4) "b"
5) "f"
6) "g"
7) "e"
127.0.0.1:6379[2]>
5、有序集合类型:有序集合类型是使用散列表和跳跃表实现的,所以即使读取位于中间的部分数据速度也很快(时间复杂度为O(log(N)))。
常用命令:
1).增加元素和获取元素的分数.
127.0.0.1:6379> zadd Tom 87 math 76 language 81 English
(integer) 3
127.0.0.1:6379> zscore Tom math
"87"
127.0.0.1:6379>
2).获取指定范围的元素.
127.0.0.1:6379> zadd Tom 87 math 76 language 81 English
(integer) 3
127.0.0.1:6379> zscore Tom math
"87"
127.0.0.1:6379> zrange Tom 0 2
1) "language"
2) "English"
3) "math"
127.0.0.1:6379> zrange Tom 0 2 withscores
1) "language"
2) "76"
3) "English"
4) "81"
5) "math"
6) "87"
127.0.0.1:6379>
以上是对redis支持的五种数据类型的说明,以及常用的操作指令。