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