一.前言
本文主要介绍Redis中包含几种主要数据类型:字符串类型、哈希类型、列表类型、集合类型和有序集合类型。
二.字符串类型
字符串类型是Redis中最基本的数据类型,它是其他4种数据类型的基础,其他数据类型与字符串类型的差别从某种角度来说只是组织字符串的形式不同。
赋值和取值
SET key value
命令用来设置键值对,GET value
用来根据键取值,当键不存在时返回nil
。
> SET JAPAN Tokyo
"OK"
> GET JAPAN
"Tokyo"
> GET RUSSIA
(nil)
Redis对键的命令最好采用
对象类型:对象ID:对象属性
的形式,例如student:1:scores
表示存储ID为1的学生的成绩列表。
递增/减数字
当存储的字符串是整数形式时,使用INCR
命令可以使当前键值递增并返回递增后的值。
> SET money 5
"OK"
> INCR money
(integer) 6
> DECR money
(integer) 5
除了使用INCR
,还可以使用INCRBY key increment
来指定单次递增的数值,使用DECRBY key decrement
来指定单次减去的数值。
> DECRBY money 15
(integer) -10
> INCRBY money 20
(integer) 10
通过INCRBYFLOAT key increment
可以递增一个双精度浮点数。
> INCRBYFLOAT money 3.14
"13.14"
向末尾追加
通过APPEND key value
可以向键值的末尾追加value
,若键不存在,则可以将该键的值设置为value
,该命令的返回值是追加后字符串的总长度。
> APPEND program Java
(integer) 4
> APPEND program " Python"
(integer) 11
第二次追加添加双引号是因为该参数包含空格,在redis-cli种需要用双引号以示区分。
获取字符串长度
通过STRLEN key
可以获取键值的长度,若键不存在会返回0。
> GET program
"Java Python"
> STRLEN program
(integer) 11
同时设置/获取多个键值
通过MSET key val [key1 val1 ...]
可以同时设置多个键值,通过MGET key [key1 ...]
可以同时获取多个键对应的值。
> MSET python 1 cpp 2 java 3
"OK"
> MGET python cpp java
1) "1"
2) "2"
3) "3"
三.哈希类型
哈希类型的键值与Reids一样都采用了字典结构,其存储了字段(field)和字段值的映射,其中字段值只能是字符串。
哈希类型适合存储对象,使用对象类别和ID构成键名,使用字段表示对象的属性,字段值存储属性的值。若要存储ID为1的学生三门功课math、chinese和english的成绩,存储结构可以表示为:
student:1 #键
--math 90 # 字段 字段值
--chinese 87
--english 78
赋值与取值
哈希类型的赋值与取值语法形式为:
HSET key field value
HGET key field
HMSET key field value [field value ...]
HMGET key field [field ...]
HGETALL key # 获取键所有的字段和字段值
HSET
不区分插入和更新操作,这使得在更新数据时不需要事先判断字段是否存在。
具体用法:
> HSET student:1 math 90
(integer) 1
> HGET student:1 math
"90"> HMSET student:1 chinese 87 english 78
"OK"
> HMGET student:1 chinese english
1) "87"
2) "78"> HGETALL student:1
1) "math"
2) "90"
3) "chinese"
4) "87"
5) "english"
6) "78"
判断字段是否存在
通过HEXISTS key field
可以判断字段是否存在,存在返回1,否则返回0。
> HEXISTS student:1 math
(integer) 1
> HEXISTS student:1 physics
(integer) 0
字段不存在时赋值
使用HSETNX key field value
可以在字段field
不存在时赋值,存在则不进行任何操作。
> HSETNX student:1 physics 88
(integer) 1
> HGET student:1 physics
"88"
删除字段
使用HDEL key field [field1 ...]
可以删除一个或多个字段,并返回删除字段的个数。
> HDEL student:1 physics english
(integer) 2
获取字段名/字段值/长度
通过HKEYS key
可以获取键中所有的字段名,通过HVALS key
可以获取键中所有的字段值,通过HLEN key
可以获取键所包含的字段数量。
> HKEYS student:1
1) "math"
2) "chinese"> HVALs student:1
1) "90"
2) "87"> HLEN student:1
(integer) 2
四.列表类型
列表类型可以存储一个有序的字符串列表,列表基于双向链表实现,可以向列表两端快速添加元素,但其索引速度比较慢,要获取列表中间某个位置的元素则必须要从头开始遍历到该位置。
向列表两端增加元素
通过LPUSH key value [value1 ...]
和RPUSH key value [value1 ...]
可以分别往列表左边和右边添加元素,命令的返回值是列表的长度。
> LPUSH arr 3 2 1
(integer) 3
> RPUSH arr 4 5 6
(integer) 6
# arr
# 1 2 3 4 5 6
从列表两端弹出元素
通过LPOP
和RPOP
可以分别从列表左端和右端弹出一个元素,返回值是弹出的元素。
> LPOP arr
"1"
> RPOP arr
"6"
获取列表中元素的个数
通过LLEN key
可以获取列表中元素的个数,当键不存在时LLEN
会返回0。
> LLEN arr
(integer) 4
获取列表片段
通过LRANGE key start stop
可以获取列表索引从start
到stop
之间的所有元素,索引从0开始。
> LRANGE arr 0 3
1) "2"
2) "3"
3) "4"
4) "5"
同Python一样,LRNAGE
支持负索引,其中-1
表示从右边开始第一个元素,-2
表示从右边开始第二个元素,以此类推。
> LRANGE arr -3 -1
1) "3"
2) "4"
3) "5"
若
start
大于stop
会返回空列表,若stop
超出列表索引大小,会返回到列表最右边的元素。
删除列表中指定的值
利用LREM
可以删除列表中前count
个值为value
的元素,返回值为实际删除的元素个数:
- 当
count > 0
时,LREM
会删除从列表左边开始前count
个值为value
的元素。 - 当
count < 0
时,LREM
会删除从列表右边开始前count
个值为value
的元素。 - 当
count = 0
时,LREM
会删除列表中所有值为value
的元素。
> LPUSH arr1 6 3 4 3 2 3 3
(integer) 7> LRANGE arr1 0 -1
1) "3"
2) "3"
3) "2"
4) "3"
5) "4"
6) "3"
7) "6"> LREM arr1 1 3
(integer) 1
# 3 2 3 4 3 6> LREM arr1 -1 3
(integer) 1
# 3 2 3 4 6> LREM arr1 0 3
(integer) 2
# 2 4 6
获取/设置指定索引的元素值
通过LINDEX key index
可以获取指定索引的元素,通过LSET key index value
可以修改指定索引位置的元素的值。
# arr: 2 3 4 5
> LINDEX arr 2
"4"> LSET arr 2 5
"OK"
> LINDEX arr 2
"5"
五.集合类型
Redis中的集合是基于哈希表实现的,集合中的元素都各不相同,往集合中增加删除、增加和查询都是常数时间复杂度。此外,集合还支持并、交和差运算。
增加/删除元素
通过SADD key member [member1 ...]
可以往集合中添加一个或多个元素,通过SREM key member [member1 ...]
可以删除一个或多个元素。
> SADD fruits app
(integer) 1
> SADD fruits banana peach
(integer) 2 # 返回值为成功添加的元素个数> SREM fruits app
(integer) 1 # 返回值为删除成功的元素个数
获取集合中的所有元素
通过SMEMBERS key
可以获取集合中的所有元素。
> SMEMBERS fruits
1) "banana"
2) "peach"
判断元素是否在集合中
通过SISMEMBER key member
可以判断元素member
是否在集合中。
> SISMEMBER fruits app
(integer) 0
> SISMEMBER fruits banana
(integer) 1
集合间的元素
集合支持交、并和差运算。
# 交
SINTER key [key ...]
# 并
SUNION key [key ...]
# 差
SDIFF key [key ...]
给定集合A和B,交、并和差三种运算从左到右的示意图如下所示:
使用示例如下:
> SADD sa 1 3 4 5 7
(integer) 5
> SADD sb 2 4 6 8
(integer) 4> SINTER sa sb
1) "4"> SUNION sa sb
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"> SDIFF sa sb
1) "1"
2) "3"
3) "5"
4) "7"
六.结语
参考资料:
- 《Redis入门指南》 李子骅编著
以上便是文本的全部内容,若有任何错误敬请批评指正,要是觉得不错可以点赞或关注一下,后续会持续更新。