【Redis】通用命令

使用者通过redis-cli客户端和redis服务器交互,涉及到很多的redis命令,redis的命令非常多,我们需要多练习常用的命令,以及学会使用redis的文档。

一、get和set命令(最核心的命令)

Redis中最核心的两个命令:get和set,Redis是按照键值对的方式存储数据的。get命令是根据key来取value,set命令是将key和value存储进去的。

cpp 复制代码
set key value

get key

我们想要使用Redis命令,需要先进入redis-cli客户端,才能输入Redis命令,其中key是字符串类型,而value可以有多种数据类型。

二、Redis的基本全局命令

Redis有5种常见的数据结构(字符串,哈希表,列表,集合,有序集合),但是他们都是键值对中的值,对于键来说有一些通用的命令。

2.1 KEYS

返回所有满足样式的key,语法如下:

cpp 复制代码
KEYS pattern

支持如下统配样式(通过一些特殊符号来描述key的模样):

  • ?匹配任意一个字符
  • * 匹配0个或者多个任意字符
  • abcde\] 只能匹配到a,b,c,d,e,别的不行,相当于给固定的选项了

  • a-b\] 匹配a-b这个范围内的字符,包含两侧边界

keys命令的时间复杂度是,所以在生产环境中,一般会禁止使用keys命令,尤其是keys *(查询redis中所有的key)。生产环境中的key可能会非常多,而redis是一个单线程的服务器,执行 keys * 的事件非常长,就使redis服务器被阻塞了,无法给其他客户端提供服务!!

这种后果可能是灾难性的!!!

redis经常会用于做缓存,挡在MySQL前面,替MySQL负重前行。万一,redis被一个 keys * 阻塞住了,此时其他的查询redis操作就超时了,此时这样的请求就会直接查数据库~~突然一大波请求过来了,MySQL就容易挂了~整个系统就有可能瘫痪~~~~

2.2 EXISTS

判断某一个key是否存在,语法如下:

cpp 复制代码
EXISTS key [key ...]

时间复杂度为:O(1)

返回值:key存在的个数,针对多个key来说是非常有用的~(键值对存储的体系中,key是唯一的)。

redis是一个客户端-服务端结构的程序,客户端和服务器之间通过网络来进行通信!!

分开的写法不好,会产生更多轮次的网络通信,效率比较低,成本比较高。因为网络通信时需要进行封装和分用:

进行网络通信的时候,发送方发送一个数据,这个数据就要从应用层到物理层,层层封装(每一层协议都要加上报头或者尾部);接受方收到一个数据,这个数据就要从物理层,当应用层层层分用(把每一层协议中的报头或者尾部给拆掉)。

网卡是IO设备,更何况,你的客户端和服务器不一定在一个主机中,中间可能隔着很远~~,Redis自身非常清楚上诉问题,Redis的很多命令都是支持一次就能操作多个key的多种操作。

2.3 DEL

删除指定的key,语法如下:

cpp 复制代码
DEL key [key ...]

时间复杂度为:O(1)

返回值:删除掉的key的个数

注意事项:

对于删除操作来说,还是不要乱删除数据~~

之前在学习MySQL的时候,当时强调删除类的操作:drop database/drop table/delete from...都是非常危险的操作!!一旦删除了之后,数据就没了~

Redis主要的应用场景,就是作为缓存~此时Redis里存的只是一个热点数据,全量数据是在MySQL数据库中,此时,如果Redis中的key删除了几个,一般来说,问题不大。但是当让如果把所有的数据或者一大半数据一下都删除了,这种影响会很大(本来Redis是帮MySQL负重前行的,Redis没数据了,大部分的请求就直接打给了MySQL,然后就容易将MySQL搞挂)

相比之下,如果是MySQL这样的数据,哪怕误删了一个数据,都可能是影响很大的。如果是把Redis作为数据库,此时误删数据的影响就大了;如果是把Redis作为消息队列,这种情况误删数据影响大不大,就需要具体问题具体分析了。

2.4 EXPIRE

为执行的key添加秒级的过期时间(Time To Live:key存活时间超出这个指定的值,就会被自动删除),语法如下:

cpp 复制代码
EXPIRE key seconds

时间复杂度为:O(1)

返回值:1表示设置成功;0表示设置失败。

很多业务场景是有时间限制的。

  • 手机验证码:该验证码5分钟内有效
  • 点外卖:优惠卷,在指定时间之内有效
  • 基于Redis实现分布式锁,为了避免出现不能正确解锁的情况,通常都会在加锁的时候设置一下过期时间(所谓的使用Redis作为分布式锁,就是给Redis里写一个特殊的key value)

2.4 PEXPIPE

对于计算机来说,秒是一个非常长的时间,所以我们还可以进行设置毫秒。用法和EXPIRE类似。

2.5 TTL

获取指定key的过期时间,秒级,语法如下:

cpp 复制代码
TTL key

时间复杂度为:O(1)

返回值:剩余过期时间。-1表示没有关联过期时间,-2表示key不存在。

2.6 TYPE

返回key对应的数据类型,语法如下:

cpp 复制代码
TYPE key

时间复杂度为:O(1)

返回值:

三、生产环境的介绍

未来在工作中会涉及到的几个环境:

  • 办公环境:入职公司之后,公司会给你发一个电脑(8C16G512G)
  • 开发环境:有的时候,开发环境和办公环境是一个;有的时候,开发环境是单独的服务器(28C128G4T),做前端和客户端,一般来说,开发环境就是办公环境,后端来说,很可能是单独的服务器。有的后端程序会比较复杂:编译一次时间特别久,使用高性能服务器进行编译;有的程序一启动要消耗很多的CPU和内存资源,办公电脑难以支撑;有的程序比较依赖linux,在windows环境中搭不起来。
  • 测试环境:测试工程师使用的(28C128G4T)
  • 线上环境:线上环境则是外界用户能够访问到的,一旦生产环境上出现问题,一定会对用户的使用产生影响!!!直接的会影响到公司的营收,很多公司的营收都是靠广告,广告一般是按照展示/点击次数来计费的。

四、Redis的key的过期策略是怎么实现的

一个Redis中可能同时存在很多很多的key,这些key中可能有很大一部分都有过期时间。此时,Redis服务咋知道哪些key已经过期要被删除,哪些key还没过期??

如果直接遍历所有key,显然是行不通的,效率非常低~~

Redis整体的策略是:

  1. 定期删除:此处也需要结合定期删除的操作~~每次抽取一部分,进行验证过期时间。保证这个抽取检查的过程足够快!!
  2. 惰性删除:假设这个key已经到过期时间了,但是暂时还没删除他,key还存在。紧接着,后面又一次访问,正好使用到了这个key,于是这次访问就会让Redis服务器触发删除key的操作,同时再返回一个nil.

为什么对于定期删除的时间,有明确的要求呢??

因为Redis是单线程的程序,主要的任务是处理(每一个命令的任务,刚才扫描过期的key)如果扫描过期的key消耗的时间太多了,就可能导致正常处理请求命令就被阻塞了。

虽然有了上述两种策略结合,整体的效果一般~~~仍然可能会有很多过期的key被残留,没有及时删除掉~~Redis还提供了一系列的内存淘汰策略:

Redis中并没有采取定时器的方式来实现过期key删除;如果有多个key过期,也可以通过一个定时器来高效/节省CPU的前提下来处理多个key~

为什么Redis没有采取这种定时器的方式呢??

个人猜测:基于定时器实现,势必要引入多线程,Redis早期版本就是奠定了单线程的基调,引入多线程就打破了作者的初衷。

五、定时器

定时器:在某个时间到达之后,执行指定的任务。

基于优先级队列/堆

基于时间轮实现的定时器

相关推荐
r i c k2 小时前
数据库系统学习笔记
数据库·笔记·学习
野犬寒鸦3 小时前
从零起步学习JVM || 第一章:类加载器与双亲委派机制模型详解
java·jvm·数据库·后端·学习
IvorySQL3 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
·云扬·4 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
IT邦德4 小时前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
惊讶的猫4 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i4 小时前
完全卸载MariaDB
数据库·mariadb
期待のcode4 小时前
Redis的主从复制与集群
运维·服务器·redis
纤纡.4 小时前
Linux中SQL 从基础到进阶:五大分类详解与表结构操作(ALTER/DROP)全攻略
linux·数据库·sql
jiunian_cn5 小时前
【Redis】渐进式遍历
数据库·redis·缓存