Redis远程字典服务器(2) —— 全局命令

一,使用官方文档

  1. 学会使用文档,是一个优秀程序员的必备技能
  2. Redis的命令非常多(上百个),因为Redis是通过键值对存储数据的,key为string类型,但是value可以是其它的数据类型(字符串,哈希表,列表,集合等),所以不同的数据结构的操作命令都不一样。
  3. 全局命令指的是能够搭配任意一个数据结构来使用的命令
  4. 官方的命令查询文档网址为 Commands | Docs
  5. 虽然Redis这种知名软件,都是有中文文档的,但是还是建议看英语;后面工作中可能会用到不太知名的软件/库,虽然没有中文文档,但是一定也有英文文档,所以需要有一定的英语基础

二,set / get

这是Redis最核心 的两个命令,Redis是按照键值对存储数据的,set就是存进去key和value,get就是根据key查询value,如下图:

也可以使用 mset和mget,一次插入或查询多组键值对 :

使用还是比较简单的,至于set时后面还有一些选项,以后再讲

对于key和value,可以加双引号,也可以加单引号,也可以不加;并且Redis的命令也支持双击Tap键自动补全,也不区分大小写

三,keys

3.1 使用

keys是用来查询当前服务器上匹配的key,通过一些特殊符号 (通配符)来描述key的模样,匹配上述模样的key就能被查询打印出来

pattern 表示包含特殊字符的字符串,可以翻译成"样式" 或者 "模式",pattern可以有以下几种:

  • h?llo 匹配 hello , hallo 和 hxllo (?是匹配一个字符
  • h*llo 匹配 hllo 和 heeeello (*是匹配所有长度的字符串
  • h[ae]llo 匹配 hello 和 hallo 但不匹配 hillo ( [] 方括号里面的字母单独匹配
  • h[^e]llo 匹配 hallo , hbllo , ... 但不匹配 hello ([^]匹配除了方括号里面的
  • h[a-b]llo 匹配 hallo 和 hbllo ( [-] 匹配范围内的字符,[a-z]这个就是匹配所有字母的)

keys * 是查询所有的key,将当前所有的key全部打印到屏幕上

注意:keys命令的时间复杂度是O(N),所以在生产环境上,一般都禁止使用keys,尤其是大杀器keys *的时间非常长,就使Redis服务器被阻塞了,无法给其它客户端提供服务,后果是灾难性的。

场景:redis经常用于做缓存,挡在MySQL前面替MySQL负重前行,万一redis被一个keys *阻塞住了,此时其它的查询redis操作就超时了,此时这些请求就会直接查MySQL,然后突然一大堆请求过来了,MySQL可能就会措手不及直接挂了,这样的话系统就基本瘫痪了,如果你要是没能及时发现并及时恢复的话,年终奖就没了,更严重工作也就那啥了。

3.2 关于生产环境

上面提到了下生产环境,那么下面来谈谈以后工作会遇到的几种环境:

  1. 办公环境:入职公司之后,公司给你发个电脑,现在的办公电脑一般8核16G内存512G,以后你在这个电脑上做ppt表格啥的,这个机器就叫做办公环境。
  2. 开发环境 :有时候和办公环境一样,直接在这个电脑上写代码编译运行测试啥的,也有时候开发环境是单独的服务器,对于后端开发,后者概率大些;对于 前端/客户端 前者概率大。因为有的后端程序会比较复杂:①编译一次时间很久 (C++),时间长要和 #include 要接锅 --> C++23引入module,能减少编译时间,但是大部分公司用的是比较老版本的C++,暂时不会引入module --> 所以就要使用一些高性能的服务器进行编译,会比本机电脑快很多 ②有的程序一启动,要消耗很多的CPU和内存资源,办公电脑可能难以支撑 ③有的程序比较依赖Linux,在Windows上环境难搭建
  3. 测试环境:测试工程师使用,也是属于单独的配置比较好的服务器(比如28核128G内存4T存储的主机)
  4. 线上环境/生产环境 :产品开发和测试完成,正式部署到服务器并且对外开放的运行的环境,是直接面向用户的,一但是生产环境出问题,对于用户的使用会直接产生影响,直接影响到公司的营收,未来咱们去操作线上环境的任何一个设备或者程序,都要怀着12分的谨慎
  5. 而且以后我们也是要去操作生产环境的,把一个程序"上线"了才算是把活干完了,上线也可以认为是程序员的一个重要考核指标。,衡量一个实习生能不能转正留用,就看上线次数,假如一两个月才上线一次,基本凉凉,如果一周上线一两次,基本稳

四,exists

该命令负责判断一个或多个key是否存在,并返回个数

注意一次查三个,和三次查一个,乍一看没区别,但是区别很大很大

Redis是一个客户端 - 服务器结构的程序,两者之间是通过网络 进行通信的,学习过计算机网络我们知道,我们输入一个命令,都是通过网络协议栈,将命令字符数据一层层往下封装各协议的报头形成报文再发送的,分开的exists的写法会产生更多轮次的网络通信,而网络通信的成本比较大的

再比如一个场景,你打电话给别人说"你好"两个字,我们可以打一次电话将两个字一次性说完,也可以打两次电话一次说一个字,那么这两种方式哪个快大家都知道哈

五,del

该命令的作用是删除指定的key,可以一次删多个

问题:Redis的删除是否和MySQL的删除一样,成本很大呢?

解答 :影响不会很大。redis主要的作用是作为缓存 ,此时里面存的数据只是一个热点数据,全量数据还是存在mysql中的,热点数据也是会经常变化的,所以把redis中的几个key删除几个,影响不大。当然把所有数据或者一大半数据干掉了,问题还是有点大的。相比之下,mysql的drop和delete from,代价是很大的。

如果是把redis作为数据库MySQL作为缓存,上面的情况就反过来了

六,expire / ttl

6.1 expire使用

主要作用是用来给key设定过期时间,单位为秒,因为上面也说了热点数据会经常变化,所以我们可以使其自动化。

key的存活时间超过这个指定的值,就会被自动删除,有用且实用,很多业务场景有时间限制的,比如手机号验证码,外卖优惠券,都是在指定时间内有效

还有基于redis实现一个分布式锁,以前多线程的锁,都是在一个主机的一个程序里,分布式系统就是多个主机多个程序了,再需要互斥效果的话就所以需要分布式互斥锁,往redis里面写一个特殊的key value。为了避免出现不能正确解锁的情况, 通常都会在加锁的时候设置一下过期时间

还有以秒为单位对主机来说太慢了,我们可以使用pexpire,这个单位就是毫秒了

6.2 ttl使用

这个命令作用是查key的过期时间还剩多少,当返回-2时表示key不存在或已经过了过期时间被删除了:

在IP协议的报头字段中,有一个字段就是TTL,表示该报文能够跳转的路由器的最大个数,IP中的TTL表示次数,不是时间,和这个ttl不一样

6.3 Redis过期策略

一个redis可能同时存在很多key,这些key也有很大一部分有过期时间,那么redis服务器咋知道那些key已经过期要被删除,哪些还没过期呢?

  1. 如果直接去遍历所有的key,效率很低的,该方法直接排除
  2. redis整体的策略是两方面:定期删除,惰性删除。两种策略相结合
  3. 惰性删除:假设key已经到了过期时间,但是暂时还没删,紧接着后面有一次访问到了这个key,这时候查时间,发现到期了,于是这次访问会让redis删除这个key,同时返回一个nil
  4. 定期删除 :和惰性删除一起搞,而且也不一次性全遍历完,抽取一部分验证过期时间,保证抽取简单的过程足够快

问题:为啥对于定期删除的时间要有明确要求呢?
解答 :因为Redis是单线程的程序,主要的任务还是处理命令任务,还有刚才扫描过期key,如果扫描消耗时间太久了,会导致前者正常处理命令被阻塞,产生类似执行key * 这样的效果

虽然有了上述两种策略结合,但整体的效果一般,仍然可能会有很多过期的key残留,所以Redis还提供了一系列的内存淘汰策略,后面再细讲

七,type

该命令用于查看key对应的value的数据类型

lpush插入链表value,再type就是list类型在redis中,操作不同数据结构使用的命令差别是很大的

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