开发者学堂课程【Redis 入门实战演练: Redis 数据类型之字符串和列表(三)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/653/detail/10836
Redis 数据类型之字符串和列表(三)
9、查看 key 的过期时间:
tt1#查看 key 的剩余生存时间
-1#负一为永不过期,默认创建的 key 是永不过期,重新对 key 赋值,也会从有剩余生命周期变成永不过期
-2#为没有此 key
num #key 的剩余有效期
127.0.0.1:6379>TTL key1
(integer) -1
10、设置 key 的过期时间:
127.0.o.1:6379>EXPIREkey1 86400
(integer) 1
查看 key 的过期时间,我们之前已经了解了可以设置 key 的过期时间,比如说2000或者3000,查看目前key剩余的过期时间需要使用 TTL 命令。使用 TTL 查看 key 的剩余生存时间,生存时间有三个值,-1为永不过期,就是在默认情况下,即如果在创建 key 的时候没有使用EX增加后面的过期时间值,默认同意使用永不过期的,-2表示是没有该 key,例如输入不存在的一个 key:TTL xxx
,则返回值为-2,-2表示没有你想了解的 key 的过期时间;输入TTLname
,可以发现返回值为1,表示 name 使用的是默认格式,永不过期。再把刚刚删除的红包 key 重新创建,并且设定为 hongbao 300 ex 86400
,即红包的值为300,过期时间为一天。使用TTL查看红包,发现返回值从86400不断一秒一秒地去减,直到这个数减到零,然后就会被自动被 redis 删除。若重新对key进行赋值,也会从有剩余的生命周期变成永不过期,就是在业务当中和开发相关的情况,假如红包之前是300,若把红包的数额改成500,会导致 hongbao 这个 key 生产周期发生变化,他不会继承之前的周期,而是变成无生命周期的 key 或是永不过期的 key。就会导致红包失去意义,就类似于无论是双11还是618的促销活动,活动的红包都是有生产周期的,无论红包的额度有多大,一旦超过了使用期限,红包或是优惠券就会呈灰色状态。而假如说在双十一之前,领导要求将红包的额度增大进行大规模促销,而此时的红包额度以及使用期限(即自动过期时间)早已经在程序中写好了,而且该红包的有效期仅限双11的当天使用,即双11的23点59分59秒,更改额度后,对于双十一当天的限制就不存在了,成为了永不过期形式,用户可以在以后的任意时间段使用该红包。因此在对已设置好自动过期时间的key进行修改时,一定要小心,否则可能会造成无法估计的损失。
11、取消 key 的过期时间:
127.0.0.1:6379>PERSIST key1
(integer) 1
由程序设计的时候来设计数据模式,可以认为是在数据库里面设计的表结构,而数据表结果是由开发来设计的,我们是无法完成的。开发在设计表结构的时候,无论是数据库还是缓存里面的数据,开发需要依据产品提出的需求来定的,即产品部门给开发提需求,而产品部门不需要去了解开发是如何实现所提功能的。当开接到需求之后,就开始进行开发设计,他们的设计包括很多方面,比如设计前端(由美工来完成图片、效果图等方面的任务)、开发(包括前端开发和后端开发,这一部分就是写代码的过程,后端主要写应用程序,大部分通过 Java 来写,后端开发还包括很多方面,有开发数据库的程序员,还有负责 api 的程序员以及写各种接口功能的程序员)完成,整个团队各有分工,最终实现产品部门提出的需求。后期产品部门对产品需求的更改也是十分常见的,一周改一次这是很正常的,因为产品也是根据线下的销售数据进行不断归纳,结合用户的使用反馈来综合考量,并提出修改需求。修改之后开发拿到之后发现和过去这个数据库都不一样了,就需要对数据库进行更改,包括表结构、数据类型等等,更改了数据库之后很可能会涉及到该redis的数据类型或者 redis 的数据,因为 redis 数据的来源是在数据库里面缓存的,但是有些数据是直接写入进来的,通过数据库写入的数据,一旦数据库进行更改,redis里的数据就要跟着进行更改,包括一些字段的修改等等,比如设计师在用户注册的时候,只要求了注册姓名和年龄,后来发现身份证也是注册必填信息之一,就把身份证的需求发给开发,开发就要对其进行程序上的修改。公司的开发开发一般都会写日报、周报、甚至月报以及季度考核等汇报,并将极度规划报备给公司 CEO,因为 CEO 需要了解开发近期的工作是什么。
Section 就是以字符串的形式往 redis 里面写入数据,它写入的数据无论是 section 信息还是缓存信息,写到 redis 之后的数据类型基本上就是在 redis 内存里面,但这个内存是从服务器里面分出来的,在有限的内存空间有限来保存数据。这个数据很有特征,类似于数据库的表,但是又不完全一样,这个数据是一列的,一列是 key 的名称,然后右侧就是值 value,每个 key 都会占据一些内存空间,当然每个 key 所占用的内存很小,每写一个数据就会占据一个空间。
三、Redis 数据类型-列表(list)
列表是一个双向可读写的管道,其头部是左侧尾部是右侧,一个列表最多可以包含2^32-1个元素即4294967295个元素。
列表数据类型比较特殊,列表是一个双向可读取的管道,这就意味着它具有一个头部和一个尾部,它的头部在左侧的,尾部在右侧。一个列表最多可以包含,它的意思是:以下述例子为例:假设现有一个列表,该列表是一个双向可读取的管道,类似于地下的管道,在我们的生活里面,地下水道走的是生活用水,但是对这个例子来说,双向管道走的都是数据。数据里面具有各种key、value等信息,均装在池中,假如管子一头的数据是1 2 3 4 5,管子的另一头还有数据,另一头的数据是96 97 98 99……,列表从一头上开始通过程序写数据可以理解为1 2 3 4 5一侧的数据是头,因为我们是从头上开始写数据的,1 2 3 4 5 就是通过程序写入的数据,使用的程序可以是 Java 的,可以是 python 的,也可以是其他语言写的,后续的数据收集会用到 Nginx 这种数据类型,当然那是应用的 Java 所写的,Java 所写的应用程序会收集数据,数据可能是用户输入的,即用户在他的浏览器上登录网站之后,用户信息的界面需要从 redis 里面要查询或写入数据,或者这个数据由 Java 程序在日志收集的时候,日志文件会根据用户的访问而生成,用户一旦访问了某些应用,例如访问 Nginx,就会生成相应的日志文件,Nginx 和日志文件是在同一个服务器的,即Nginx 会在本机记录下一次日志,此时 Java 文件回去监听这个文件,一旦日志文件发生变化,Java 程序就会把日志写到 redis 服务器的管道上。数据在写入的时候是很有特征的,会固定地在某一方向进行书写,且是按照顺序进行写入的,日志文件一旦访问了一条日志,比如日志1,日志1就会由 Java 程序写入,写完之后加入用户又进行了一次访问,这种情况也是十分常见的,就会再产生一条日志,即日志2。日志1和日志2是在不同时间下生成的对应日志假设一个是用户在10点08分访问的,一个是用户在10点09分访问的,在日志2 没有生成之前,日志1是第一个被写入管道的,当用户再次访问且生成了日志2之后,日志2在写入的时候会 把日志1的位置顶替掉。读取的时候是按照顺序进行读取的,第一条日志首先读取,再依次读取第二条日志、第三条日志……如果读取的时候顺序出现混乱,在查看的时候,数据就会出现错位。为了防止读错,Java程序会在尾部再进行读取一次,由于用户的不断访问,日志1也就会不断的后移,可以这样理解,尾部数据进行一次读取,位置就可以空闲出来,即日志1就可以后移一次。可以归纳为一句话,数据在list的读取遵循先进先出的原则,要先被写进去的数据被先读取出来这样的业务逻辑。举例来说,我们在网上购买手机的时候可能会遇到排队的情况,而手机售卖商只有10万部手机,但涌入了30万人进行抢购,而且应用程序也无法一次性处理这么多的连接,就会先往管道里写入5000人,先进入的人一定排在第一位,即我们需要首先处理第一位进入的人购买手机的请求
1、生成列表并插入数据:
127.0.0.1:6379>LPuSH list1 jack tom jhon
#根据顺序逐个写入 1ist1,最后的 jhon 会在列表的最左侧。
(integer) 3
127.0.0.1:6379>TYPE list1
List
使用也是非常简单的,需要通过 LPUSH命令来完成
2、向列表追加数据:
127.0.0.1:6379> LPUSH list1 tom(integer) 2
127.0.0.1:6379> RPUSH list1 jack(integer) 3
需要通过 RPUSH 命令来完成
3、获取列表长度:
127.0.0.1:6379> LLEN 1ist1
(integer) 3
通过使用 LLEN 命令来完成
4、获取列表指定位置数据:
127.0.0.1:6379> RPuSH list1 zhang wang li zhao
(integer)4
127.0.0.1:6379> LRANGE 1ist1 1 2#指定范围
1) "wang"
2) "1i"
127.0.0.1:6379>LRANGE 1ist1 2 2*指定位置1)
"Li"
通过 LRANGE 命令进行操作
5、移除列表数据:
127.0.0.1:6379>RPOP list1#最后一个
"jack"
127.0.0.1:6379>LPOP 1ist1#第一个
"tom"
通过 LPOP、RPOP 来进行操作。