开发者学堂课程【Redis 入门实战演练: Redis 数据类型之字符串和列表(一)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/653/detail/10836
Redis 数据类型之字符串和列表(一)
内容介绍
一、Redis 数据类型
二、Redis 数据类型-字符串(string)
三、Redis 数据类型-列表(list)
一、Redis 数据类型
在企业或者在公司里数据类型主要与开发的关系比较大,对于运行来说,只需要保证 redis 服务器的正常运行,以及内存还有性能足够的稳定,这个数据类型并不是所主要关心的,但是还是需要了解数据类型,因为不同数据类型具有不同的使用程度。尤其是在企业里面,比如开发让我们去改变 redis 里的数据,删除数据或者进行一些其他的操作,要首先看一下这个数据是属于什么类型的,因为不同类型的方法是不一样的,并不是一个命令可以操作所有的数据,不同数据的操作方法与操作命令都不一样。数据类型一共有5种,分别是字符串()string、列表(list)、集合(set)、有序集合(sorted set)以及哈希(hash)。
http://www.redis.cn/topics/data-types.html
二、Redis 数据类型-字符串(string)
字符串是所有编程语言中最常见的和最常用的数据类型,也是 redis 最基本的数据类型之一,而且 redis 中所有的 key 的类型都是字符串。即 redis 中创建的数据无论是列表集合还是哈希的,key 都是字符串。
字符串数据类型的创建包括增删改查,这些都很好完成。创建使用 set 命令,set 命令之后要写入一个 key 的名称,再跟上一个 value 值,还可以设置过期时间。过期时间指的是希望在多长时间之后,完成自动删除,自动删除指的是 redis 完成的自动删除。
1、添加一个 key,代码为:
127.0.0.1:6379> set key1 value1oK
127.0.0.1:6379> get key1"value1"
127.0.0.1:6379>TYPE key1string
127.0.0.1:6379>SET name2 jack2 ex 3
#设置自动过期时间
OK
打开虚拟机,上次使用的是17217虚拟机,现在准备了10个虚拟机,在后续我们会使用8个或9个左右的虚拟机。配置都不是很高,大家做实验的时候,可以把这个虚拟机的配置给到1G内存、1个cpu就可以,因为数据不是很多,所以它对内存和cpu的要求并不太高,只有能够演示功能和效果就可以了。第一个虚拟机(172.31.7.101)的环境已经配置完成了,查看redis有没有开起来,如果没有打开,在命令行窗口输入systemctl satrt redis将redis启动起来,启动完成之后查看字符串类型有没有637的监听端口,发现已经监听,然后就已经连接过去了。字符串数据类型的创建主要是增删改查,无论我们对任何一个数据类型最常见的操作,和数据库很类似,就是对数据做增删改查,而且无论是增也好,还是删好,还是改也好,还是查也好,在公司里是由开发的程序自动实现的,可以理解为开发写的Java,PHP等业务程序来进行执行的,而很少是人为的对他们进行增删改查,只有在强制清空数据,强制删除等情况下才有可能是需要人为的操作。通常情况都是开发写的代码进行自动操作,人为对redis的操作无非是备份数据,然后对当前运行状态和性能以及内存空间做监控,这个对应用来说也是相对比较重要的。其实主要是维护redis服务器的稳定问题。可以了解一下这样一条新闻,某公司的redis被开发弄出问题了,结果就导致业中断了一段时间,然后导致公司的经济损失了很多钱。另外告诉大家一件消息,很多公司目前都在转线上,但是也有些是线下的企业用别人的平台来进行讲课等业务也好,例如一些公司是针对高校做业务的,他们对全国各大院校就,包括2000多家高校还有一些高职的职业技校做线上业务。比如学校延期开学,就会有很多线上业务,学生登录在线教育平台后,相当一部分学校的在线平台无法支撑住这样的访问量,因为大部分学校的教育平台底层的服务器是自己搭建的,也有可能使用的是第三方的服务器,像购买的阿里云的服务器。他们当时在设计这个结构的时候,没有考虑会突然之间有这么多的学生、老师等用户来访问平台,平时的访问量大概最多只有全校全体教职工、学生数量的30%进行访问,例如共有10000名用户,一万的30%即最多不超过三千个用户在平时进行访问,结果突然之间因为不可控因素像目前的疫情等因素,导致很多学生无法进行正常的上课,所以学校需要要求老师通过他们的平台去讲课,这时平台就会出现问题,无论使用什么存储结构,其实和我们所使用的都差不多,只不过他们会用 CDN,当然部分公司CDN也不使用。结果导致他们的业务平台崩溃,例如各高校的一些大学生,会使用学校里的一些第三方产品,比如看论文的超星集团,这个公司就是做这个业务量很大,向学校提供学术论文以及讲课平台,包括清华、北大都是他们的客户。现在在大学上课已经不再是传统意义上的讲课方式了,很多老师讲课的时候,使用安装了某些客户端的手机或者平板给学生分享资料、完成定位或是人脸识别的点名,预防出现代替出勤的情况,保证了学生的真实出勤率,而且打卡也可以实现随机打卡,不一定时在上课的开始进行点名。对于我们来说,就是要解决像超星这样的平台出现的问题,运行和管理他们业务的运行服务器,解决突然间访问量过高而给平台造成的压力问题,改善平台的超时、崩溃问题。这就会设涉及到很多业务模块是否会被调用到,而被调用的地方是不是处于技术的瓶颈阶段,而这其实是需要时间去完成的,像认证系统是有几个服务在运行,以及他的网络是什么类型,还要考虑到路由器有没有瓶颈,它的系统如何,所以这个时候要把各个服务接口的监控以及日志收集好,这是后面主要完成的事情,需要花大量时间去维护服务的稳定性,不能超时,不能报错,不能崩溃,这个崩溃指的是销售出去的产品,不要出现突然间打不开、或者报出各种奇怪错误等情况。
目前遇到的问题就是用虚拟机不好扩容,因为每一个地方的扩容,都要重新把代码进行准备环境的测试,还需要做调用等等,而且很多地方写的还是IP地址,并且地址还不可以随意更改,接口对 api 如果是瓶颈,这样操作起来就更麻烦了,按原有的地址不能让新加的程序功能访问新的IP地址,访问不到地址,这些所加的功能依旧无法使用。即就算重新打开一个虚拟机,应用程序还是不知道地址,所以要对他的代码进行修改。
比如先设置 name 为 redis,value 设置为 linux39,如果想设置的过期时间,就再后面直接跟上一个值,这个值就表示的是过期时间,比如希望60秒之后自动删除,或者五秒钟之后自动删除,就直接写入60或5.set 完成之后,使用 key*去查看当前DB库里面所有的 key,key *命令不要轻易使用,因为它类似于数据库里面的 show database,但是比 show database 更厉害,如果 redis 里面有10万个 key 使用该命令会把这10万个key都从内存里面把它的名称提取出来,然后打印出来,但是从内存里面提取并进行打印,会消耗很大的性能,很可能会导致 redis 出现瞬间的阻塞,就是在从内存读取这些数据的时候,很可能导致会一些用户的访问或者程序写入数据、访问数据出现延迟,所以在企业里面尽量不要使用 key*。如果想额外增加一个过去时间,需要在完成 name 和 value 的设置后,输入ex 在输入过期时间,输入5,代表五秒钟之后就自动过期,五秒钟之后就自动删除,使用 redis 服务器完成自动删除,不需要人为做任何操作,这个利用了 redis 的特性,即自动过滤功能。之所以要设置过期时间,会在一些场景进行使用,例如红包、双十一、国庆节等节假日的优惠券等,或者是公司的某些活动提供给用户一些优惠,包括红包、优惠券等,都是时间限制的,比如说一个用户购买了本公司的产品,或者在这个游戏中购买了东西,然后可能是公司为了反馈广大用户,然后向每个用户发放一个优惠,实行满减政策。比如满1000减100或者满1000减200,但是这个优惠券或者红包是有优惠期限的,比如仅限于三天内使用,如果超过三天红包或者优惠券就不能使用了,就过期了,从用户的账户里面删除了。这时候就需要服务器进行自动回复,所以需要程序员或者开发把在设定这个红包等优惠的时候,把过期时间通过ex+时间的形式进行设定,到了时间之后进行自动的删除。例如设置红包300元,自动过期时间为1天,一天就是86400秒,两天的话就需要乘以二就是17280,然后这样就可以使这300块过去了设定时间后,就完成自动删除,即这300块在设定时间后就过期了。使用 get hongbao 就可以看到内容为300yuan 的字样。
2、获取一个 key 的内容:
127.0.0.1:6379> get key1
"value1"
3、删除一个 key:
127.0.0.1:6379 >DEL key1
(integer) 1
直接使用 del,假如不想设置上述红包,需要手动将其删除,或是由于关联出错,或是发错对象,直接使用 DEL 删除红包即可。删除完成之后,删除一个 key 的返回值是1,DEL 后面可以跟多个需要删除的对象,如果再进行删除,当前 redis 里面已经没有指定红包的 key 了,就会给出一个返回值0。所以后面的返回值是1,还是2、0,不是固定的。如果要操作的对象在 redis 中不存在了,再对其进行删除,就不会删除成功,返回值就是0,如果要操作的对象在 redis 中还存在,再对其进行删除,删除成功、返回值就是1。即删除一个,返回值是1,表示删除成功了。当需要要删除两个时,一个是 key1,一个是 key2,如果两个 key 都存在于 redis 中,会给出一个返回值2,意味把这两个 key 都删除成功了。在本次测试中还有 name,如果再次使用 del 功能,把 name 也进行删除,返回值为1。
小结:
目前来说,至少零号 DB 库里就没有数据了。对于我们来说,现在不需要在意业务里面如何进行调用的,如何设置自动过期时间,以及怎样创建 key,如何删除 key,因为每个公司的业务都是不同的。有些公司就是需要进行设置优惠券和红包等等一些带有有时间限制的业务,所以这就需要利用自动计时,即针对哪些对时间有限制的场景来进行使用。若需要删除一个 key,输入 del 即可。