Redis 的访问速度比 MySql 快上万倍。因为Redis 在内存中使用,MySql 在硬盘上使用
Redis 和 MySql 相比最大的劣势是存储空间是有限的
redis 主要作为缓存、内存数据库、消息队列
在启动redis客户端的时候,加上--raw,可以让redis客户端将二进制翻译 redis-cli --raw
启动redis服务
redis-server /etc/redis/redis.conf
连接redis客户端
redis-cli
一、Redis的命令
1.SET和GET
set key value
get key// key和value是字符串类型,不用必须加引号,但是加上引号也可以
//当使用get命令时,如果当前key不存在,会返回一个 nil,相当于null/NULL
//整体上说,redis是键值对结构,key 永远是字符串,value 实际上有多种数据类型
//字符串、哈希表、列表、集合、有序集合
二、全局命令
1.keys
功能:用来查询当前服务器上匹配的 key
通过一些特殊符号(通配符)来描述 key 的模样,匹配上述模样的key就能被查询出来
keys pattern//pattern 包含特殊符号的字符串 //存在的意义,是去描述另外的字符串长的啥样的
pattern 的格式
h?llo : ?可代替任何字母,如 hello,hqllo,hxllo等
h * llo :* 表示0个或多个字符,如haallo,heeeeeello
h[bcd]llo:[bcd]表示只能匹配 b c d ,相当于给出固定选项,如hbllo,hcllo,hdllo
h[ ^e ]llo:[ ^e ]表示除了e都能匹配,如 hallo,hillo
h[a-b]llo:[a-b]表示 a 到 d 都可以,如 hallo,hbllo
*: 表示查询所有的key值
注意事项:keys命令的时间复杂度是O(N),在生产环境中,禁止使用 keys *
因为生产环境上的key非常多,而redis是一个单线程的服务器,执行keys * 的时间非常长,就使得redis服务器被阻塞,无法给其他客户提供服务
一旦redis被阻塞,其他请求就会发送的数据库了,容易把数据库搞崩,这就相当于把系统给搞崩一大半了
所以:禁止使用 keys * (十颗星级别重要 * * * * * * * * * *)
2.exists
exists key
功能:判断 key 是否存在,返回 key 存在的个数
时间复杂度:O(1),因为redis是按照哈希表的方式来组织的
exists key1 key2 key3 表式一次查询key1 key2 key3 三个key 这行命令比拆分成三天语句要快 因为此条语句只需要一次访问服务器,而拆分成三行语句,需要访问三次服务器,增加了开销 redis客户端访问redis服务器是进行网络通信的,每一次通信都需要额外的封装和分用
封装和分用:
进行网络通信的时候,发送方发送一个数据,这个数据就要从应用层到物理层,层层封装,每一层都要加上报头或者报尾
接收方接收一个数据的时候,这个数据就要从物理层到应用层,层层分用
3.del(delete)
功能:删除指定的key,可以一次删除一个或者多个
del key [key ... ]
时间复杂度也是O(1),和 exists 一样,可以同时删除多个 key
返回值是删除的key的个数
redis 主要的应用场景之一是作为缓存
如果是把redis作为缓存
redis里面存的是一个热点数据,全量数据在Mysql中,此时如果把redis里面的key删除了几个,影响是不大的
但是如果把redis里面的key被删了一大半,此时大部分的请求就直接发生到Mysql了,容易把Mysql数据库搞崩溃
相比之下,如果是Mysql中的数据,那怕删除一个,影响都是很大的
如果是把redis作为数据库
如果误删数据,此时影响就很大了
如果是作为消息队列(MQ)
如果误删数据,此时需要具体问题具体分析,
总之,永远不要误删数据
4.expire
功能:给指定的 key 设置一个过期时间,单位是秒
设置的key 必须是存在的,返回1表示设置成功,返回0表示设置失败
还可以使用 pexpire key 2 来设置,key的存活时间是2毫秒,单位是毫秒
key的存活时间超过这个指定的值,就会被自动删除
比如:手机验证码
-
该验证码5分钟内有效,可以基于redis使用
-
点外卖,优惠券:在指定时间之内有效
-
基于 redis 实现分布式锁,为了避免出现不能正确解锁的情况,通常会在加锁的时候设置一下过期时间(所谓使用redis作为分布式锁,就是在redis里面写一个特殊的 key value,过期自动删除即可)
5.ttl
功能:查询过期时间,time to live
IP数据报的报头也有TTL字段,不过这里的TTL表示的是次数,IP数据报每通过一个路由器,TTL的数值减一,减为0时,丢弃此数据报
ttl key
表示剩余的过期时间,单位是秒
返回的是剩余的描述,返回-1表示没有关联过期时间,返回-2表示当前key已过期
6.redis的key的过期策略
一个redis中可能同时存在很多key,这些key中可能有很大一部分有自己的过期时间,那么redis是怎么知道那个key到过期时间了呢
删除策略:
-
定期删除:每次抽取一部分进行验证过期时间,保证抽取检查的过程足够快,因为redis是单线程程序,所以导致正常处理请求的命令被阻塞了,所以需要定期删除key的速度足够快
-
惰性删除:假设这个key已经到了过期时间了,但是key暂时还存在,但是紧接着后面又一次访问,正好用到了这个key,这次访问就会让redis服务器删除这个key,同时返回一个nil
但redis的过期策略又会留存一些过期的key,所以redis还提供了一系列的内存淘汰策略
7.定时器--redis并没有这样实现
在某个时间到达之后,执行指定的任务
-
基于优先级队列/堆
-
基于时间轮实现的定时器
8.type
返回 key 对应的 value 对应的数据类型
none、string、list、set、zset、hash、stream
在redis中,上述类型操作的方式差别很大,使用的指令完全不同
时间复杂度是O(1)
9.小结
keys:用来查看匹配规则的key
exists:用来判定指定key是否存在
del:删除指定的key
expire:给key设置过期时间
ttl:查询key的过期时间
type:查询key对应的value类型