Redis的优化配置详解

文章目录

  • 1.Redis配置策略
    • 1.1 Redis配置文件
    • 1.2 Redis数据库常用命令
    • 1.3 Redis命令工具
      • 1.3.1 命令工具的介绍
      • 1.3.2 redis-benchmark (测试工具) 命令行选项
  • 2.Redis多数据库操作
    • 2.1 数据库解析
    • 2.2 命令解析
      • 2.2.1 多数据库间切换
      • 2.2.2 多数据库间移动数据
      • 2.2.3 清除数据库内数据
    • 2.3 Redis数据库常用命令
      • 2.3.1 key相关命令
      • 2.3.2 常用命令的应用示例
  • 3.Redis配置文件的分析
    • 3.1 持久化概述
    • 3.2 RDB持久化
      • 3.2.1 概述
      • 3.2.2 触发条件
      • 3.2.3 优缺点
      • 3.2.4 通过RDB文件恢复数据
    • 3.3 AOF持久化

1.Redis配置策略

1.1 Redis配置文件

  • 配置参数(/etc/redis/6379.conf)
bind:监听的主机地址
port:端口(默认6379)
daemonize yes:启用守护进程
pidfile:指定PID文件
loglevel notice:日志级别
logfile:指定日志文件

1.2 Redis数据库常用命令

  • redis-cli命令行工具
连接本地数据库
/usr/local/redis/bin/redis-cli
127.0.0.1:6379>
连接远程数据库
redis-cli -h 192.168.140.10 -p 6379
 192.168.140.10>

1.3 Redis命令工具

1.3.1 命令工具的介绍

  • redis-server :用于启动Redis的工具
  • redis-benchmark :用于检测Redis在本机的运行效率
  • redis-check-aof :修复AOF持久化文件
  • redis-check-rdb :修复RDB持久化文件
  • redis-cli :是Redis命令行工具
  • redis-sentinel :是哨兵模式启动的工具

1.3.2 redis-benchmark (测试工具) 命令行选项

  • 基本测试语法为
redis-benchmark [option] [option value]
-h: 指定服务器主机名
-p:指定服务器端口
-s:指定服务器socket
-c:指定并发连接数
-n:指定请求数
-d:以字节的形式指定SET/GET值的数据大小
-k:1=keep alive  0=reconnect
-r:SET/GET/INCR使用随机key,SADD使用随机值
-P:通过管道传输<numreq>请求
-q:强制退出redis,仅显示query/sec值
---csv:以CSV格式输出
-l:生成循环,永久执行测试
-t:仅运行以逗号分隔的测试命令列表
-I:Idle模式,仅打开N个idle 连接并等待
  • 应用示例
[root@server ~]# redis-benchmark -h 192.168.140.20 -p 6379 -c 100 -n 10000
//向IP地址为192.168.140.20,端口为6379的Redis服务器发送100个并发连接与10000个请求测试性能

2.Redis多数据库操作

2.1 数据库解析

  • Redis支持多数据库,默认支持16个数据库,0-15命名;

  • 多数据库相互独立,互不干扰;

  • 多数据库常用命令:
    多数据库间切换
    多数据库间移动数据
    清除数据库内数据

2.2 命令解析

2.2.1 多数据库间切换

  • 使用Select 命令可以进行Redis的多数据库之间的切换
  • 命令格式
select index
//其中index 表示数据库的序号,而使用redis-cli 连接Redis数据库后,默认使用的是序号为0的数据库
  • 应用示例
127.0.0.1:6379> select 2      //此时表示从数据库0切换到数据库2
OK
127.0.0.1:6379[2]> select 10  //切换到数据库10
OK
127.0.0.1:6379[10]> 

2.2.2 多数据库间移动数据

  • Redis数据库提供了一个move的命令,可以进行多数据库的数据移动
  • 命令的基本语法格式
move key dbindex
//其中“key“表示当前数据库的目标键,"dbindex"表示目标数据库的序号
  • 应用示例
127.0.0.1:6379> move q 10     //移动q到数据库10
(integer) 1
127.0.0.1:6379> get q   
(nil)
127.0.0.1:6379> select 10     //切换到数据库10
OK
127.0.0.1:6379[10]> keys *    列出key中的所有关键词
1) "q"

2.2.3 清除数据库内数据

  • Redis数据库的整库数据删除主要分为两个部分:
    清空当前数据库数据,使用 FLUSHDB 命令实现
    清空所有数据库的数据,使用FLUSHALL命令实现(一般不用)

  • 应用示例

127.0.0.1:6379> select 10    //切换到数据库10
OK
127.0.0.1:6379[10]> keys *   //列出key中的所有关键词
1) "q"
127.0.0.1:6379[10]> get q    //输出q键值
"10"
127.0.0.1:6379[10]> flushdb  //清除当前数据库中的数据
OK
127.0.0.1:6379[10]> keys *   //列出key中的所有关键词
(empty list or set)

2.3 Redis数据库常用命令

2.3.1 key相关命令

  • keys:获取符合规则的键值列表
  • exists:判断键值是否存在
  • del:删除当前数据库的指定key
  • type:获取key对应的value值类型
  • rename(覆盖)/renamenx(不覆盖):对已有的key进行重命名
  • dbsize:查看当前数据库中key的数目

2.3.2 常用命令的应用示例

  • 用法示例
[root@server1 ~]# redis-cli     //连接数据库
  • 查看以 s 开头的
192.168.140.20:6379> keys s*                 
1) "set1"
2) "set2"
  • 查看关键词set是否存在(1代表存在,0代表不存在)
192.168.140.20:6379> exists set3
(integer) 0
192.168.140.20:6379> exists set1
(integer) 1
  • 删除关键词,操作成功输出1
192.168.140.20:6379> del set1
(integer) 1
  • 获取 key 对应的 value 值类型
192.168.140.20:6379> set string1 77
OK
192.168.140.20:6379> type string1
string
192.168.140.20:6379> type hash1   //获取hash1对应的vlane值类型
hash
  • rename命令对已有 key 进行重命名
rename命令进行重命名时,无论目标key是否存在都进行重命名,且源key的值会覆盖目标key 的值。
在实际使用过程中,建议先用exists命令查看目标 key是否存在,然后再决定是否执行rename命令,以避免覆盖重要数据
命令格式为 rename 源key 目标key

192.168.140.20:6379> set bw 1           //添加键值
OK
192.168.140.20:6379> set cw 2
OK
192.168.140.20:6379> rename cw bw   //重命名cw覆盖bw键值
OK
192.168.140.20:6379> get bw
"2"
  • renamenx命令对已有 key 进行重命名,并检测新名是否存在
其命令格式与 rename 的命令格式除命令关键字不同外基本相同,renamenx源key目标key。
使用renamenx命令进行重命名时,如果目标key存在则不进行重命名
命令格式:renamenx 源key 目标key

192.168.140.20:6379> set bw 1
OK
192.168.140.20:6379> set cw 2
OK
192.168.140.20:6379> renamenx cw bw		//重命名cw覆盖bw键值,重命名失败
(integer) 0

3.Redis配置文件的分析

3.1 持久化概述

概述:

  • Redis是运行在内存中,内存中的数据断电会丢失
  • 为了能够重用Redis数据,或者防止系统故障,需要将Redis中的数据写入到磁盘空间中,即持久化

持久化分类:

  • RDB方式: 创建快照的方式获取某一时刻Redis中所有数据的副本
  • AOF方式: 将执行的写命令写到文件的末尾,以日志的方式来记录数据的变化

3.2 RDB持久化

3.2.1 概述

  • Redis的默认持久化方式,默认文件名dump.rdb。

3.2.2 触发条件

  • 在指定的时间间隔内,执行指定次数的写操作(配置文件控制)
  • 执行save或者是bgsave(异步)命令
  • 执行flushall命令,清空数据库所有数据
  • 执行shutdown命令,保证服务器正常关闭且不丢失任何数据

3.2.3 优缺点

  • 适合大规模的数据恢复
  • 如果业务对数据完整性和一致性要求不高,RDB是很好的选择
  • 数据的完整性和一致性不高
  • 备份时占用内存

3.2.4 通过RDB文件恢复数据

  • 将dump.rdb文件拷贝到redis的安装目录的bin目录下,重启redis服务即可
[root@localhost ~]# vim /etc/redis/6379.conf

#RDB核心规则配置 save <指定时间间隔> <执行指定次数更新操作>,满足条件就将内存中的数据同步到硬盘
中。官方出厂配置默认是 900秒内有1个更改,300秒内有10个更改以及60秒内有10000个更改,则将内存中的
数据快照写入磁盘。
若不想用RDB方案,可以把 save "" 的注释打开,下面三个注释
#save ""
save 900 1					"这三项默认设置"
save 300 10
save 60 10000
dbfilename dump.rdb				//RDB文件名称
dir /var/lib/redis/6379			//RDB文件路径
rdbcompression yes				//是否进行压缩
 
#当RDB持久化出现错误后,是否依然进行继续进行工作,yes:不能进行工作,no:可以继续进行工作,可以通过info中的rdb_last_bgsave_status了解RDB持久化是否有错误
stop-writes-on-bgsave-error yes
 
#配置存储至本地数据库时是否压缩数据,默认为yes。Redis采用LZF压缩方式,但占用了一点CPU的时间。若关闭该选项,但会导致数据库文件变的巨大。建议开启。
rdbcompression yes
 
#是否校验rdb文件;从rdb格式的第五个版本开始,在rdb文件的末尾会带上CRC64的校验和。这跟有利于文件的容错性,但是在保存rdb文件的时候,会有大概10%的性能损耗,所以如果你追求高性能,可以关闭该配置
rdbchecksum yes
 
#指定本地数据库文件名,一般采用默认的dump.rdb
dbfilename dump.rdb
 
#数据目录,数据库会写入这个目录。rdb、aof文件也会写在这个目录
dir /var/lib/redis/6379

3.3 AOF持久化

  • Redis默认不开启;

  • 弥补RDB的不足(数据的不一致性);

  • 采用日志的形式来记录每个写操作,并追加到文件中;

  • Redis 重启会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作;

  • AOF不是默认开启,要手动开启.RDB默认开启。

[root@localhost ~]# vim /etc/redis/6379.conf
 
'//Redis 默认不开启。它的出现是为了弥补RDB的不足(数据的不一致性),所以它采用日志的形式来记录每个写操作,并追加到文件中。
appendonly no
 
appendfilename "appendonly.aof"		//指定本地数据库文件名,默认值为 appendonly.aof
  
#aof持久化策略的配置
#no表示不执行fsync,由操作系统保证数据同步到磁盘,速度最快
	always表示每次写入都执行fsync,以保证数据同步到磁盘
	everysec表示每秒执行一次fsync,可能会导致丢失这1s数据
# appendfsync always		'//always:数据要求高'
appendfsync everysec 	'//everysec:一般情况使用 '
# appendfsync no			

no-appendfsync-on-rewrite no
 
auto-aof-rewrite-percentage 100
 
'//设置允许重写的最小aof文件大小,避免了达到约定百分比但尺寸仍然很小的情况还要重写'
auto-aof-rewrite-min-size 64mb
 
aof-load-truncated yes
 
'//加载redis时,可以识别AOF文件以“redis”开头'
'//字符串并加载带前缀的RDB文件,然后继续加载AOF尾巴'
aof-use-rdb-preamble yes

配置命令详解

  • Redis 重启的会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作默认redis使用的是rdb方式持久化,这种方式在许多应用中已经足够用了。但是redis如果中途宕机,会导致可能有几分钟的数据丢失,根据save来策略进行持久化,Append Only File是另一种持久化方式,可以提供更好的持久化特性。Redis会把每次写入的数据在接收后都写入 appendonly.aof 文件,每次启动时Redis都会先把这个文件的数据读入内存里,先忽略RDB文件。若开启rdb则将no改为yes
appendonly no
  • 在aof重写或者写入rdb文件的时候,会执行大量IO,此时对于everysec和always的aof模式来说,执行fsync会造成阻塞过长时间,no-appendfsync-on-rewrite字段设置为默认设置为no。如果对延迟要求很高的应用,这个字段可以设置为yes,否则还是设置为no,这样对持久化特性来说这是更安全的选择。设置为yes表示rewrite期间对新写操作不fsync,暂时存在内存中,等rewrite完成后再写入,默认为no,建议yes。Linux的默认fsync策略是30秒。可能丢失30秒数据
no-appendfsync-on-rewrite no
  • aof自动重写配置。当目前aof文件大小超过上一次重写的aof文件大小的百分之多少进行重写,即当aof文件增长到一定大小的时候Redis能够调用bgrewriteaof对日志文件进行重写。当前AOF文件大小是上次日志重写得到AOF文件大小的二倍(设置为100)时,自动启动新的日志重写过程
auto-aof-rewrite-percentage 100
  • aof文件可能在尾部是不完整的,当redis启动的时候,aof文件的数据被载入内存。重启可能发生在redis所在的主机操作系统宕机后,尤其在ext4文件系统没有加上data=ordered选项(redis宕机或者异常终止不会造成尾部不完整现象。)出现这种现象,可以选择让redis退出,或者导入尽可能多的数据。如果选择的是yes,当截断的aof文件被导入的时候,会自动发布一个log给客户端然后load。如果是no,用户必须手动redis-check-aof修复AOF文件才可以
aof-load-truncated yes

你可能感兴趣的:(NoSQL,redis)