七天玩转Redis | Day2Redis五大数据类型使用详解

Posted 灰小猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了七天玩转Redis | Day2Redis五大数据类型使用详解相关的知识,希望对你有一定的参考价值。

号外号外🎉🎉🎉:小猿和CSDN联合推出的“七天玩转Redis,打卡还能领周边”活动开始啦!点击查看👉🏻报名及活动细则👈🏻,轻轻松松和小伙伴们一起拿奖励吧!

PS:零基础也能入门Redis哟,快去一起参与拿周边吧!

博主简介👨🏼‍⚕️:国内某一线互联网公司Java工程师👨🏼‍💻,业余自媒体创作者💻,CSDN博客专家🏆,Java领域优质创作者📕,华为云享专家🥇,华为HDZ核心成员👨‍💼,曾发表并出版ISEAE信息科学国际论文,全网累计发表技术博客60余万📒,公众号【码猿编程日记】作者,坚信每一次敲动键盘都能让生活变得更智能,世界变得更有趣!

课前答疑:很多小伙伴问我零基础或者根本没有使用过Redis,可以学习嘛?当然是可以的!充分考虑到小伙伴们的学习程度有所不同,所以本次课程的所有操作都是在Windows环境下进行的,不会依赖太多的环境配置,且上手容易。已经学习过Redis的小伙伴们同样可以再学习一遍,温故而知新还能拿CSDN定制周边!何乐而不为呢😀

今日学习内容

在第一天的课程中,我们已经知道了Redis的基本命令的使用,今天我们将来重点讲解一下Redis中的几大数据类型,

先问大家一个问题?你知道Java的数据类型有哪些吗?很多小伙伴肯定会直接想到int、byte、string等等~~~但是如果这样回答就错啦!

Java中的数据类型包括:基本数据类型和引用数据类型,其中基本数据类型包括:byte、short、int、long、double、float、char、boolean八种,而引用数据类型则是另外三种,分别是类、接口和数组!注意是没有string类型的,这可是面试的一个坑哈!

而在Redis中也是有数据类型的,和Java中有所不同,在Redis中有五大数据类型,分别是String、List、Set、Hash和Zset。而这五种数据类型中的每一个,都对应着很多不同的使用场景。接下来我们就来学习一下在Redis中如何使用这五大数据类型!

(1)String类型

String类型是在Redis中最常用的数据类型,它也是很多程序员在日常开发中最常使用甚至只会用的数据类型,这也就导致很多人在使用Redis的时候,就只知道使用string类型,而忽视了其他数据类型的重要性。所以我也希望大家在学习完这篇文章之后,对Redis中的数据类型有一个新的认识,不要只使用String类型进行Redis的操作啦!

注意:在Redis的客户端中进行操作之前,一定要保证Redis的服务器界面处于开启状态,否则会出现客户端拒绝访问或打不开的情况哈!

设置指定key的值

Redis中给string类型的数据设置指定key的方法就是最基本的设置key-value的方法,

语法如下:

SET key value

  • key为索引
  • value为对应的值

例如我们要设置索引为k3,值为v3的键值对数据

127.0.0.1:6379> SET k3 v3
OK

返回值为ok,则说明设置成功!

获取指定key的值

如果我们已经在Redis中设置了数据,那么我们可以通过该数据的key来获取它,语法格式如下:

GET key

  • key为要获取的值对应的索引

例如我们获取刚才输入的索引为k3,值为v3的数据,如果该索引存在,那么将会返回对应的值,如果不存在就会返回(nil)也就是null的意思。

127.0.0.1:6379> GET k3
"v3"
127.0.0.1:6379> GET k4
(nil)

返回key中字符串值的子串

这个命令的作用是获取Redis中已经存在的字符串的子串,同时我们可以指定一个下标索引,指定要获取哪一段字符。命令的格式如下:

GETRANGE key start end

  • key为字符串的索引
  • start为截取的起始下标
  • end为截取的终止下标

比如我们截取索引为“mykey”,值为“huixiaoyuan”的数据的子串,

127.0.0.1:6379> GETRANGE mykey 2 5
"ixia"
127.0.0.1:6379> GETRANGE mykey 2 -1
"ixiaoyuan"
127.0.0.1:6379> GETRANGE mykey 1 100
"uixiaoyuan"

讲解一下上面的代码,因为字符串的起始下标是0,所以第2个对应的字符是“i”,如果想要截取字符串从某一个字符到最后部分的子串,那么可以直接将最后一个参数设置为-1.

如果你设置的获取子串的范围比较大,已经超出了字符串原本的长度,那么只会返回到字符串的最后一个字符!

获取多个给定key的值

与GET命令不同,GET命令只能获取一个key对应的值,而这个命令可以用于获取多个key对应的值,格式如下:

MGET key1 [key2...]

  • 在MGET的后面可以追加多个索引,以空格分开

如我们来获取一下mykey、mykey1、mykey2分别对应的值,

127.0.0.1:6379> MGET mykey mykey1 mykey2
1) "huixiaoyuan"
2) "value1"
3) "value2"

返回key所对应的字符串的长度

这个命令的作用是获取到当前索引对应的字符串的长度,格式如下:

STRLEN key

  • key为字符串对应的索引
127.0.0.1:6379> STRLEN mykey
(integer) 11

设置一个或多个键值对

我们知道SET命令的作用是设置一个键值对,但是如果有多个键值对同时设置呢?这个时候就可以使用这个命令了,格式如下:

MSET key1 value1 [key2 value2 ...]

  • key1 value1为要设置的第一个键值对,之后的以空格分隔

如下我们设置同时设置三个键值对

127.0.0.1:6379> MSET k1 v1 k2 v2 k3 v3
OK

和上面这个命令相对的还有一个,该命令仅能在key不存在的情况下才能设置,否则所有的key-value都将会赋值失败,格式如下:

MSETNX key1 value1 [key2 value2 ...]

  • key1 value1为要设置的第一个键值对,之后的以空格分隔

如我们给已经存在的k4设置值,那么返回0,说明设置失败,如果设置成功,则会返回1

127.0.0.1:6379> MSETNX k1 v1 k4 v4
(integer) 0
127.0.0.1:6379> MSETNX k4 v4 k5 v5
(integer) 1

将key中所存储的数值加一

这个命令可以将我们存储的字符的值加1,之后返回相加后的结果,但是如果该key对应的字符不是一个数的话,就会返回一个错误信息,格式如下:

INCR key

  • key为要加1的数对应的索引

如下我们给刚才设置的k8加1,那么就会报错,重新设置一个数值的键值对,再进行加1,就可以返回对应的数据

127.0.0.1:6379> INCR k8
(error) ERR value is not an integer or out of range
127.0.0.1:6379> SET num1 10
OK
127.0.0.1:6379> INCR num1
(integer) 11

与INCR 命令对应的还有一个INCRBY 该命令可以给指定的key对应的数据加上指定的增量,格式如下:

INCRBY key increment

  • key为索引
  • increment为要增加的值
127.0.0.1:6379> INCRBY num1 5
(integer) 16

将key中所存储的数值减一

既然存在增加的操作,那么对应着也就是存在减少的操作,格式如下:

DECR key

  • key为要加1的数对应的索引

上一步我们将num1对应的数值加5后得到16,现在我们对其进行减一操作。

127.0.0.1:6379> DECR num1
(integer) 15

与这个命令对应的还有减指定的数据的命令,格式如下:

DECRBY key increment

  • key为索引
  • decrement为要增加的值
127.0.0.1:6379> DECRBY num1 2
(integer) 13

字符串追加

如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾。返回的是追加后的长度,格式如下:

APPEND key value

  • key为索引
  • value为要追加的字符串

如我们在mykey1-value1的后面追加“hello”

127.0.0.1:6379> APPEND mykey1 hello
(integer) 11
127.0.0.1:6379> GET mykey1
"value1hello"

(1)Hash类型

Hash类型是一个String类型的field(字段)和value(值)的映射表,它的作用是可以用来存储我们定义的数据对象,所以简单来说它是一个key下面存储了多个key-value的情况,给大家简单的话一个Hash的结构图:

想要了解Hash的小伙伴可以去看我之前的一篇关于图解HashMap底层实现的文章,图解HashMap底层实现HashMap高频面试题1,Map接口和List接口是什么关系?2、Map有哪些常用的实现类?3、请阐述HashMap的put过程?4、链表中是按照怎样的顺序存放数据的?5、Hash(key)方法是如何实现的?6、为什么HashMap的容量一直是2的倍数?7、Hash冲突如何解决?8、HashMap是如何扩容的?9、扩容后元素怎么存放的?10、JDK1.7和JDK1.8对HashMap的实现比较Hello,你好呀,我是灰小猿!一个超会写bug的程序猿!Map接https://huixiaoyuan.blog.csdn.net/article/details/117629081接下来我们来简单讲一下在Redis中对于Hash这种数据类型,常用的几个命令,

设置一个Hash数据

设置Hash数据所使用的命令不是SET,而是HMSET,你可以理解为H代表Hash的意思,M代表Map的意思,该命令的格式如下:

HMSET key fieId1 value1 [fieId2 value2...]

  • key为这个Hash数据对应的唯一性索引
  • field为下面存储的一个键值对的键
  • value为该键对应的值

如我们设置key为“myhash”,里面存储的field分别为name-huixiaoyuan、sex-nan、age-3的三个键值对

127.0.0.1:6379> HMSET myhash name huixiaoyuan sex nan age 3
OK

获取指定哈希表中所有的字段和值

查看指定哈希表中所有的字段和值的命令是HGETALL,作用是取出该hash中所有的数据,格式如下

HGETALL key

  • 其中key为对应着这个Hash数据的索引

如我们查看刚才设置的hash数据

127.0.0.1:6379> HGETALL myhash
1) "name"
2) "huixiaoyuan"
3) "sex"
4) "nan"
5) "age"
6) "3"

获取存储在哈希表中指定字段的值

上一个命令是获取所有的字段,那么现在这个命令是只获取指定哈希表中指定字段的值,命令的格式如下:

HGET key field

  • key哈希表的索引
  • field获取的值对应的字段

如我们获取上面的哈希表中字段为name对应的值

127.0.0.1:6379> HGET myhash name
"huixiaoyuan"

删除一个或多个哈希表字段

删除一个或多个哈希表字段的命令是HDEL,该命令可以删除指定哈希表中指定的字段,以及其对应的值,格式如下:

HDEL key field1 [field2...]

  • key为指定的哈希表的索引
  • field为要删除的值对应的字段,如果要删除多个就以空格分开

如我们要删除索引为“myhash”的哈希表中值为“3”,对应字段为“age”的字段和值为“nan”,对应字段为“sex”的两个字段。

127.0.0.1:6379> HGET myhash name
"huixiaoyuan"
127.0.0.1:6379> HDEL myhash age sex
(integer) 2
127.0.0.1:6379> HGETALL myhash
1) "name"
2) "huixiaoyuan"

获取哈希表中字段的数量

该命令可以获取指定哈希表中字段的数量,格式如下:

HLEN key

  • key为指定的哈希表的索引
127.0.0.1:6379> HLEN myhash
(integer) 1

获取哈希表中的所有字段

该命令可以获取指定哈希表中所有的字段,但是不返回字段对应的值,格式如下:

HKEYS key

  • key为指定的哈希表的索引
127.0.0.1:6379> HKEYS myhash
1) "name"

获取哈希表中所有的值

上一个命令是获取到指定哈希表中所有的字段,但是不返回字段对应的值,那么这个命令就是获取到所有的值,而不返回其对应的字段,格式如下:

HVALS key

  • key为指定的哈希表的索引
127.0.0.1:6379> HVALS myhash
1) "huixiaoyuan"

(3)List类型

列表类型我相信大家应该都听说过,在Redis中的列表存储的是一个一个的字符串,按照插入的顺序进行排序,在Redis中可以指定是在列表的头部或者尾部插入。所以你也可以把它看作是一个LinkedList结构,

将一个或多个元素插入列表表头

在平常我们通过Java操作列表的时候,是通过put的方式一个一个的往里面插入数据,在Redis中也是类似的,在Redis中向列表中插入数据的命令是LPUSH,返回值是插入的数据的个数,命令中的L表示left,意思是在表头插入,格式如下:

LPUSH key value1 [value2...]

  • key为该列表的索引
  • value为要插入的数据,如果要插入多条数据,中间以空格分开

如我们要在mylist中插入数值“test1”、“test2”、“test3”,那么操作如下:

127.0.0.1:6379> LPUSH mylist test1 test2 test3
(integer) 3

 将一个或多个元素插入列表尾部

在Redis中向列表尾部插入数据的命令是RPUSH,命令中的R表示right,意思是在列表尾部插入,返回值是插入的数据的个数,格式如下:

RPUSH key value1 [value2...]

  • key为该列表的索引
  • value为要插入的数据,如果要插入多条数据,中间以空格分开

如我们要在mylist的尾部中插入数值“test4”、“test5”、“test6”,那么操作如下:

127.0.0.1:6379> RPUSH mylist test4 test5 test6
(integer) 3

注意:经过上面两轮的插入,现在mylist列表中的元素排列为:[test3,test2,test1,test4,test5,test6]

获取列表长度

如果我们想要查看指定列表中有多少个元素,获取列表的长度,那么可以使用LLEN命令,格式如下:

LLEN key

  • key为要查询长度的列表的索引

如我们查询刚才插入的mylist的长度

127.0.0.1:6379> LLEN mylist
(integer) 6

通过索引获取列表中的元素

如果我们想要返回列表中指定下标的元素,那么可以使用LINDEX命令,格式如下:

LINDEX key index

  • key为要查询长度的列表的索引
  • index为指定的下标

如我们要获取mylist中下标为2的元素和下标为0的元素

127.0.0.1:6379> LINDEX mylist 2
"test1"
127.0.0.1:6379> LINDEX mylist 0
"test3"

移除并获取列表第一个元素

LPOP命令可以移除列表中的第一个元素,并且返回该元素的值,格式如下:

LPOP key

  • key为要返回第一个元素的列表的索引

如我们返回mylist的第一个元素

127.0.0.1:6379> LPOP mylist
"test3"

移除并获取列表最后一个元素

RPOP命令可以移除列表中的最后一个元素,并且返回该元素的值,格式如下:

RPOP key

  • key为要移除并返回最后一个元素的列表的索引

如我们要移除返回mylist的最后一个元素

127.0.0.1:6379> RPOP mylist
"test6"

(4)Set集合

Redis中的Set集合和Java中的Set集合所表示的含义一样,都是无序集合,且集合中的元素是唯一的,不可重复的,

向集合中添加一个或多个成员

向集合中添加元素的命令是SADD,返回值是插入的成员的个数,格式如下:

SADD key member1 [member2...]

  • key表示Set集合的索引
  • member1表示要插入的成员,如果有多个成员,那么中间以空格分隔

如我们在索引为myset的集合中插入成员“stest1”、“stest2”、“stest3”

127.0.0.1:6379> SADD myset stest1 stest2 stest3
(integer) 3

获取集合中成员的个数

获取集合中成员个数的命令是SCARD,格式如下:

SCARD key

  • key为要查询的集合的索引

如我们查询myset中成员的个数:

127.0.0.1:6379> SCARD myset
(integer) 3

返回第一个集合与其他集合之间的差异

SDIFF命令的作用是返回第一个集合相对于其他集合的差异,格式如下:

SDIFF key1 [key2..]

  • key1表示对比的集合
  • key2表示被对比的集合,被对比的可以有多个,以空格分开,

如我们现在新建一个集合myset2,并在其中插入一些数据“stest3”、“aaa”、“bbb”,相对于myset2而言,myset1多出了“stest1”和“stest2”。

127.0.0.1:6379> SADD myset2 stest3 aaa bbb
(integer) 3
127.0.0.1:6379> SDIFF myset myset2
1) "stest1"
2) "stest2"

返回所给定所有集合的交集

SINTER命令可以返回所给定的两个或多个集合的交集,格式如下:

SINTER key1 [key2...]

  • key1表示第一个集合
  • key2表示要对比的集合,可以存在多个,中间以空格分开

如我们新建一个集合myset3,其中的成员为“stest1”、“stest2”、“ccc”,找则myset、myset2、myset3直接的交集为null,而myset和myset2之间的交集是“stest3”

127.0.0.1:6379> SADD myset3 stest1 stest2 ccc
(integer) 3
127.0.0.1:6379> SINTER myset myset2 myset3
(empty list or set)
127.0.0.1:6379> SINTER myset myset2
1) "stest3"
127.0.0.1:6379>

返回集合中的所有元素

如果想要返回集合中的所有成员,则可以使用SMEMBERS,格式如下:

SMEMBERS key

  • key为要返回所有成员的集合的索引

如我们返回myset2中的所有元素:

127.0.0.1:6379> SMEMBERS myset2
1) "aaa"
2) "bbb"
3) "stest3"

(5)ZSet类似

ZSet集合与Set集合类似,也是不允许成员重复的,但是需要注意的是Set集合中的成员是无序排练的,而ZSet集合中的成员是有序排列的,

原因是ZSet集合中的每一个元素都会关联一个double类型的分数(也可以理解为权重),redis也正是通过分数来为集合中的成员进行从小到大排序的。所以有序集合的成员是虽然唯一的,但是分数(score)却是可以重复的。

向有序集合中添加一个或多个成员

通过ZADD命令,我们可以向有序集合中插入一个或多个成员,但是如果该成员已经存在的话,那么就会更新该成员所对应的分数,命令格式如下:

ZADD key score1 member1 [score2 member2...]

  • key为有序集合的索引
  • score为插入成员的分数,
  • member为对应的成员,如果插入多个成员,则以空格分隔

如我们要想myzset集合中插入score为1,member为ztest1,score为3,member为ztest3,score为4,member为ztest4的三个成员变量

127.0.0.1:6379> ZADD myzset 1 ztest1 3 ztest3 4 ztest4
(integer) 3

获取有序集合的成员数

ZCARD命令可以获得指定有序集合的成员变量个数,格式如下:

ZCARD key

  • key为有序集合的索引

如我们查询有序集合myzset中成员变量的个数

127.0.0.1:6379> ZCARD myzset
(integer) 3

计算有序集合中指定区间分数的成员数

如果我们想要查询指定区间内有多少个成员变量,那么可以使用ZCOUNT命令,格式如下:

ZCOUNT key min max

  • key为要查询的有序集合的索引
  • min为区间的最小值
  • max为区间的最大值

如以上面的myzset的集合为例,我们要查询区间为2到4直接的成员个数,

127.0.0.1:6379> ZCOUNT myzset 2 4
(integer) 2

根据分数返回有序集合指定区间内的成员

上一个命令我们根据分数返回了指定区间内成员的个数,那么如果想要返回成员呢?我们可以使用

ZRANGEBYSCORE key min max [WITHSCORES]

  • key表示查询的集合的索引
  • min表示score的最小值
  • max表示score的最小值
  • [WITHSCORES]是可选的,表示是否带上对应的score

如我们查询有序集合myzset中分数在1到3直接的成员变量:

127.0.0.1:6379> ZRANGEBYSCORE myzset 1 3
1) "ztest1"
2) "ztest3"
127.0.0.1:6379> ZRANGEBYSCORE myzset 1 3 WITHSCORES
1) "ztest1"
2) "1"
3) "ztest3"
4) "3"

移除有序集合中的一个或多个元素

如果想要移除有序集合中的一个或多个元素,我们可以使用ZREM命令,格式如下:

ZREM key member1 [member2...]

  • key为要移除成员的集合的索引
  • member为要移除的成员变量,可以存在多个,但是中间要以空格分隔

如我们要移除myzset集合中的成员变量ztest4,

127.0.0.1:6379> ZREM myzset ztest4
(integer) 1

今日总结

今天这篇文章中的内容虽然比较多,但是操作起来还是比较容易的,当然,Redis中这五种数据类型的操作命令远不止这几个,我只是列出了比较常用的几个命令,所以通过今天的文章,我希望小伙伴们都能够掌握Redis中五种数据类型的基本使用,最起码要知道如何赋值或取值,大家之后也可以结合着这五种数据类型的特点,去查询或者联想一下他们的使用场景,

最后别忘记今天的总结打卡哟!【点击查看社区打卡地址

在学习中存在任何问题的,大家都可以添加我的微信huixiaoyuan1030,(因为微信群二维码有效期只有七天😝),加入我们的“打卡答疑交流群”一起抱团、一起进步!

点击下方卡片可以找到我的微信二维码👇🏻👇🏻👇🏻

以上是关于七天玩转Redis | Day2Redis五大数据类型使用详解的主要内容,如果未能解决你的问题,请参考以下文章

七天玩转Redis | Day2Redis基本数据类型

七天玩转Redis | Day2 Redis五大数据类型

七天玩转Redis | Day2 Redis五大数据类型

七天玩转Redis | Day2 Redis五大数据类型

七天玩转Redis | Day1 Redis认识与环境配置

七天玩转Redis | Day1 Redis认识与环境配置