vlambda博客
学习文章列表

详谈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
# 此时列表从左往右-->1001
lpush list-numberkey 99
# 此时列表从左往右-->991001
lpush list-numberkey 999
# 此时列表从左往右-->999,99,1001
lpush list-numberkey 999
# 此时列表从左往右-->999,999,99,1001
#记住此刻出现了两个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(散列)

第一节的字符串是一对一的键值对关系,而散列就像是一个容器将许多个一对一的键值对装起来。

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

总结

Java高级开发技术