Redis_3_Redis介绍+常见命令
Redis介绍
和MySQL一样,redis也是一个客户端-服务器结构的程序!!
redis客户端和服务器可以在同一个主机上,也可以在不同的主机上(当前学习阶段,一般只有一台机器,此时客户端和服务器在同一主机上)。
Redis客户端也有很多种形态:
1、自带的命令行客户端(文章中主要使用这个客户端)
redis-cli

2、图形化界面客户端(桌面程序,web程序)
像这样的图形化程序,依赖windows系统。而未来在实际工作种,你用来办公的windows系统,链接服务器可能会有诸多限制(之间可能会经过很多的跳板机,堡垒机,权限校验),你的windows上的图形化界面客户端能不能连上你们的服务器里的redis是个未知数。
3、基于redis的api自行开发客户端(工作中最主要的形态)
非常类似于mysql的C语言API和JDBC
补充:
上篇文章我们谈及到了redis的快,这里的快是相对于mysql这样的1关系型数据库而言的~~
但是如果是直接和内存中操作变量相比,就没有优势了,甚至更慢了!!
比如:应用程序需要存储用户点赞数,此时就需要以键值对存储视频id、点赞个数,那么此时是使用redis来存,还是直接在内存中搞个hash map来存呢?
此时就要对症下药,具体问题具体分析了。使用hash map是直接操作内存的,使用redis是先通过网络,再操作内存!很显然,hash map会比redis更快!但是,上述场景中是否要使用redis?也要结合实际需求来确定!引入redis确实会比hash map更慢,但是有了redis之后就可以把数据单独存储,后续应用服务器重启,不会影响到数据内容。如果未来要扩展成分布式服务器,使用redis也是更佳的。
Redis实战
如何去学习redis命令呢?
1、掌握常用命令。
2、学会使用redis文档。
阅读文档,是程序员的基操!任何一个工具软件,去找相关资料,一定是去看官方网站:Redis - The Real-time Data Platform
首先在学习redis命令之前,我们需要通过redis-cli来完成客户端和redis服务器交互:
![]()
核心命令:set 和 get
get:根据key来取value
set:把key和value存储进去(这里的key和value都是字符串)。
set key value
![]()
对于这里的key、value都是不需要加上引号的,就是表示字符串类型,当然如果加上单/双引号也是可以的。
这里还要补充一点:redis和mysql一样都是不区分大小写的
get key
![]()
如果当前键不存在就会返回nil
全局命令
Redis支持很多种数据结构,整体上来说Redis是键值对结构,key固定就是字符串,而value实际上会有很多种类型,如:字符串、哈希表、列表等,操作不同的数据结构就会有不同的命令。
全局命令,就是能够搭配任意一个数据结构来使用的命令~
keys
用来查询当前服务器上匹配的key,可以通过一些特殊符号(通配符)来描述key的模样,匹配上述摸样的key就能被查询出来。这些由通配符组成的包含特殊符号的字符串也被称为pattern~
那pattern是咋写的呢,又支持哪些通配符呢?
为了测试,我们先创建一下key-value

?匹配任意一个字符。

* 匹配0个或者多个任意字符
[abcd] 只能匹配到abcd,相当于给出固定选项

[^e] 排除e,只有e匹配不了,去其他都能匹配

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

注意事项:keys命令的时间复杂度是O(N),因为他需要去遍历整个redis。
所以,在生产环境上都会禁止使用keys命令,尤其是keys *(查询redis中所有的key)
注意:这里是我们自己搭建的环境,key比较少,所以可以进行演示,但在生产环境下是一定一定不能使用keys *的!生产环境上的key可能会非常多,而redis是一个单线程的服务器,执行keys *的时间非常长,就使redis服务器被阻塞了,无法给其他客户端提供服务!!
我们之前说过,redis经常被用于做缓存,挡在MySQL面前,替MySQL负重前行~~ 万一redis被阻塞住了,此时其他的查询redis操作就超时了,这些请求就会直接查数据库~~
突然一大波请求过来了,MySQL措手不及,就容易挂了~~
什么是生产环境?
未来我们再工作中会涉及到的几个环境:
1、办公环境(入职公司之后,公司给你发个电脑)
笔记本(windows,mac)/台式机。一般8C16G512G
2、开发环境
有的时候,开发环境和办公环境使同一个;有的时候,开发环境是一个单独的服务器(28 C128G4T)。
做前端/客户端,一般来说,开发环境就是办公环境了,后端来说,很可能使单独的服务器。
因为有的后端程序可能会比较复杂~~
1、编译一次的时间特别久,需要使用高性能服务器,进行编译。
2、有的程序一启动要消耗更多的CPU和内存资源,办公电脑难以支撑。
3、有的程序比较依赖linux,在Windows环境下搭不起来.
3、测试环境
测试工程师使用的
4、线上环境/生产环境
办公环境、开发环境、测试环境,也统称为线下环境,外界用户无法访问到。
线上环境则是外界用户能够访问到的。一旦生产环境上出问题,一定会对于用户的使用产生影响!!
那生产环境这么危险,我以后不操作生产环境行不行?==》不行
程序员把一个程序上线才算是把或干完了~~上线也是程序员的一个重要考核指标。
衡量一个实习生能不能转正留用~~就看上线次数~~如果一周能上线两三次,基本就稳了~~
exists
判定当前key是否存在。
返回值:key存在的个数。
时间复杂度:O(1)。

键值对存储的体系中(类似于哈希表),key得是唯一的。
redis支持很多数据结构,这里指的是value可以是一些复杂的数据结构。redis自身的这些键值对,是通过哈希表的方式来组织的。redis的某个值,又可以是一些数据结构。
那么一次查询两个键和分开查询有什么区别呢?
![]()

答案:分开的写法会产生更多轮次的网络通信,效率比较低,成本比较高(和直接操作内存比)。当前我们的客户端和服务器在同一台机器上,如果是在不同的机器上就需要涉及到网络的封装和分用,耗费更长的时间。
del(key)
可以一次删除一个或者多个
时间复杂度O(1)
返回值:返回删除掉的key的个数。

之前我们在学习mysql的时候,强调像drop database、drop table、delete from……都是非常危险的操作!!一旦删除之后,数据就没了~~
但是redis的主要应用场景是作为缓存,此时redis里存储的只是一个热点数据,全量数据仍然在MySQL中。此时,如果把redis中的key删除了几个,一般来说,问题不大~~
但是如果是MySQL这样的数据,哪怕误删了一个数据,影响都能使很大的。如果是把redis作为数据库,此时误删数据的影响就很大了;如果把redis作为mq,此时误删数据影响大不大就需要具体情况具体分析了。
expire
作用是给指定的key设置过期时间,当key存活时间超出这个指定的值,就会被自动删除。一般被用在有时间限制的业务场景,如:手机验证码、外卖优惠券、基于redis实现的分布式锁,为了避免出现不能正常解锁的情况,统称都会在加锁的时候设置过期时间(所谓的使用redis作为分布式锁,就是给redis重写一个特殊的key value)……
时间复杂度:O(1)
返回值:设置成功返回1,失败返回0.

10秒后,我们get一下hello:

显示为nil。
补充:pexpire能够设置毫秒级的时间
ttl
查看当前键的过期时间。
我们先设置hllo过期时间为100秒:

此时我们就可以通过ttl来查看过期时间了

与pexpire相对应还有一个ettl来查看毫秒级的过期时间

