Redis配置与优化

Redis配置与优化

Redis概述

Redis 是一个高性能的key-value数据库。

redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。

Redis优点

具有极高的数据读写速
支持丰富的数据类型
支持数据的持久化
原子性
支持数据备份

Redis配置文件(/etc/redis/6379.conf)bind: 监听的主机地址

port: 端口
daemonize yes: 启用守护进程
pidfile: 指定PID文件
loglevel notice: 日志级别
logfile: 指定日志文件

Redis安装部署

#安装编译环境
[root@localhost ~]# yum install gcc gcc-c++ make -y
#远程挂载源码包
[root@localhost ~]# mount.cifs //192.168.142.1/redis /mnt
Password for root@//192.168.142.1/redis:
#解压源码包
[root@localhost ~]# cd /mnt
[root@localhost mnt]# tar zxvf redis-5.0.7.tar.gz -C /opt
#编译与安装
[root@localhost mnt]# cd /opt/redis-5.0.7/
[root@localhost redis-5.0.7]# make
[root@localhost redis-5.0.7]# make PREFIX=/usr/local/redis/ install
#建立服务命令软链接到系统
[root@localhost redis-5.0.7]# ln -s /usr/redis/bin/* /usr/local/bin/
#切入utils目录
[root@localhost redis-5.0.7]# cd /opt/redis-5.0.7/utils/
#执行启动脚本
[root@localhost utils]# ./install_server.sh
#以下内容,默认回车即可
Welcome to the redis service installer
This script will help you easily set up a running redis server
Please select the redis port for this instance: [6379]
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf]
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log]
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379]
Selected default - /var/lib/redis/6379
Please select the redis executable path [] /usr/local/redis/bin/redis-server
#此处需手动指定扩展目录路径/usr/local/redis/bin/redis-server
#使用进程控制启动服务
[root@localhost utils]# /etc/init.d/redis_6379 start
Starting Redis server...
#配置redis的6379.conf文件,追加监听地址
[root@localhost utils]# vim /etc/redis/6379.conf
bind 127.0.0.1 192.168.142.136
#重启服务
[root@localhost utils]# /etc/init.d/redis_6379 restart
Stopping ...
Redis stopped
Starting Redis server...

Redis常用命令演示

#连接本地数据库
[root@localhost utils]# /usr/local/redis/bin/redis-cli
127.0.0.1:6379>
#连接远程数据库
[root@localhost utils]# redis-cli -h 192.168.142.136 -p 6379
192.168.142.136:6379>
[root@localhost utils]# /usr/local/redis/bin/redis-cli
#获取set命令帮助
127.0.0.1:6379> help set
SET key value [expiration EX seconds|PX milliseconds] [NX|XX]
summary: Set the string value of a key
since: 1.0.0
group: string
#存放数据
127.0.0.1:6379> set teacher wangmin
OK
#获取数据
127.0.0.1:6379> get teacher
"wangmin"
#查看当前数据库所有键
127.0.0.1:6379> keys *
1) "teacher"
2) "st"
3) "teacer"
4) "stu"
5) "student"
#查看当前数据库中
127.0.0.1:6379> keys t*
1) "teacher"
2) "teacer"
#查看当前数据库中以s开头后面包含任意一个及字符的键
127.0.0.1:6379> keys s?
1) "st"
#查看当前数据库中以s开头后面包含任意二个及字符的键
127.0.0.1:6379> keys s??
1) "stu"
#判断键值是否存
127.0.0.1:6379> exists stu
(integer) 1
#返回int值为1,则表示键值存在
127.0.0.1:6379> exists std
(integer) 0
#返回int值为0,则表示键值不存在
#删除当前数据库的指定key
127.0.0.1:6379> del st
(integer) 1
#获取可以对应的value值类型
127.0.0.1:6379> type stu
string
#对已有的可以进行重命名覆盖
127.0.0.1:6379> rename student stud
OK
127.0.0.1:6379> get stud
"yuanyuan"
#对已有的可以进行重命名不覆盖
127.0.0.1:6379> renamenx stud st
(integer) 1
127.0.0.1:6379> get st
"yuanyuan"
#查看当前数据库中key的数目
127.0.0.1:6379> dbsize
(integer) 4

redis-benchmark测试工具

-h:指定服务器主机名
-p:指定服务器端口
-C:指定并发连接数
-n: 指定请求数
-d:以字节的形式指定SET/GET值的数据大小
-q:强制推出redis。仅显示query/sec值

1.向IP地址为192.168.142.136端口为6379的redis服务器发送100个并发连接与100000个请求测试性能

[root@localhost utils]# /usr/local/redis/bin/redis-benchmark -h 192.168.142.136 -p 6379 -c 100 -n 100000
...
#主要查看set和get性能参数
====== SET ======
100000 requests completed in 1.03 seconds
100 parallel clients
3 bytes payload
keep alive: 1
93.23% <= 1 milliseconds
99.09% <= 2 milliseconds
99.82% <= 3 milliseconds
100.00% <= 3 milliseconds
96993.21 requests per second
====== GET ======
100000 requests completed in 1.05 seconds
100 parallel clients
3 bytes payload
keep alive: 1
92.05% <= 1 milliseconds
99.12% <= 2 milliseconds
99.75% <= 3 milliseconds
99.90% <= 7 milliseconds
99.93% <= 8 milliseconds
100.00% <= 8 milliseconds
94966.77 requests per second
...

2.测试存取大小为100字节的数据包的性能

[root@localhost utils]# /usr/local/redis/bin/redis-benchmark -h 192.168.142.136 -p 6379 -d 100
...
#主要查看set和get性能参数
====== SET ======
100000 requests completed in 1.05 seconds
50 parallel clients
100 bytes payload
keep alive: 1
99.17% <= 1 milliseconds
99.79% <= 2 milliseconds
100.00% <= 2 milliseconds
95328.88 requests per second
====== GET ======
100000 requests completed in 1.02 seconds
50 parallel clients
100 bytes payload
keep alive: 1
99.29% <= 1 milliseconds
99.70% <= 2 milliseconds
100.00% <= 2 milliseconds
97751.71 requests per second
...

Redis多数据库操作

Redis支持多数据库,默认支持16个数据库,0-15命名,多数据库相互独立,互不干扰

多数据库常用命令

#多数据库间切换
#默认在第一个数据库中
127.0.0.1:6379> select 10
OK
127.0.0.1:6379[10]> select 15
OK
127.0.0.1:6379[15]>
#多数据库间移动数据
127.0.0.1:6379> move st 3
(integer) 1
#切换数据库并查看键值
127.0.0.1:6379> select 3
OK
127.0.0.1:6379[3]> keys *
1) "st"
#清除数据库内数据
127.0.0.1:6379[3]> flushdb
OK
127.0.0.1:6379[3]> keys *
(empty list or set)

Redis持久化

持久化概述

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

持久化分类

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

RDB持久化

Redis的默认持久化方式
默认文件名dump.rdb
触发条件
●在指定的时间间隔内,执行指定次数的写操作(配置文件控制)
●执行save或者是bgsave (异步) 命令
●执行flushall命令,清空数据库所有数据
●执行shutdown命令,保证服务器正常关闭且不丢失任何数据
优缺点
●适合大规模的数据恢复
●如果业务对数据完整性和一致性要求不高,RDB是很好的选择
●数据的完整性和一致性不高
●备份时占用内存

配置RDB持久化

[root@localhost utils]# vim /etc/redis/6379.conf
#900秒之内至少一次写操作
save 900 1
#300秒之内至少发生10次写操作
save 300 10
#60秒之内发生至少10000次写操作
save 60 10000
#只要满足其一都会触发快照操作,注释所有的save项表示关闭RDB
#RDB文件名称
dbfilename dump.rdb
#RDB文件路径
dir /var/lib/redis/6379
#开启压缩功能
rdbcompression yes

AOF持久化

Redis默认不开启
弥补RDB的不足(数据的不一致性)
采用日志的形式来记录每个写操作,并追加到文件中
Redis重启会根据日志文件的内容将写指令从前到后执
行一次以完成数据的恢复工作

配置AOF持久化

[root@localhost utils]# vim /etc/redis/6379.conf
#开启AOF持久化
appendonly yes
#AOF文件名称
appendfilename "appendonly.aof"
#always:同步持久化,每次发生数据变化会立刻写入磁盘
# appendfsync always
#everysec:默认推荐,每秒异步记录次(默认值)
appendfsync everysec
#no:不同步,交给操作系统决定如何同步
# appendfsync no
#忽略最后一条可能存在问题的指令
aof-load-truncated yes

AOF的重写机制

AOF的工作原理是将写操作追加到文件中,文件的冗余内容会越来越多
当AOF文件的大小超过所设定的阈值时,Redis就会对AOF文件的内容压缩

AOF重写的原理

Redis会fork出一条新进程,读取内存中的数据(并没有读取旧文件),并重新写到一个临时文件中,最后替换旧的aof文件

AOF的重写配置

[root@localhost utils]# vim /etc/redis/6379.conf
#在日志进行BGREWRITEAOF时, 如果设置为yes表示新写操作不进行同步fsync,
#只暂存在缓冲区里,避免造成磁盘I0操作冲突,等重写完成后在写入。redis中默认为no
no-appendfsync-on-rewrite no
#当前AOF文件大小是上次日志重写时AOF文件大小两倍时,发生BGREWRITEAOF操作
auto-aof-rewrite-percentage 100
#当前AOF文件执行BGREWRITEAOF命令的最小值,
#避免刚开始启动Reids时由于文件尺寸较小导致频繁的BGREWRITEAOF
auto-aof-rewrite-min-size 64mb

Redis性能管理

查看redis内存使用

[root@localhost utils]# /usr/local/redis/bin/redis-cli
127.0.0.1:6379> info memory
# Memory
used_memory:11767592
used_memory_human:11.22M        #内存使用率
used_memory_rss:23867392
used_memory_rss_human:22.76M
used_memory_peak:24877056
used_memory_peak_human:23.72M
used_memory_peak_perc:47.30%
used_memory_overhead:841518
used_memory_startup:791416
used_memory_dataset:10926074
used_memory_dataset_perc:99.54%
allocator_allocated:12177712
allocator_active:12488704
allocator_resident:19542016
total_system_memory:1911832576
total_system_memory_human:1.78G
used_memory_lua:37888
used_memory_lua_human:37.00K
used_memory_scripts:0
used_memory_scripts_human:0B
number_of_cached_scripts:0
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
allocator_frag_ratio:1.03
allocator_frag_bytes:310992
allocator_rss_ratio:1.56
allocator_rss_bytes:7053312
rss_overhead_ratio:1.22
rss_overhead_bytes:4325376
mem_fragmentation_ratio:2.04        #内存碎片率
mem_fragmentation_bytes:12140824
mem_not_counted_for_evict:0
mem_replication_backlog:0
mem_clients_slaves:0
mem_clients_normal:49694
mem_aof_buffer:0
mem_allocator:jemalloc-5.1.0
active_defrag_running:0
lazyfree_pending_objects:0

内存碎片率

●操系统分配的内存值used_ _memory_ _rss除以redis使用的内存值
used_ _memory计算得出
●内存碎片是由操作系统低效的分配/回收物理内存导致的
不连续的物理内存分配
●跟踪内存碎片率对理解redis实例的资源性能是非常重要的
内存碎片率稍大于1是合理的,这个值表示内存碎片率比较低
内存碎片率超过1.5,说明redis消耗了实际需要物理内存的150%,其中50%是内存碎片率
内存碎片率低于1的,说明Redis内存分配超出了物理内存,操作系统正在进行内存交换

内存使用率

●redis实例的内存使用率超过可用最大内存,操作系统将开始进行
内存与swap空间交换
●避免内存交换
针对缓存数据大小选择
尽可能的使用Hash数据结构
设置key的过期时间

回收key

●保证合理分配redis有限的内存资源
●当内存使用达到设置的最大阀值时,需要选择一种key的回收策略
默认情况下回收策略是禁止删除
redis.conf配置文件中修改maxmemory-policy属性值
- volatile-lru:使用LRU算法从已设置过期时间的数据集合中淘汰数据
- volatile-ttl:从已设置过期时间的数据集合中挑选即将过期的数据淘汰
- volatile-random:从已设置过期时间的数据集合中随机挑选数据淘汰
- allkeys-lru:使用LRU算法从所有数据集合中淘汰数据
- allkeys-random:从数据集合中任意选择数据淘汰
- no-enviction:禁止淘汰数据

感谢阅读~ ~ ~ ~