「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者
「订阅专栏」:此文章已录入专栏《网络安全入门到精通》
1)到Redis中文网 https://www.redis.com.cn/download.html
下载Redis安装包
2)Redis的安装脚本基于C语言,需要先安装C语言的编译器
yum install gcc -y
预计10分钟左右,出现以下结果表示安装成功。
3)将安装包传到Linux并解压
tar -axvf redis-unstable.tar.gz
解压后,进入Redis安装目录
cd redis-unstabl
4)编译
make
编译时如果出现以下错误,就添加参数 make MALLOC=libc
出现以下界面,表示编译完成。
5)安装
make install
6)运行Redis服务
进出 Redis 的服务目录
cd /usr/local/bin/
运行服务脚本,并指定Redis的配置文件(配置文件在Redis的安装目录下,根据实际情况填写路径)
./redis-server /root/redis-unstable/redis.conf
出现这个界面,表示Redis服务启动成功。
Redis默认不允许远程连接,bind 127.0.0.1 -::1 表示只允许本地连接。
将这行注释掉,就可以远程连接;或者把IP改成指定主机,允许指定主机远程连接。
87 #bind 127.0.0.1 -::1
Redis默认开启保护模式,protected-mode 处配置保护模式,yes表示开启,no表示关闭。
关闭时,可以远程连接,但不推荐关闭。
111 protected-mode yes
Redis默认没有密码,requirepass 处设置默认密码。
去掉注释,并在 requirepass 后面输入密码,设置默认密码后,再次连接,就需要输入密码。
1043 requirepass 123456
Redis默认在前台运行,会占用页面,导致无法使用;daemnize 处设置前/后台运行。
后台运行实际上是作为守护进程运行,yes表示开启,no表示关闭。
设置成 daemonize yes 后,Redis将在后台运行,不再占用页面。
309 daemonize yes
修改配置后,再次启动Redis服务,页面不再配占用。
后台运行时,无法判断服务是否启动,可以通过进程和端口监听状态来验证。
1)查看 redis 进程是否运行
ps -ef | grep redis
下面这种情况,表示 redis-server在运行,Redis服务启动。
2)查看 Redis 的默认端口 6379 是否被监听
netstat -ano | grep 6379
下面这种情况,表示端口被监听,Redis服务启动。
杀掉 redis-server 进程,即可停止Redis服务。
Redis使用自带的 redis-cli 工具链接命令行,链接前需要保证redis服务启动。
cd /usr/local/bin/
./redis-cli
出现下面这种 IP:6379 的命令行,则表示成功进入Redis的命令行。
下面这种表示连接失败,可能是redis服务没有启动或者网络不可达。
如果你设置了默认密码,就可以使用密码登录,下面这种情况表示密码正确。
如果提示 AUTH failed,就表示密码错误,这样即使进去了命令行,很多命令也不能执行
exit 可以退出这种命令行。
Redis有5种数据类型,用来存储不同的数据。
Redis中,数值和字符都用字符串类型存储,数据以键值对( key:vallue) 形式存储。
set命令用来创建字符串数据。
创建一个用户数据,键名是"name",值是"ZhangSan"。
127.0.0.1:6379> set name ZhangSan
OK
如果被创建的key已经存在,则会覆盖原有的值,覆盖时无视数据类型。
127.0.0.1:6379> set name ZhangSan
OK
127.0.0.1:6379> get name
"ZhangSan"
127.0.0.1:6379> set name LiSi
OK
127.0.0.1:6379> get name
"LiSi"
set命令一次只能创建一个字符串,mset命令可以一次创建多个字符串。如果key已经存在,则会覆盖。
127.0.0.1:6379[1]> set name zhangsan age 18
(error) ERR syntax error
127.0.0.1:6379[1]> mset name ZhangSan age 18
OK
setex命令可以在创建数据的同时设置有效期,相当于 set + expire 的简写。
创建一个数据,键名是 “name1”,值是 “LiSi”,有效期是 10
127.0.0.1:6379> setex name1 10 LiSi
OK
127.0.0.1:6379> ttl name1
(integer) 4
get命令用来获取字符串的值。
根据刚才创建的键 “name”,获取它的值
127.0.0.1:6379> get name
"ZhangSan"
返回 (nil),表示键不存在。
127.0.0.1:6379> get 111
(nil)
get命令一次只能获取一个字符串的值,mget命令可以一次获取多个字符串的值。键不存在时,则返回nil。
127.0.0.1:6379[1]> get name age
(error) ERR wrong number of arguments for 'get' command
127.0.0.1:6379[1]> mget name age
1) "ZhangSan"
2) "18"
incr命令可以使值自增1,常用于阅读数增加等场景。
incr自增后,会返回自增后的值
127.0.0.1:6379> set count 11
OK
127.0.0.1:6379> incr count
(integer) 12
127.0.0.1:6379> incr count
(integer) 13
incr只能用于数字,用在字符类型时会报错。
127.0.0.1:6379> get name
"zhangsan"
127.0.0.1:6379> incr name
(error) ERR value is not an integer or out of range
incrby命令可以使值自增指定的步长,常用于特殊场景,比如会员阅读时增加2次阅读数。
让count的值自增2
127.0.0.1:6379> get count
"15"
127.0.0.1:6379> incrby count 2
(integer) 17
incrby同样会返回自增后的值,并且只能用于数字,不能用户字符串。
decr命令可以使值自减1,与incr相反。
decr自减后,会返回自减后的值
127.0.0.1:6379> get count
"13"
127.0.0.1:6379> decr count
(integer) 12
127.0.0.1:6379> decr count
(integer) 11
decr同样只能用于数字,用在字符类型时会报错。
decrby命令可以使值自减指定的步长,与incrby相反。
127.0.0.1:6379[1]> get age
"76"
127.0.0.1:6379[1]> decrby age 10
(integer) 66
decrby也会返回自增后的值,并且只能用于数字,字符类型会报错。
Redis中的很多命令只能用于指定类型,比如get只能用于字符串类型,用于其他类型时会报错。
但也有很多命令是各种数据类型通用的,比如下面这些:
exists命令用来验证键是否存在。
返回 (integer) 1,表示存在。
127.0.0.1:6379> exists name
(integer) 1
返回 (integer) 0,表示不存在。
127.0.0.1:6379> exists 111
(integer) 0
del命令用来删除数据,通常会根据键名来删除键值对。
返回 (integer) 1,表示删除成功
127.0.0.1:6379> del name
(integer) 1
返回 (integer) 0,表示删除失败,原因通常是键名不存在(删除的key不存在时,不会报错)。
127.0.0.1:6379> del 111
(integer) 0
同时删除多个key(根据键名),使用空格间隔多个键名,结果中返回删除的key的个数。
127.0.0.1:6379> del name ages
(integer) 2
keys命令用来查询Redis中的数据,只显示键名,而不显示值。
keys * # 查询所有数据
keys *a # 查询以a结尾的数据
keys a* # 查询以a开头的数据
keys name # 查询指定键名是否存在
返回 (empty array) ,表示查询的键名不存在。
127.0.0.1:6379> keys 111
(empty array)
exists命令可以检查key是否存在。
key存在,则返回 1 ;key不存在,则返回 0 。
127.0.0.1:6379> exists names
(integer) 1
127.0.0.1:6379> exists 111
(integer) 0
expire命令用来设置数据的有效期,单位是秒,有效期结束后,数据将会消失,常用于验证码等过期场景。
将键名为"name"的数据,有效期设置为10秒。
返回 (integer) 1,表示设置成功。
127.0.0.1:6379> expire name 10
(integer) 1
返回 (integer) 0,表示设置失败,原因可能是键名不存在。
127.0.0.1:6379> expire qqq 10
(integer) 0
ttl命令用来查看数据的有效期,单位是秒。
返回 (integer) -1,表示永久有效。
127.0.0.1:6379> ttl name
(integer) -1
返回 (integer) -2,表示已失效,或键名压根就不存在。
127.0.0.1:6379> ttl name
(integer) -2
返回其他数值,表示剩余的有效期。
persist命令用来取消expire的有效期限制,使数据永久有效。
返回 (integer) 1,表示移除成功。
127.0.0.1:6379> persist name
(integer) 1
返回 (integer) 0,表示移除失败,原因可能是数据已经失效或数据原本就不存在。
127.0.0.1:6379> persist name
(integer) 0
Redis默认有16个数据库,名字分别是0~15,登录时默认使用第0个数据库。
select命令用来切换数据库,数据库的名字会显示在后面的方括号里面。但第0个数据库不会显示。
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys *
(empty array)
127.0.0.1:6379[1]>
move命令可以将数据移动到另一个数据库中。
返回 (integer) 1,表示移动成功;返回 (integer) 0,表示移动失败。
127.0.0.1:6379> keys name
1) "name"
127.0.0.1:6379> move name 1
(integer) 1
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys name
1) "name"
type命令可以根据键名返回数据的类型。
127.0.0.1:6379[1]> type name
string
dbsize命令可以获取当前数据库中key的数量。
127.0.0.1:6379> dbsize
(integer) 5
flushdb命令可以清空当前数据库的数据,本质上是删除所有key。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> keys *
(empty array)
flushall命令可以清空整个redis服务器的数据。
127.0.0.1:6379> flushall
OK
shutdown命令用来关闭redis服务器。
127.0.0.1:6379> shutdown
not connected> exit
关闭后,redis服务将被结束。
哈希类型常用来保存用户信息这种对象类型的数据,它的值是键值对结构的。
key:{“key1:value1”,“key2:value2”,…}
创建一个哈希类型的数据,可以理解为,在MySQL中创建了一张表。
hset命令用来创建哈希类型的数据,如果key已经存在,则会覆盖。
比如:创建一个用户(user-1)的数据,用户的名字(name)是张三,用户的年龄(age)是18
127.0.0.1:6379> hset user-1 name ZhangSan
(integer) 1
127.0.0.1:6379> hset user-1 age 18
(integer) 1
再创建第一个用户(user-2)的数据,用户的名字(name)是李四,用户的年龄(age)是19
127.0.0.1:6379> hset user-2 name LiSi
(integer) 1
127.0.0.1:6379> hset user-2 age 19
(integer) 1
hmset命令可以在创建哈希类型数据时,同时创建多个键(hset一次只能创建一个键)
比如:创建第三个用户(user-3)的数据,用户的名字(name)是王五,用户的年龄(age)是17
127.0.0.1:6379> hmset user-3 name WangWu age 17
OK
hget命令用来获取哈希类型的数据。
比如:获取第一个用户(user-1)的名字,获取第二个用户(user-2)的名字
127.0.0.1:6379> hget user-1 name
"ZhangSan"
127.0.0.1:6379> hget user-2 name
"LiSi"
hget只能每次只能获取哈希类型数据的一个字段,而不能获取整个数据。
127.0.0.1:6379> get user-1
(error) WRONGTYPE Operation against a key holding the wrong kind of value
hmget命令可以一次获取多个哈希数据的key的值
127.0.0.1:6379> hmget user-3 name age
1) "WangWu"
2) "17"
hgetall命令可以获取哈希类型的整个数据。
127.0.0.1:6379> hgetall user-1
1) "name"
2) "ZhangSan"
3) "age"
4) "18"
hkeys命令可以获取哈希类型数据的所有键。
比如:获取用户(user-1)的所有键
127.0.0.1:6379> hkeys user-1
1) "name"
2) "age"
hlen命令可以获取哈希类型数据中,key的个数。
比如:这个哈希类型的数据中有两个key,结果就返回2。
127.0.0.1:6379> hkeys user-3
1) "name"
2) "age"
127.0.0.1:6379> hlen user-3
(integer) 2
hdel命令可以删除哈希类型数据的键,删除成功返回 (integer) 1,失败返回 (integer) 0 。
比如:删除第一个用户(user-1)的名字(name)
127.0.0.1:6379> hkeys user-1
1) "name"
2) "age"
127.0.0.1:6379> hdel user-1 name
(integer) 1
127.0.0.1:6379> hkeys user-1
1) "age"
同时删除多个键,返回删除的键的数量,不存在的键将被跳过。
127.0.0.1:6379> hkeys user-2
1) "age"
2) "name"
127.0.0.1:6379> hdel user-2 name age
(integer) 2
127.0.0.1:6379> hkeys user-2
(empty array)
hexists命令可以验证哈希类型数据的某个键是否存在,存在返回1,不存在返回0.
exists只能验证哈希类型的数据是否存在,而不能验证哈希类型数据里的某个值。
127.0.0.1:6379> hkeys user-1
1) "age"
127.0.0.1:6379> exists user-1 name
(integer) 1
127.0.0.1:6379> hexists user-1 name
(integer) 0
列表的一个键可以存储多个值,数据的存储格式为 key:{value1,value2,…}
常用来存储属性相同的数据,比如所有用户名用一个列表存储,所有用户的年龄用一个列表存储。
lpush命令可以往列表中添加值,如果列表不存在,则会创建列表。
比如:创建一个列表(names),并往列表中添加三个值(ZhangSan Lisi WangWu)
127.0.0.1:6379> lpush names ZhangSan Lisi WangWu
(integer) 3
lpush会从列表的左侧开始添加值,每次可以添加一个或多个。
lpushx命令可以往列表中添加值,与lpush不同的是,如果列表不存在时,则什么都不做。
比如:向列表(names)中,添加一个值(ZhaoLiu)
127.0.0.1:6379> lpushx names ZhaoLiu
(integer) 4
lpushx同样从左侧开始添加值,每次可以添加一个或多个。
rpush命令可以往列表中添加值,如果列表不存在,则会创建列表。
比如:创建一个列表(ages),并往列表中添加三个值(17 18 19)
127.0.0.1:6379> rpush ages 17 18 19
(integer) 3
与 lpush 不同的是,rpush 会从列表右侧开始添加值,每次同样可以添加一个或多个。
rpushx命令可以往列表中添加值,与rpush不同的是,如果列表不存在时,则什么都不做。
127.0.0.1:6379> rpushx names XiaoMing
(integer) 5
rpushx同样从右侧开始添加值,每次可以添加一个或多个。
lrange命令用来查看列表中的值,使用时必须指定查看的区间,也就是开始位置和结束位置,位置从0开始。
比如:查看列表(names)第0~2个值。
127.0.0.1:6379> lrange names 0 2
1) "ZhaoLiu"
2) "WangWu"
3) "Lisi"
位置可以使用负数,比如-1就代表最后一个值,0~-1就代表查看列表所有的值。
127.0.0.1:6379> lrange names 0 -1
1) "ZhaoLiu"
2) "WangWu"
3) "Lisi"
4) "ZhangSan"
lindex命令可以根据位置(索引)获取列表的值,位置(索引)从0开始。
比如:获取列表中的第1个值的内容。
127.0.0.1:6379> lindex names 1
"ZhaoSi"
llen命令可以获取列表的长度,也就是列表中值的个数。
比如:获取列表(names)的长度。
127.0.0.1:6379> llen names
(integer) 4
lset命令可以根据位置(下标)修改列表中的值。
比如:将列表的第1个值,修改为ZhaoSi。
127.0.0.1:6379> lset names 1 ZhaoSi
OK
lpop命令从列表的左侧开始删除值,并返回被删除的值的内容。
127.0.0.1:6379> lpop names
"ZhaoLiu"
rpop命令从列表的右侧开始删除值,并返回被删除的值的内容。
127.0.0.1:6379> rpop names
"XiaoMing"
ltrim命令可以删除指定区间外的所有值,区间需要指定开始位置和结束位置,位置从0开始。
127.0.0.1:6379> lrange names 0 -1
1) "ZhaoSi"
2) "Lisi"
3) "ZhangSan"
127.0.0.1:6379> ltrim names 1 2
OK
127.0.0.1:6379> lrange names 0 -1
1) "Lisi"
2) "ZhangSan"
集合的一个键可以存储多个值,数据的存储格式为 key:{value1,value2,…}。
与列表不同的是,集合存储的值不允许重复,而列表的值可以重复。
sadd命令可以向集合中添加元素,如果集合不存在,则会创建集合。
127.0.0.1:6379> sadd ids 001 002 003
(integer) 3
一次可以添加一个或多个元素,如果添加的元素重复,则会添加失败。
smembers命令可以获取集合中的所有元素,集合不存在时不会报错,而是返回空。
127.0.0.1:6379> smembers ids
1) "001"
2) "002"
3) "003"
scard命令可以获取集合的长度,也就是返回集合中的元素个数。
127.0.0.1:6379> scard ids
(integer) 3
如果集合不存在或集合为空,则返回 0 。
srem命令可以根据内容删除集合中的值,删除成功返回1,删除失败返回0。
127.0.0.1:6379> smembers ids
1) "001"
2) "002"
3) "003"
127.0.0.1:6379> srem ids 001
(integer) 1
127.0.0.1:6379> smembers ids
1) "002"
2) "003"
Redis在内存中操作数据,断电以后数据就会丢失。为了防止数据丢失,保证数据安全,Redis会将数据永久性的保存在存储介质上,以便恢复数据。这就是我们常说的Redis持久化。
Redis提供了两套持久化的方案,可供用户自由选择(默认使用RDB):
RDB基于快照的思想持久化数据。本质上是将数据库中的所有数据都写到/usr/local/bin/dump.rdb
文件中,以二进制的形式保存。
[root]# cat /usr/local/bin/dump.rdb
REDIS0011 redis-ver
255.255.255
redis-bitseë
used-memÀaof-base~mzhangsanÿ%hO
RDB的配置,在redis.conf 文件中配置,这个配置文件默认放在Redis安装包的解压目录下。
/root/redis-unstable/redis.conf
其中,save 字段用来配置RDB,格式为:save 时间 操作次数。
比如 save 60 2,就表示:60秒内,有2次(增/删/改)操作,就自动备份一次。
439 save 60 2
save命令可以手动保存当前数据,保存过程中,命令行将不可用。
127.0.0.1:6379> save
OK
bgsave命令可以在后台保存当前数据,不占用当前命令行。
127.0.0.1:6379> bgsave
Background saving started
RDB的自动持久化,实际上就是调用了bgsave命令。
Redis在使用RDB持久化时,默认会压缩数据,以节省磁盘空间,同时,这也会消耗更多的CPU。
rdbcompression
字段可以设置是否压缩,yes表示开启,no表示关闭。
460 rdbcompression yes
AOF(Append Only File)基于日志存储的思想持久化数据。本质上是记录所有的(增/删/改)操作指令,重启Redis服务时,重新执行一遍这些指令。
Redis默认关闭AOF持久化,AOF和RDB可以同时启用,同时启用时,Redis优先使用AOF恢复数据。
AOF的配置,在 redis.conf 文件中配置,这个配置文件默认放在Redis安装包的解压目录下。
/root/redis-unstable/redis.conf
appendonly字段,用来控制AOF的开启和关闭,yes表示开启,no表示关闭。
1387 appendonly yes
开启后(重启服务生效),AOF会将操作指令记录到appendonlydir目录中(不同版本的记录方式不一样)。
[rootr]# cd /usr/local/bin/appendonlydir/
[root]# ls
appendonly.aof.1.base.rdb appendonly.aof.1.incr.aof appendonly.aof.manifest
AOF提供了三种同步策略:
AOF的同步策略,由redis.conf文件的 appendfsync 字段控制。
1445 # appendfsync always
1446 appendfsync everysec
1447 # appendfsync no
RDB是全量备份,备份的速度慢、且资源消耗大;AOF只存储操作指令,备份的速度快、且资源消耗小。
RDB直接从备份文件中恢复数据,恢复速度快;AOF需要重新执行一遍操作指令,恢复速度慢。
RDB每隔一段时间备份一次数据,安全性较低;AOF支持实时备份,安全性较高。