目录
关系型数据库与非关系型数据库
关系型数据库
非关系型数据库
非关系型数据库存在的原因
Redis
概念
优点
Redis部署流程
初步设置
安装
初始化
初始化时指定的参数说明
Redis配置文件
修改监听地址
Redis远程连接
远程连接
测试服务端状态
redis-benchmark测试工具
测试请求性能
测试读写性能
set 与 lpush 操作性能
Redis常用命令
创建键值对
get
keys
exists
del
type
rename
renamenx
dbsize
数据库操作
多数据库间切换
多数据库间移动数据
清除数据库内数据
Redis持久化
概念
分类
RDB
AOF
二者选择的标准
Redis 持久化配置
RDB
AOF
AOF重写
性能管理
回收策略
关系型数据库与非关系型数据库
关系型数据库
- 一个结构化的数据库,创建在关系模型基础上
- 一般面向于记录
- 比如:Oracle、MySQL、SQL Server、Microsoft Access、DB2等等
- 基于硬盘
非关系型数据库
- 除了主流的关系型数据库外的数据库,都认为是非关系型数据库
- 比如:Redis、MongoDB、Hbase、CouhDB等等
- 定义键值对,通过调用键去获取值
- 基于内存
- 基于C/S架构
非关系型数据库存在的原因
- High Performance:对数据库高并发读写的需求
- High Storage:对海量数据高效存储与访问的需求
- High Scalability && High Availability:对数据库高扩展性与高可用性的需求
Redis
概念
- Redis是基于内存运行的,并且支持持久化
- 采用Key-Value(键值对)的存储形式
优点
- 具有极高的数据读写速度
- 支持数据的持久化(持续存储数据)
- 支持数据备份
- 原子性
Redis部署流程
初步设置
打开两台虚拟机并连接上XShell,然后开启会话同步,再将redis的源码包导入该主机
101主机作为服务端,102主机作为客户端
为了方便实验,关闭防火墙和内核安全机制,然后安装redis所需的依赖环境
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum -y install gcc* zlib-devel
安装
解压该源码包,进入解压目录,安装,创建软链接优化命令路径
[root@localhost ~]# tar zxvf redis-4.0.9.tar.gz
[root@localhost ~]# cd redis-4.0.9
[root@localhost redis-4.0.9]# make
[root@localhost redis-4.0.9]# make PREFIX=/usr/local/redis install
[root@localhost redis-4.0.9]# ln -s /usr/local/redis/bin/* /usr/local/bin/
初始化
由于是使用源码包安装的Redis,在没经过初始化之前是不能使用的,所以这里先初始化redis
还是解压目录下,进入utils目录下,运行install_server.sh初始化脚本进行初始化
这个脚本会让你指定一些信息,全部回车用默认的就行,最后使用netstat命令可以看到redis已经在运行了,监听的IP是127.0.0.1
如果要在同一台主机上部署多个Redis实例,那么在初始化时指定的信息都要改变
实例:运行在内存上的一个进程
[root@localhost redis-4.0.9]# cd utils/
[root@localhost utils]# ./install_server.sh
[root@localhost utils]# netstat -anpt | grep redis
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 4893/redis-server 1
初始化时指定的参数说明
Selected config:
Port : 6379 # 端口号
Config file : /etc/redis/6379.conf # 配置文件路径
Log file : /var/log/redis_6379.log # 日志文件路径
Data dir : /var/lib/redis/6379 # 数据文件路径
Executable : /usr/local/bin/redis-server # 可执行文件路径
Cli Executable : /usr/local/bin/redis-cli # 客户端命令行工具
此时关闭会话同步
Redis配置文件
在101(服务端)操作
修改监听地址
在安装完redis后,通过netstat命令可以看到redis目前监听的IP是127.0.0.1,也就是本地的IP,这样是无法远程管理redis的,所以我们这里修改一下redis监听的IP地址,需要修改redis的配置文件
在第70行的参数末尾添加本机的IP地址
[root@localhost ~]# vim /etc/redis/6379.conf
bind 127.0.0.1 192.168.10.101
除此之外,在第93行还可以自定义端口号,第137行可以指定守护进程的开启和关闭
第159行指定PID文件,第167行指定日志级别,第172行指定日志文件
cd进入存放服务文件的目录下,可以看到redis在安装时已经帮我们把服务脚本放到该目录下了
可以运行该脚本并且追加参数restart来重启redis,然后使用netstat命令可以查看到redis目前有了两个进程,其中就有监听本机IP的进程
[root@localhost ~]# cd /etc/init.d/
[root@localhost init.d]# ls
redis_6379
[root@localhost init.d]# ./redis_6379 restart
[root@localhost init.d]# netstat -anpt | grep redis
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 4919/redis-server 1
tcp 0 0 192.168.10.101:6379 0.0.0.0:* LISTEN 4919/redis-server 1
Redis远程连接
远程连接
在101(服务端)操作
在安装了redis的服务端之后,也同时安装了客户端。而redis不仅可以用客户端来远程连接,也可以在本地连接本地的服务端
[root@localhost ~]# redis-cli
[root@localhost ~]# redis-cli -h 192.168.10.101 -p 6379
127.0.0.1:6379>
127.0.0.1:6379> quit
在102(客户端)操作
也可以指定IP地址来远程连接
[root@localhost ~]# redis-cli -h 192.168.10.101 -p 6379
测试服务端状态
在102(客户端)操作
redis服务端通过乒乓机制来应答客户端的ping测试
[root@localhost ~]# redis-cli -h 192.168.10.101 -p 6379
127.0.0.1:6379> ping
PONG
redis-benchmark测试工具
在101(服务端)操作
测试请求性能
- -h:指定服务器主机名;
- -p:指定服务器端口;
- -c:指定并发连接数;
- -n:指定请求数
[root@localhost ~]# redis-benchmark -h 192.168.10.101 -p 6379 -c 100 -n 100000
99.64% <= 1 milliseconds # 百分之99.94的请求小于1毫秒
100.00% <= 1 milliseconds
80971.66 requests per second # 每秒能够接收这么多请求
测试读写性能
- -d:以字节的形式指定 SET/GET 值的数据大小;
- -q:强制退出 redis。仅显示 query/sec 值;
[root@localhost ~]# redis-benchmark -h 192.168.10.101 -p 6379 -q -d 100
SET: 86058.52 requests per second # 每秒
GET: 85470.09 requests per second
set 与 lpush 操作性能
- -t:仅运行以逗号分隔的测试命令列表;
[root@localhost ~]# redis-benchmark -h 192.168.10.101 -p 6379 -t set,lpush -n 100000 -q
SET: 86281.27 requests per second
LPUSH: 87183.96 requests per second
Redis常用命令
创建键值对
使用set指令,指定键,然后输入值
127.0.0.1:6379> set k1 1
OK
127.0.0.1:6379> set num1 11
OK
127.0.0.1:6379> set num2 22
OK
127.0.0.1:6379> set num3 33
OK
get
使用get指令,根据键(Key),获取值(Value)
127.0.0.1:6379> get k1
"1"
keys
使用keys *命令查询所有键
127.0.0.1:6379> keys *
1) "num2"
2) "counter:__rand_int__"
3) "num3"
4) "num1"
5) "k1"
6) "key:__rand_int__"
7) "myset:__rand_int__"
8) "mylist"
查看当前数据库中以num开头的键
127.0.0.1:6379> keys num*
1) "num2"
2) "num3"
3) "num1"
查看当前数据库中以n开头后面包含任意3位字符的键
127.0.0.1:6379> keys n???
1) "num2"
2) "num3"
3) "num1"
exists
使用exists命令查询指定键是否存在,1表示该键存在,0表示该键不存在
127.0.0.1:6379> exists num1
(integer) 1
127.0.0.1:6379> exists num10
(integer) 0
del
del 命令可以删除当前数据库的指定 key
- 显示1表示操作成功
- 显示0表示操作失败
127.0.0.1:6379> del num3
(integer) 1
127.0.0.1:6379> del num3
(integer) 0
type
使用 type 命令可以获取 key 对应的 value 值类型
127.0.0.1:6379>type num1
string
rename
rename 命令是对已有 key 进行重命名
在实际使用过程中,建议先用 exists 命令查看目标 key 是否存在,然后再决定是否执行 rename 命令,以避免覆盖重要数据
127.0.0.1:6379>keys num*
1) "num1"
2) "num2"
127.0.0.1:6379>rename num2 num3
OK
127.0.0.1:6379>keys num*
1) "num1"
2) "num3"
renamenx
renamenx 命令的作用是对已有 key 进行重命名,并检测新名是否存在。
使用renamenx 命令进行重命名时,如果目标 key 存在则不进行重命名。
127.0.0.1:6379>keys *
(1) "num1"
127.0.0.1:6379>get num1
"11"
127.0.0.1:6379>renamenx num1 num2
(integer) 0
127.0.0.1:6379>keys *
(1) "num1"
127.0.0.1:6379>get num1
"11"
dbsize
dbsize 命令的作用是查看当前数据库中 key 的数目。
127.0.0.1:6379> dbsize
(integer) 5
数据库操作
多数据库间切换
redis数据库时提供了16个数据库
使用select 10就进入到第10个数据库了
127.0.0.1:6379>select 10
OK
多数据库间移动数据
Redis 的多数据库在一定程度上是相对独立的,例如在数据库 0 上面存放 num1 的数据,在其它 1-15 的数据库上是无法查看到的
127.0.0.1:6379>move num1 1 # 将当前数据库中的num1移动到数据库1中
(integer) 1
127.0.0.1:6379>select 1 # 切换至目标数据库 1
OK
127.0.0.1:6379[1]>get k1 # 查看被移动数据
"11"
清除数据库内数据
清空当前数据库数据,使用 FLUSHDB
命令实现;清空所有数据库的数据,使用 FLUSHALL 命令实现
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> flushall
OK
Redis持久化
概念
- Redis是运行中内存中,内存中的数据断电丢失
- 为了能够重用Redis数据,或者防止系统故障需要将Redis中的数据写入到磁盘中,也就是持久化
分类
- RDB方式:创建快照的方式获取某一时刻Redis中所有数据的副本(默认使用RDB进行持久化)
- AOF方式:将执行的写命令写到文件的末尾,以日志的方式来记录数据的变化
对于静态数据的持久化叫做备份,对于动态数据的持久化叫做快照
RDB
- Redis的默认持久化方式
- 默认文件名为dump.rdb
- 触发条件有手动触发和自动触发
- Redis加载RDB恢复数据远远快于AOF方式
AOF
- Redis默认不开启
- 弥补RDB的不足(数据的不一致性)
- 采用日志的形式来记录每个写入操作,并追加到文件中
- Redis重启后会根据日志文件的内容将写入操作从前到后执行一次以完成数据的恢复工作
如果同时开启RDB和AOF功能,Redis重启后会先读取RDB的快照文件,然后再读取日志的信息进行操作,也就是RDB的数据被AOF的数据覆盖了
二者选择的标准
牺牲一些性能,换取更高的缓存一致性(AOF)
写操作频繁的时候,不启用备份来换取更高的性能,待手动运行 save 的时候,再做备份(RDB)
Redis 持久化配置
RDB
打开在redis的配置文件,可以定义RDB持久化的设置
在219行到221行定义了
[root@localhost ~]# vim /etc/redis/6379.conf
save 900 1 # 在900秒(15分钟)之后,如果至少有1个key发生变化,则生成快照
save 300 10 # 在300秒(5分钟)之后,如果至少有 10 个key发生变化,则生成快照
save 60 10000 # 在60秒(1分钟)之后,如果至少有10000个key 发生变化,则生成快照
在第254行可以定义快照文件的文件名
dbfilename dump.rdb
第264行,可以定义RDB生存文件的路径
dir /var/lib/redis/6379
第242行定义是否进行压缩
rdbcompression yes
AOF
第673行,修改AOF是开启还是关闭,这里我们开启
appendonly yes
第677行,指定了AOF生成的文件名
appendfilename "appendonly.aof"
在702 ~ 704行,指定了AOF持久化的方式
# appendfsync always # 同步持久化,每次发送数据变化会立刻写入硬盘
appendfsync everysec # 默认值,每秒异步记录一次
# appendfsync no # 不同步
AOF重写
为了解决 AOF 文件体积不断增大的问题,用户可以向 Redis 发送 BGREWRITEAOF命令。BGREWRITEAOF 命令会通过移除 AOF 文件中的冗余命令来重写(rewrite)AOF文件,使 AOF 文件的体积尽可能地变小。
[root@localhost ~]# redis-cli
127.0.0.1:6379> bgrewriteaof
Background append only file rewriting started
性能管理
查看内存信息
127.0.0.1:6379> info memory
回收策略
设置key的过期时间,这里设置过期时间为5秒。5秒后该键对应的值就为空
127.0.0.1:6379> set test 123
OK
127.0.0.1:6379> expire test 5
(integer) 1
127.0.0.1:6379> get test
"123"
127.0.0.1:6379> get test
(nil)