Redis:概念、部署、配置、优化

目录

关系型数据库与非关系型数据库

关系型数据库

非关系型数据库

非关系型数据库存在的原因

Redis

概念

优点

Redis部署流程

初步设置

安装

初始化

初始化时指定的参数说明

Redis配置文件

修改监听地址

Redis远程连接

远程连接

测试服务端状态

redis-benchmark测试工具

测试请求性能

测试读写性能

[set 与 lpush 操作性能](#set 与 lpush 操作性能)

Redis常用命令

创建键值对

get

keys

exists

del

type

rename

renamenx

dbsize

数据库操作

多数据库间切换

多数据库间移动数据

清除数据库内数据

Redis持久化

概念

分类

RDB

AOF

二者选择的标准

[Redis 持久化配置](#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(键值对)的存储形式

优点

  1. 具有极高的数据读写速度
  2. 支持数据的持久化(持续存储数据)
  3. 支持数据备份
  4. 原子性

Redis部署流程

初步设置

打开两台虚拟机并连接上XShell,然后开启会话同步,再将redis的源码包导入该主机

101主机作为服务端,102主机作为客户端

为了方便实验,关闭防火墙和内核安全机制,然后安装redis所需的依赖环境

bash 复制代码
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum -y install gcc* zlib-devel
安装

解压该源码包,进入解压目录,安装,创建软链接优化命令路径

bash 复制代码
[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实例,那么在初始化时指定的信息都要改变
实例:运行在内存上的一个进程

bash 复制代码
[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
初始化时指定的参数说明
bash 复制代码
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地址

bash 复制代码
[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的进程

bash 复制代码
[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不仅可以用客户端来远程连接,也可以在本地连接本地的服务端

bash 复制代码
[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地址来远程连接

bash 复制代码
[root@localhost ~]# redis-cli -h 192.168.10.101 -p 6379

测试服务端状态

在102(客户端)操作

redis服务端通过乒乓机制来应答客户端的ping测试

bash 复制代码
[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:指定请求数
bash 复制代码
[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 值;
bash 复制代码
[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:仅运行以逗号分隔的测试命令列表;
bash 复制代码
[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指令,指定键,然后输入值

bash 复制代码
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)

bash 复制代码
127.0.0.1:6379> get k1
"1"

keys

使用keys *命令查询所有键

bash 复制代码
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开头的键

bash 复制代码
127.0.0.1:6379> keys num*
1) "num2"
2) "num3"
3) "num1"

查看当前数据库中以n开头后面包含任意3位字符的键

bash 复制代码
127.0.0.1:6379> keys n???
1) "num2"
2) "num3"
3) "num1"

exists

使用exists命令查询指定键是否存在,1表示该键存在,0表示该键不存在

bash 复制代码
127.0.0.1:6379> exists num1
(integer) 1
127.0.0.1:6379> exists num10
(integer) 0

del

del 命令可以删除当前数据库的指定 key

  • 显示1表示操作成功
  • 显示0表示操作失败
bash 复制代码
127.0.0.1:6379> del num3
(integer) 1
127.0.0.1:6379> del num3
(integer) 0

type

使用 type 命令可以获取 key 对应的 value 值类型

bash 复制代码
127.0.0.1:6379>type num1 
string

rename

rename 命令是对已有 key 进行重命名

在实际使用过程中,建议先用 exists 命令查看目标 key 是否存在,然后再决定是否执行 rename 命令,以避免覆盖重要数据

bash 复制代码
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 存在则不进行重命名。

bash 复制代码
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 的数目。

bash 复制代码
127.0.0.1:6379> dbsize 
(integer) 5

数据库操作

多数据库间切换

redis数据库时提供了16个数据库

使用select 10就进入到第10个数据库了

bash 复制代码
127.0.0.1:6379>select 10 
OK

多数据库间移动数据

Redis 的多数据库在一定程度上是相对独立的,例如在数据库 0 上面存放 num1 的数据,在其它 1-15 的数据库上是无法查看到的

bash 复制代码
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 命令实现

bash 复制代码
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行定义了

bash 复制代码
[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行可以定义快照文件的文件名

bash 复制代码
dbfilename dump.rdb

第264行,可以定义RDB生存文件的路径

bash 复制代码
dir /var/lib/redis/6379

第242行定义是否进行压缩

bash 复制代码
rdbcompression yes

AOF

第673行,修改AOF是开启还是关闭,这里我们开启

bash 复制代码
appendonly yes

第677行,指定了AOF生成的文件名

bash 复制代码
appendfilename "appendonly.aof"

在702 ~ 704行,指定了AOF持久化的方式

bash 复制代码
# appendfsync always  # 同步持久化,每次发送数据变化会立刻写入硬盘
appendfsync everysec  # 默认值,每秒异步记录一次
# appendfsync no      # 不同步

AOF重写

为了解决 AOF 文件体积不断增大的问题,用户可以向 Redis 发送 BGREWRITEAOF命令。BGREWRITEAOF 命令会通过移除 AOF 文件中的冗余命令来重写(rewrite)AOF文件,使 AOF 文件的体积尽可能地变小。

bash 复制代码
[root@localhost ~]# redis-cli
127.0.0.1:6379> bgrewriteaof
Background append only file rewriting started

性能管理

查看内存信息

bash 复制代码
127.0.0.1:6379> info memory

回收策略

设置key的过期时间,这里设置过期时间为5秒。5秒后该键对应的值就为空

bash 复制代码
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)
相关推荐
九河云29 分钟前
AWS账号注册费用详解:新用户是否需要付费?
服务器·云计算·aws
Lary_Rock33 分钟前
RK3576 LINUX RKNN SDK 测试
linux·运维·服务器
CoderIsArt35 分钟前
Redis的三种模式:主从模式,哨兵与集群模式
数据库·redis·缓存
幺零九零零1 小时前
【计算机网络】TCP协议面试常考(一)
服务器·tcp/ip·计算机网络
云飞云共享云桌面2 小时前
8位机械工程师如何共享一台图形工作站算力?
linux·服务器·网络
Peter_chq3 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
一坨阿亮4 小时前
Linux 使用中的问题
linux·运维
ketil275 小时前
Redis - String 字符串
数据库·redis·缓存
dsywws5 小时前
Linux学习笔记之vim入门
linux·笔记·学习
幺零九零零6 小时前
【C++】socket套接字编程
linux·服务器·网络·c++