《网络安全》- 3.1 - Redis数据库详细教程

「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者
「订阅专栏」:此文章已录入专栏《网络安全入门到精通》

Redis

  • 一、下载安装
  • 二、配置
    • 1、远程连接
    • 2、保护模式
    • 3、默认密码
    • 4、后台运行
      • 4.1 验证服务是否启动
      • 4.2 停止服务
  • 三、操作命令
    • 1、连接命令行
    • 2、数据类型
    • 3、字符串(String)
      • set 创建
      • mset 创建多个
      • setex 创建并设置时效
      • get 获取
      • mget 获取多个
      • incr 自增
      • incrby 自增指定步长
      • decr 自减
      • decrby 自减指定步长
    • 4、通用操作
      • exists 验证
      • del 删除
      • keys 查询
      • exists 检查是否存在
      • expire 设置时效
      • ttl 查看有效期
      • persist 移除有效期
      • select 切换数据库
      • move 移动数据
      • type 显示类型
      • dbsize 获取数量
      • flushdb 清空数据
      • flushall 清空服务器
      • shutdown 关闭
    • 5、哈希(Hash)
      • hset 创建
      • hmset 创建
      • hget 获取
      • hmget 获取多个
      • hgetall 获取所有
      • hkeys 获取所有键
      • hlen 获取长度
      • hdel 删除键
      • hexists 验证
    • 6、列表(List)
      • lpush 创建/添加
      • lpushx 添加
      • rpush 创建/添加
      • rpushx 添加
      • lrange 获取
      • lindex 获取
      • llen 获取长度
      • lset 修改
      • lpop 删除
      • rpop 删除
      • ltrim 删除
    • 7、集合(Set)
      • sadd 创建/添加
      • smembers 获取
      • scard 获取长度
      • srem 删除
  • 四、Redis持久化
    • RDB
      • 1、自动保存
      • 2、手动保存
      • 3、压缩存储
    • AOF
      • 1、开启AOF
      • 2、同步策略
    • RDB和AOF的区别?

一、下载安装

1)到Redis中文网 https://www.redis.com.cn/download.html 下载Redis安装包

《网络安全》- 3.1 - Redis数据库详细教程_第1张图片

2)Redis的安装脚本基于C语言,需要先安装C语言的编译器

yum install gcc -y

预计10分钟左右,出现以下结果表示安装成功。

《网络安全》- 3.1 - Redis数据库详细教程_第2张图片

3)将安装包传到Linux并解压

tar -axvf redis-unstable.tar.gz

解压后,进入Redis安装目录

cd redis-unstabl

4)编译

make

编译时如果出现以下错误,就添加参数 make MALLOC=libc

《网络安全》- 3.1 - Redis数据库详细教程_第3张图片

出现以下界面,表示编译完成。

《网络安全》- 3.1 - Redis数据库详细教程_第4张图片

5)安装

make install

《网络安全》- 3.1 - Redis数据库详细教程_第5张图片

6)运行Redis服务

进出 Redis 的服务目录

cd /usr/local/bin/

运行服务脚本,并指定Redis的配置文件(配置文件在Redis的安装目录下,根据实际情况填写路径)

 ./redis-server /root/redis-unstable/redis.conf

出现这个界面,表示Redis服务启动成功。

《网络安全》- 3.1 - Redis数据库详细教程_第6张图片


二、配置

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 | grep 6379

下面这种情况,表示端口被监听,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) 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 自增指定步长

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) 12
127.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> exists 111
(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> keys 111
(empty array)

exists 检查是否存在

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 设置时效

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> select 1
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) 1
127.0.0.1:6379> select 1
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> shutdown
not 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) 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 创建

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 of value

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-1
1) "name"
2) "ZhangSan"
3) "age"
4) "18"

hkeys 获取所有键

hkeys命令可以获取哈希类型数据的所有键。

比如:获取用户(user-1)的所有键

127.0.0.1:6379> hkeys user-1
1) "name"
2) "age"

hlen 获取长度

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 删除键

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 验证

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

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 17 18 19
(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 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 获取

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 -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"

7、集合(Set)

集合的一个键可以存储多个值,数据的存储格式为 key:{value1,value2,…}。

与列表不同的是,集合存储的值不允许重复,而列表的值可以重复。


sadd 创建/添加

sadd命令可以向集合中添加元素,如果集合不存在,则会创建集合。

127.0.0.1:6379> sadd ids 001 002 003
(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) 1
127.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 60 2

《网络安全》- 3.1 - Redis数据库详细教程_第7张图片

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

《网络安全》- 3.1 - Redis数据库详细教程_第8张图片

开启后(重启服务生效),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 always
   1446 appendfsync everysec
   1447 # appendfsync no

RDB和AOF的区别?

RDB是全量备份,备份的速度慢、且资源消耗大;AOF只存储操作指令,备份的速度快、且资源消耗小。

RDB直接从备份文件中恢复数据,恢复速度快;AOF需要重新执行一遍操作指令,恢复速度慢。

RDB每隔一段时间备份一次数据,安全性较低;AOF支持实时备份,安全性较高。

你可能感兴趣的:(《网络安全入门到精通》,redis,web安全,网络安全)