详谈redis数据结构
redis五种数据结构类型分别是STRING(字符串)、LIST(列表)、SET(集合)、HASH(散列)和ZEST(有序集合)
下面将逐一讲解这五种数据结构类型的用途和操作方法,读者可通读全文,跟着小新一起操作这五种数据类型的相关命令。
1、STRING(字符串)
存储方式:redis中的字符串按照key-value的形式存储
存储的值:可以是字符串、整数、浮点数
(可对整数浮点数执行自增、自减)
以下为STRING操作代码示例
1.1、STRING存储
set myName Kelvin
# 作用:存储key为myName,value为Kelvin的字符串
# 返回:OK,表示存储成功
1.2、取值
get myName
# 作用:取出key为myName的value
# 返回:(成功,有这个键对应的值)
“Kelvin”(上文已存储)
(不成功,没有这个键所对应的值)
Connection error: Command execution timeout
1.3、删除
del myName
# 作用:删除key为myName的字符串
# 返回:“1”表示已经删除成功
“0”表示未删除成功,因为redis并未存储该信息
1.4、自增
incr age
#作用:对age进行自增
#返回:"1",首次创建为1
incr age
#返回:"2",自增为2
incr age
#返回: "3",自增为3
1.5、自减
decr age
#作用:对age进行自减操作
#返回:"2",自减为2
decr age
#返回:"1",自减为1
decr age
#返回:"0",自减为0
2、LIST(列表)
LIST结构是有序的,这里的顺序是左右方向上的,人为干预或插入时间不同导致的先后顺序,而不是根据值的大小进行自动排序。在这里的顺序要和第5节讲的ZSET的有序进行区分。
List的有序:食堂打饭排队,按照时间早晚,矮子先来可以站前面,矮子后来也可以站后面,不依据某特征进行自动调整。当然在你输入数据的时候可以人为规定将某个数据插到某个位置,毕竟有的关系户小矮子也是可以插队的嘛,但这并非是队伍的自动排序机制。
ZSET的有序:早操排队,不管是矮子先来还是矮子后来,只要他长得矮,他就可以自动排到前面,这在ZSET里面称为自动排序。
2.1、LPUSH(左推)
lpush list-key dwarf1
# 作用:将dwarf1这个矮子插到list-key这个队伍的左边
# 返回:1,表示当前列表长度为1
# 补充:如果在执行push操作时redis中没有list-key这个列表,
那么会自动创建再进行push操作
2.2 、RPUSH(右推)
rpush list-key dwarf2
# 作用:将dwarf2这个矮子插到list-key的右边
# 返回:2,表示当前列表长度为2
2.3、LRANGE(获取给定范围内的元素)
lrange list-key 0 -1
返回:drawf1、drawf2
补充1:这里的lrange的全称为list range,而不是left range,
所以redis不存在rrange,通过动手可以发现rrange是个错误的指令
补充2:使用0为范围的起始索引,-1为范围的结束索引可以取出列表的所有元素
为了验证我们刚刚所说的list的有序是先后的有序而不是内部的自动排序,接下来我们将进行多次的lpush和rpush进行验证
rpush list-numberkey 100
#每push一次都可以用LRANGE命令查看当前列表
# 此时列表从左往右-->100
rpush list-numberkey 1
# 此时列表从左往右-->100,1
lpush list-numberkey 99
# 此时列表从左往右-->99,100,1
lpush list-numberkey 999
# 此时列表从左往右-->999,99,100,1
lpush list-numberkey 999
# 此时列表从左往右-->999,999,99,100,1
#记住此刻出现了两个999,在第三节将会讲到。
取出给定范围内的元素
lrange list-numberkey 0 2
#作用:取出list-unmberkey列表中索引0到索引2范围内的所有元素,包含索引2
# 返回 999,999,99
2.4、LINDEX(获取列表上给定位置的元素)
索引从0开始,从左往右依次递加,此处的LINDEX的全称是list index,而不是leftindex,所以在使用RINDEX试图从右往左取出元素时,会发现这是一个错误的指令。
lindex list-numberkey 0
# 作用:取出list-numberkey列表中索引为0的元素
# 返回: 999
2.5、LPOP(左弹)
lpop list-numberkey
# 作用:弹出list-numberkey列表中最左边的元素,
弹出的元素将不再存在于列表中
# 返回:999
2.6、RPOP(右弹)
rpop list-numberkey
#作用:弹出list-numberkey列表中最右边的元素,
弹出的元素不再存在于列表中
#返回:1
LINDEX与POP的区别:
LINDEX是查看此索引位置的元素,但不删除
POP是删除该元素,返回给用户查看
3、SET(集合)
集合也可以像列表一样,存储许多字符串,但是与列表不同的是,列表像一列排队打饭的队伍,有头有尾,就算有两个叫小新的男孩,尚且可以以排第一的那个小新和排第二的那个小新来区分。集合更像是村头一群谈论八卦的乡亲们,没有先后之分,唯一可以区别他们的就是喊他们的名字,因此在集合里面不允许有同样名字出现,即:
列表可以有重复的元素,比如list-numberkey里面有两个999
集合不允许有重复元素,
3.1、SADD(添加)
SADD全称:set add
因为集合是无序的,所以不像队伍那样有左右之分,加入乡亲们的八卦队伍就只有一种加入方式,没有左加入和右加入之分
sadd set-key Kelvin1
# 作用:将Kelvin1加入到set-key集合中去
# 返回:“1”表示加入成功
“0”表示加入失败,因为集合中已有此元素
# 补充:在执行sadd命令时,如果redis中没有set-key集合
则自动创建set-key
3.2、SISMEMBER(检查)
SISMEMBER全称:set is member
sismember set-key Kelvin1
# 作用:检查Kelvin1是否存在于set-key中
# 返回:“1”,表示该元素存在于set-key集合中
“0”,表示该元素不存在于set-key集合中
3.3、SMEMBERS(遍历)
SMEMBER全称:set members
在执行此命令之前,我们先向集合中多添加几个元素
sadd set-key Kelvin2
sadd set-key Kelvin3
sadd set-key Kelvin2
# 返回:“0”,因为Kelvin2已经存在于集合中了
好的,现在来遍历一下集合中的元素
smembers set-key
#返回:"kelvin1","kelvin3","kelvin2" (无序)
3.4、SREM(移除)
SREM全称:set remove
添加没有左右之分,删除也没有左右之分。
srem set-key Kelvin1
#作用:移除Kelvin1元素
#返回:1,表示被移除元素的数量
4、HASH(散列)
第一节的字符串是一对一的键值对关系,而散列就像是一个容器将许多个一对一的键值对装起来。
4.1、HSET(关联键值对)
HSET全称:HASH SET
hset hash-key myName Kelvin
# 作用:在散列hash-key中关联起myName-Kelvin键值对
# 返回:1 表示已添加成功
0 添加失败,散列中已存在这种键值对
# 补充:当执行hset命令时,如果redis中还不存在hash-key这个散列,
则会自动创建
4.2、HGET(获取某个键的值)
HGET全称:hash get
hget hash-key myName
作用:在hash-key这个散列中取到myName这个键所对应的值
返回:Kelvin
4.3、HGETALL
HGETALL全称:hash get all
为了演示这个命令,我们往hash-key这个散列中多添加几个键值对
hset hash-key mySex 男
hset hash-key myHomeTown 武穴
hset hash-key mySchool 北京大学
接下来我们将使用HGETALL获取到所有键值对信息
hgetall hash-key
# 作用:获取所有键值对信息
# 返回:(1)"myName"
(2)"Kelvin"
(3) "mySex"
(4) "男"
(5)"myHomeTown"
(6)"武穴"
(7)"mySchool"
(8)"北京大学"
4.4、 HDEL(删除)
HDEL全称hash delete
hdel hash-key myHomeTown
#作用:在hash-key这个散列中删除myHomeTown这个键多对应的键值对
#返回:“1” 表示删除成功
“0” 表示删除失败,散列中没有这个键值对
5、ZSET(有序集合)
有序集合(ZSET)是像集合(SET)一样可以装很多东西,只不过集合装的是字符串而有序集合装的是键值对,从更严谨的角度讲,有序集合和散列更接近。只不过有序集合是有序的,关于有序,在第2节列表中已经解释过。
有序集合的键被称为成员(member)每个成员各不相同
有序集合的值被称为分值(score),分值必须是浮点数
5.1、ZADD
ZADD全称:zset add
因为有序集合是自排序的,所以也不像列表一样有左插入或右插入
zadd zset-weight 60 Kelvin
#作用:往zset-weight这个有序集合中添加Kelvin-60这个键值对
#返回:“1” 存入成功
“0” 存入失败,zset-weight已经存在该键值对
#注意:有序集合的不一样的地方就在于,将分值写在前面,因为有序集合是要根据分值来进行排序的,默认从小到大
为了后续演示,我们多添加几行数据
zadd zset-weight 40 Lina
zadd zset-weight 50 Oscar
zadd zset-weight 70 Mike
5.2、ZRANGE(获取)
ZRANGE全称:zset range
zrange zset-weight 0 -1 withscores
#作用:取出zset-weight中索引值在[0,-1]的键值对,即全部键值对
#返回:(1)"Lina"
(2)"40"
(3)"Oscar"
(4)"50"
(5)"Kelvin"
(6)"60"
(7)"Mike"
(8)"70"
5.3、ZRANGEBYSCORE (根据分值范围来获取)
zrangebyscore zset-weight 0 60 withscores
# 作用:取出分值在[0,60]之间的键值对
# 返回: (1)"Lina"
(2)"40"
(3)"Oscar"
(4)"50"
(5)"Kelvin"
(6)"60"
5.4、ZREM(移除)
ZREM全称:zset remove
zrem zset-weight Mike
# 作用:移除zset-weight中键为Mike的元素
# 返回:"1" 表示移除元素数量为1