导航

redis数据类型

Posted on 2018-03-13 16:01  Byyyyy  阅读(193)  评论(0)    收藏  举报

 

Redis数据类型

字符串类型:

字符串类型是Redis最基础的数据类型,能够存储任何形式的字符串,包括二进制数据,JSON化的对象等等。

赋值与取值

set key value
get key
127.0.0.1:6380[4]> set foo hello
OK
127.0.0.1:6380[4]> get foo
"hello"

递增数字

INCR key

当存储的字符串是整数的形式时,可以用INCR命令,返回一个整数类型的值,值为当前value的递增,如果value当前不是整数形式时,就会报错,当要操作的key不存在时,默认value为0,所以第一次递增的结果是1

127.0.0.1:6380[4]> get foo
"hello"
127.0.0.1:6380[4]> incr number
(integer) 1

增加指定的整数

INCR命令返回当前value的递增,即为value+=1,而INCRBY命令可以指定每次增加的数值,如:

127.0.0.1:6380[4]> INCRBY bar 3
(integer) 3
127.0.0.1:6380[4]> INCRBY bar 5
(integer) 8

减少指定的整数

与INCR以及INCRBY相反,让value减少,具体用法如下:

127.0.0.1:6380[4]> decrby bar 5
(integer) 3
127.0.0.1:6380[4]> decr bar
(integer) 2

 增加指定浮点数

INCRBYFLOAT命令,类似之前两个命令,区别是这个命令可以递增一个双精度的浮点数

127.0.0.1:6380[4]> INCRBYFLOAT tag 4.5
"4.5"

向尾部追加值

127.0.0.1:6380[4]> set key hello
OK
127.0.0.1:6380[4]> APPEND key " world"
(integer) 11

append向key-value的末尾追加value,如果key不存在,则将该key的value设置为value,此时与set相同,若存在,则返回追加后字符串的总长度

获取字符串长度

127.0.0.1:6380[4]> strlen key
(integer) 11

返回value的长度,不存在则返回0

同时设置/获得多个键值

127.0.0.1:6380[4]> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6380[4]> mget k1 k2 k3
1) "v1"
2) "v2"
3) "v3"

散列类型:

散列类型即hash,也是一种字典结构,存储了字段以及字段值的映射,但在Redis中,字段值只能是字符串,不能是其他类型,也就是说,散列类型不支持嵌套其他的数据类型

散列类型适合存储对象,用对象的类别和ID构成key名,用字段代表对象的属性,用字段的值存储具体的属性值

赋值与取值

HASH key field value

HGET key field

同时设置多个字段为

HMSET key field value [field value...]

HMGET key field [field...]

127.0.0.1:6380[4]> hset car price 233
(integer) 1
127.0.0.1:6380[4]> hset car name benz
(integer) 1
127.0.0.1:6380[4]> hget car name
"benz"
127.0.0.1:6380[4]> hmset car2 price 666 name 430
OK
127.0.0.1:6380[4]> hmget car2 price name
1) "666"
2) "430"

获取key中所有字段以及字段值

HGETALL key

127.0.0.1:6380[4]> hgetall car2
1) "price"
2) "666"
3) "name"
4) "430"

此外,HSET命令不区分插入与更新操作,当执行插入操作时,相当于当前字段不存在时,HSET命令返回1,当执行更新操作时,HSET命令返回0

判断字段是否存在

127.0.0.1:6380[4]> HEXISTS car2 data
(integer) 0
127.0.0.1:6380[4]> HSET car2 data 123
(integer) 1
127.0.0.1:6380[4]> HEXISTS car2 data
(integer) 1

如果存在,则返回1,否则返回0

增加数字

127.0.0.1:6380[4]> HINCRBY car2 data 233
(integer) 356

与字符串类型相似,但散列类型没有HINCR命令,可以通过HINCRBY key field 1来完成

删除字段

127.0.0.1:6380[4]> HDEL car2 data
(integer) 1

只获取字段名或者字段值

127.0.0.1:6380[4]> HKEYS car2
1) "price"
2) "name"
127.0.0.1:6380[4]> HVALS car2
1) "666"
2) "430"

获得字段数量

127.0.0.1:6380[4]> HLEN car2
(integer) 2

此时只有两个字段,price与name,因此返回2

列表类型:

列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的某一个分片

 

向列表两端添加元素

127.0.0.1:6380[4]> LPUSH num 1
(integer) 1
127.0.0.1:6380[4]> LPUSH num 2 3
(integer) 3
127.0.0.1:6380[4]> RPUSH num 3
(integer) 4

其中LPUSH是在列表的左端添加,RPUSH为在列表右端添加,比如说本来是一个空列表,现在我们在左端添加一个1,然后在左端添加2和3,此时列表内的元素为3 2 1,再往右端添加一个3,此时列表为3 2 1 3

从列表两端弹出元素

弹出即pop,与push操作相反

127.0.0.1:6380[4]> Lpop num
"3"
127.0.0.1:6380[4]> Rpop num
"3"
127.0.0.1:6380[4]> Rpop num
"1"

获取列表中元素的个数

127.0.0.1:6380[4]> LLEN num
(integer) 1

获得列表片段

与python中的分片类似,返回索引从第一个参数到第二个参数中的所有元素,但与python不同的是,会包含最右端的元素,而在Js跟python中,是不包含最右端的元素

127.0.0.1:6380[4]> LPUSH num 2 3 1 3 2
(integer) 6
127.0.0.1:6380[4]> LRANGE num 0 -1
1) "2"
2) "3"
3) "1"
4) "3"
5) "2"
6) "2"

其中-1表示右端第一个,0是列表的第一个索引

 

删除列表指定值

LREM key count value

其中第一个参数count表示前count个元素,如果是-1则为从右端数前一个,-2则为从右端数前两个,value指定要删的值

127.0.0.1:6380[4]> LREM num -1 2
(integer) 1
127.0.0.1:6380[4]> LRANGE num 0 -1
1) "2"
2) "3"
3) "1"
4) "3"
5) "2"

获得/设置指定索引的值

127.0.0.1:6380[4]> LINDEX num 0
"2"
127.0.0.1:6380[4]> LINDEX num 1
"3"
127.0.0.1:6380[4]> LSET num 0 5
OK
127.0.0.1:6380[4]> LINDEX num 0
"5"

只保留列表指定片段,删除其他所有元素

用法与LRANGE类似

127.0.0.1:6380[4]> LRANGE num 0 -1
1) "5"
2) "3"
3) "1"
4) "3"
5) "2"
127.0.0.1:6380[4]> LTRIM num 1 2
OK
127.0.0.1:6380[4]> LRANGE num 0 -1
1) "3"
2) "1"

向列表插入元素

after为向后插,before为向前插

127.0.0.1:6380[4]> LINSERT num after 3 2
(integer) 3
127.0.0.1:6380[4]> LRANGE num 0 -1
1) "3"
2) "2"
3) "1"
127.0.0.1:6380[4]> LINSERT num before 3 5
(integer) 4
127.0.0.1:6380[4]> LRANGE num 0 -1
1) "5"
2) "3"
3) "2"
4) "1"

将元素从一个列表移到另一个列表

实际上就是从需要移出的列表里RPOP一个值,然后LPUSH到移入的列表中

127.0.0.1:6380[4]> RPOPLPUSH num test
"1"
127.0.0.1:6380[4]> LRANGE test 0 -1
1) "1"

 

集合类型:

集合与列表类似,区别在于,集合中的元素是唯一的,而且列表是有序的,集合是无序的

 

增加/删除元素

返回成功加入的元素数量

127.0.0.1:6380[4]> sadd st a
(integer) 1
127.0.0.1:6380[4]> sadd st a b c d
(integer) 3
127.0.0.1:6380[4]> srem st a
(integer) 1

获得集合中所有元素

127.0.0.1:6380[4]> SMEMBERS st
1) "d"
2) "c"
3) "b"

判断元素是否在集合中

是则返回1,否则返回0

127.0.0.1:6380[4]> SISMEMBER st d
(integer) 1
127.0.0.1:6380[4]> SISMEMBER st x
(integer) 0

集合间运算之求差

127.0.0.1:6380[4]> sadd seta 1 2 3
(integer) 3
127.0.0.1:6380[4]> sadd setb 3 4 5
(integer) 3
127.0.0.1:6380[4]> sdiff seta setb
1) "1"
2) "2"
127.0.0.1:6380[4]> sdiff setb seta
1) "4"
2) "5"

集合间运算之求交集

127.0.0.1:6380[4]> SINTER seta setb
1) "3"

集合间运算之求并

127.0.0.1:6380[4]> SUNION seta setb
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"

获得集合中元素的个数

127.0.0.1:6380[4]> SCARD seta
(integer) 3

进行集合间运算并存入一个key中

SINTERSTORE与SDIFFSTORE同理

127.0.0.1:6380[4]> SUNIONSTORE setc seta setb
(integer) 5
127.0.0.1:6380[4]> SMEMBERS setc
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"

从集合中弹出一个元素

返回弹出的值,但由于集合是无序的因此随机从两端弹出一个

127.0.0.1:6380[4]> SPOP setc
"5"
127.0.0.1:6380[4]> SPOP setc
"1"
127.0.0.1:6380[4]> SPOP setc
"2"
127.0.0.1:6380[4]> SPOP setc
"4"

有序集合类型:

有序集合算是综合了列表的有序性跟集合的唯一性,是Redis中最高级的数据类型,有序集合在集合类型的基础上对每一个元素关联了一个分数,这使得在集合类型的基础上,可以根据分数获得排名前N个元素,和指定分数范围的元素

增加元素

ZADD key score member [socre membter...]

分数不仅可以是整数,也可以是浮点数

127.0.0.1:6380[4]> ZADD scoreb 87 By 23 ttt 99 Tim
(integer) 3
127.0.0.1:6380[4]> ZADD scoreb 55 cat
(integer) 1

获得元素的分数

127.0.0.1:6380[4]> ZSCORE scoreb Tim
"99"

获得排名在某个范围的元素列表

这里指的是排名不是分数,用法与LRANGE差不多

注意:此时是按照分数从小到大排

127.0.0.1:6380[4]> ZRANGE scoreb 0 -1
1) "ttt"
2) "cat"
3) "By"
4) "Tim"

可以通过withscores参数附带上分数信息

127.0.0.1:6380[4]> ZRANGE scoreb 0 -1 withscores
1) "ttt"
2) "23"
3) "cat"
4) "55"
5) "By"
6) "87"
7) "Tim"
8) "99"

获得指定分数范围的元素

127.0.0.1:6380[4]> ZRANGEBYSCORE scoreb 20 85
1) "ttt"
2) "cat"

增加某个元素的分数

127.0.0.1:6380[4]> ZINCRBY scoreb 424 ttt
"447"
127.0.0.1:6380[4]> ZRANGE scoreb 0 -1 withscores
1) "cat"
2) "55"
3) "By"
4) "87"
5) "Tim"
6) "99"
7) "ttt"
8) "447"

获得集合中元素数量

127.0.0.1:6380[4]> ZCARD scoreb
(integer) 4

获得指定分数范围内的元素个数

127.0.0.1:6380[4]> ZCOUNT scoreb 20 100
(integer) 3

删除一个或多个元素

127.0.0.1:6380[4]> ZREM scoreb By cat
(integer) 2

按照排名范围删除元素

127.0.0.1:6380[4]> Zadd zst 88 by 82 bz 12 bx
(integer) 3
127.0.0.1:6380[4]> ZRANGE zst 0 -1
1) "bx"
2) "bz"
3) "by"
127.0.0.1:6380[4]> ZREMRANGEBYRANK zst 0 1
(integer) 2
127.0.0.1:6380[4]> ZRANGE zst 0 -1
1) "by"

按照分数范围删除元素

127.0.0.1:6380[4]> zadd stc 1 a 2 b 3 c 4 d 50 z
(integer) 5
127.0.0.1:6380[4]> ZRANGE stc 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "z"
127.0.0.1:6380[4]> ZREMRANGEBYSCORE stc 0 10
(integer) 4
127.0.0.1:6380[4]> ZRANGE stc 0 -1
1) "z"

获得元素排名

ZRANK为从小到大排序的排名,ZREVRANK则相反

127.0.0.1:6380[4]> zadd stq 1 a 2 b 3 c 4 d 50 z
(integer) 5
127.0.0.1:6380[4]> zrank stq a
(integer) 0
127.0.0.1:6380[4]> ZREVRank stq a
(integer) 4

计算有序集合的交集

ZINTERSTORE destination numkeys key[key...] [WEIGHTS weight[weight...]] [AGGREGATE SUM|MIN|MAX]

destination是存储结果,AGGREGATE默认为sum,意思是destination每个元素的分数是参与计算的两个集合中相对应的元素的和,

如果AGGREGATE显示指定为min时,则为相对应的元素的分数的最小值,max则为最大值

127.0.0.1:6380[3]> zadd st1 1 a 2 b
(integer) 2
127.0.0.1:6380[3]> zadd st2 10 a 20 b
(integer) 2
127.0.0.1:6380[3]> ZINTERSTORE res 2 st1 st2
(integer) 2
127.0.0.1:6380[3]> zrange res 0 -1 withscores
1) "a"
2) "11"
3) "b"
4) "22"