
🌈 个人主页:Zfox_
🔥 系列专栏:Redis

🔥 安装 Redis
- 使⽤apt安装
apt install redis -y
- ⽀持远程连接
- 修改
/etc/redis/redis.conf
- 修改
bind 127.0.0.1
为bind 0.0.0.0
- 修改
protected-mode yes
为protected-mode no
- 修改
- 控制
Redis
启动
- 启动
Redis
服务
service redis-server start
- 停⽌
Redis
服务
service redis-server stop
- 重启
Redis
服务
service redis-server restart
- 查看
Redis
服务状态
service redis-server status
- 持久化⽂件存储⽬录
/var/lib/redis/
Redis持久化⽣产的RDB和AOF⽂件都默认⽣成于该⽬录下。后边章节我们讲到持久化时会观察这边持久化的⼀些现象。
- ⽇志⽂件⽬录
/var/log/redis/
/var/log/redis/⽬录下会保存Redis运⾏期间⽣产的⽇志⽂件,默认按照天进⾏分割,并且会将⼀定⽇期的⽇⼦⽂件使⽤gzip格式压缩保存。可以使⽤任意⽂本编辑器打开,后边章节我们会通过⽇志来观察⼀些现象。
🔥 Redis命令⾏客户端
🐳 现在我们已经启动了Redis服务,下⾯将介绍如何使⽤ redis-cli
连接、操作Redis服务。
redis-cli
可以使⽤两种⽅式连接Redis服务器。
- 第⼀种是交互式⽅式:通过
redis-cli-h{host}-p{port}
的⽅式连接到Redis
服务,后续所有的操作都是通过交互式的⽅式实现,不需要再执⾏redis-cli
了,例如:
[root@host ~]# redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set key hello
OK
127.0.0.1:6379> get key
"hello"
- 第⼆种是命令⽅式:⽤
redis-cli-h{host}-p{port}{command}
就可以直接得到命令的返回结果,例如:
[root@host ~]# redis-cli -h 127.0.0.1 -p 6379 ping
PONG
[root@host ~]# redis-cli -h 127.0.0.1 -p 6379 set key hello
OK
[root@host ~]# redis-cli -h 127.0.0.1 -p 6379 get key
"hello"
这⾥有两点要注意:
1)由于我们连接的Redis
服务位于127.0.0.1,端⼝也使⽤的是默认的6379端⼝,所以可以省略-h{host}-p{port}
2)Redis
是学习Redis的重要⼯具,后续的⼤量章节都是⽤它来做讲解。
有关redis-cli
提供的更为强⼤的功能将在后续章节做详细介绍。
图Redis
客⼾端与服务端的交互过程
🔥 Redis 常用命令
本篇开始对于 Redis 的命令进行学习,当然只是学习一些常见的
🦋 get 和 set
🦈 Redis
中是使用键值对来进行存储的,所以 get 是根据 key 来取 Value 的,而 set 是来设置键值对的
set \colorbox{pink}{ set } set
set [key] [value]
127.0.0.1:6379> set key1 value1
OK
127.0.0.1:6379> set key3 value3
OK
127.0.0.1:6379> set 'key2' "value2"
OK
get \colorbox{pink}{ get } get
get [key]
127.0.0.1:6379> get key1
"value1"
127.0.0.1:6379> get key2
"value2"
127.0.0.1:6379> get key3
"value3"
127.0.0.1:6379> get key100
(nil)
🦋 Redis 全局命令
keys
Redis
可以看成是一个网络版本的哈希表,它支持很多的数据结构,key 固定是字符串,但是 Value可以是多种多样的数据结构,下面讲述的就是全局命令,可以搭配各种各样的数据结构
keys [pattern]
该命令可以看到的是每一个 key 的模样,同时也可以允许存在通配符等
时间复杂度:O(N)
pattern 是什么?
表示的意思是,一个包含特殊符号的字符串,存在的意义是来描述,找的字符串是什么样子的
h?llo
匹配 hello , hallo 和 hxlloh*llo
匹配 hllo 和 heeeelloh[ae]llo
匹配 hello 和 hallo 但不匹配 hilloh[^e]llo
匹配 hallo , hbllo , … 但不匹配 helloh[a-b]llo
匹配 hallo 和 hbllo
先插入几个键值对:
127.0.0.1:6379> set hello 1
OK
127.0.0.1:6379> set hallo 2
OK
127.0.0.1:6379> set hbllo 3
OK
127.0.0.1:6379> set hllo 4
OK
127.0.0.1:6379> set heeeeeeeeeeeeelo 5
OK
?匹配的是任意一个字符
127.0.0.1:6379> keys h?llo
1) "hallo"
2) "hello"
3) "hbllo"
- 匹配的是0个或者任意字符
127.0.0.1:6379> keys h*llo
1) "hllo"
2) "hallo"
3) "hello"
4) "hbllo"
[abcde]表示匹配这里面的某个选项
127.0.0.1:6379> keys h[abc]llo
1) "hallo"
2) "hbllo"
[^e] 表示排除e,除了e都行
127.0.0.1:6379> keys h[^a]llo
1) "hello"
2) "hbllo"
[a-b] 表示的是a-b范围内的字符都行
127.0.0.1:6379> keys h[a-b]llo
1) "hallo"
2) "hbllo"
注意事项
keys 命令的时间复杂度是O(N),所以一般会禁止使用keys,尤其是keys *
127.0.0.1:6379> keys *
1) "hllo"
2) "heeeeeeeeeeeeelo"
3) "hallo"
4) "hello"
5) "key1"
6) "key3"
7) "hbllo"
8) "key2"
Redis 是单线程的,所以当执行 keys 的时候可能会导致阻塞,这是一件不可容忍的事,因此一般禁止
Redis 经常会用于做缓存,挡在 mysql 前面,替 mysql 负重前行的人,万一 Redis 被一个 keys*阻塞住了,此时其他的查询 Redis 操作就超时了此时这些请求就会直接查数据库,突然一大波请求过来了, mysql 措手不及,就容易挂了,整个系统就基本瘫痪了
EXISTS
exists key [key ...]
127.0.0.1:6379> keys *
1) "hllo"
2) "heeeeeeeeeeeeelo"
3) "hallo"
4) "hello"
5) "key1"
6) "key3"
7) "hbllo"
8) "key2"127.0.0.1:6379> exists hello hallo
(integer) 2
那为什么要这样进行一次请求多个呢?这是考虑到了网络服务,Redis 和 HTTP 的请求响应机制是一样的,这就意味着如果每次都请求,会消耗一定的网络资源,但是如果采用一次去检查多个的情况(减少网络通信的次数),就不会这样,相当于会节省一部分的网络资源
DEL
删除指定 key
DEL key [key ...]
这个命令相对比较简单,这里就不再进行赘述了,就是一个删除的命令
127.0.0.1:6379> keys *
1) "hllo"
2) "heeeeeeeeeeeeelo"
3) "hallo"
4) "hello"
5) "key1"
6) "key3"
7) "hbllo"
8) "key2"127.0.0.1:6379> del hllo hallo
(integer) 2127.0.0.1:6379> keys *
1) "heeeeeeeeeeeeelo"
2) "hello"
3) "key1"
4) "key3"
5) "hbllo"
6) "key2"
这里值得注意的是,Redis 数据被删除,要看它是否是一个数据库,如果它作为缓存,那问题不算特别大,但是如果是作为数据库,那就相当于在 MySQL 中丢失了数据,这就是一个比较严重的错误了
针对于 Redis 的误删数据的错误,要根据具体情况具体分析
EXPIRE
expire 的作用是给指定的 key 设置过期时间,key 存活时间超过这个指定的值,就会被自动删除
expire key seconds
返回值:1表示设置成功。0表示设置失败
要注意的是,expire 的 key 值,必须得是已经存在的 key 值,如果不是存在的 key 值是不可以被设置过期时间的
127.0.0.1:6379> keys *
1) "heeeeeeeeeeeeelo"
2) "hello"
3) "key1"
4) "key3"
5) "hbllo"
6) "key2"127.0.0.1:6379> expire key2 3
(integer) 1127.0.0.1:6379> keys *
1) "heeeeeeeeeeeeelo"
2) "hello"
3) "key1"
4) "key3"
5) "hbllo"
6) "key2"127.0.0.1:6379> expire key2 3
(integer) 0127.0.0.1:6379> keys *
1) "heeeeeeeeeeeeelo"
2) "hello"
3) "key1"
4) "key3"
5) "hbllo"
TTL
查询过期时间的命令叫做 ttl,全称是 time to live
TTL key
返回值:剩余过期时间。-1表⽰没有关联过期时间,-2表⽰key不存在。
redis> SET mykey "Hello"
"OK"
redis> EXPIRE mykey 10
(integer) 1
redis> TTL mykey
(integer) 10
EXPIRE和TTL命令都有对应的⽀持毫秒为单位的版本:PEXPIRE和PTTL,详细⽤法就不再介绍了。
键的过期机制
🦋 Redis 的删除策略
对于删除来说,到底该选用哪种策略呢?下面给出两种策略
- 先说一下 「惰性删除」:
假设现在这个
key
已经到达过期时间了,但是暂时还没删除它,key
还是存在的,当下一次进行访问的时候,正好用到了这个key
,此时就会让Redis
触发删除的操作,并且返回一个nil
- 下面说一下「定期删除」:
定期删除,就是在一个定期时间内进行检测,但是定期删除是要有一定条件的,原因在于
Redis
是一个单线程的程序,如果扫描key
的时间太多,就会导致被阻塞,形成的效果和keys *
差不多
TYPE
返回key对应的 value 数据类型。
TYPE key
返回值: none , string , list , set , zset , hash and stream
redis> SET key1 "value"
"OK"
redis> LPUSH key2 "value"
(integer) 1
redis> SADD key3 "value"
(integer) 1
redis> TYPE key1
"string"
redis> TYPE key2
"list"
redis> TYPE key3
"set"
本⼩结只是抛砖引⽟,给出⼏个通⽤的命令,为5种数据结构的使⽤做⼀个热⾝,后续章节将对键管理做⼀个更为详细的介绍。
🔥 共勉
😋 以上就是我对 Redis:安装与常用命令
的理解, 觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~ 😉