Redis配置与优化

Redis配置与优化

文章目录

  • Redis配置与优化
  • 一、 关系数据库和非关系数据库
    • 1.1 关系型数据库
    • 1.2 非关系型数据库
    • 1.3 非关系型数据库产生背景
    • 1.4 Redis简介
  • 二、 Redis安装部署
    • 2.1 操作步骤
    • 2.2 编译安装Redis
    • 2.3 Redis配置文件
  • 三、 Redis数据库常用命令
  • 四、redis-benchmark测试工具
    • 五、Redis多数据库操作
  • 四、 Redis持久化
    • 4.1 持久化概述
    • 4.2 持久化分类
    • 4.3 Redis的默认持久化方式
    • 4.4 RDB持久化
    • 4.5 AOF持久化
    • 4.6 根据AOF文件恢复数据
    • 4.7 AOF的重写机制
    • 4.8 AOF重写的原理
    • 4.9 AOF的重写配置
  • 五、 Redis性能管理
    • 5.1 查看Redis内存使用
    • 5.2 Redis性能管理
      • 5.2.1 内存碎片率
      • 5.2.2 内存使用率
      • 5.2.3 避免内存交换
      • 5.2.4 回收key

一、 关系数据库和非关系数据库

1.1 关系型数据库

  • 一个结构化的数据库,创建在关系模型基础上
  • 一般面向于记录

包括

  • Oracle、MySQL、SQL Server、Microsoft Access、DB2等

1.2 非关系型数据库

  • 除了主流的关系型数据库外的数据库,都认为是非关系型

包括

  • Redis、MongBD、Hbase、CouhDB等

1.3 非关系型数据库产生背景

  • High performance——对数据库高并发读写需求
  • Huge Storage——对海量数据高效存储与访问需求
  • High Scalability && High Availability——对数据库高可扩展性与高可用性需求

1.4 Redis简介

  • Redis基于内存运行并支持持久化
  • 采用key-value(键值对)的存储形式

优点

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

二、 Redis安装部署

2.1 操作步骤

解压软件包——make && make install——设置Redis相关配置文件——查看运行状态

2.2 编译安装Redis


yum -y install gcc gcc-c++ make

tar zxvf redis-5.0.7.tar.gz 

cd redis-5.0.7/

make

make PREFIX=/usr/local/redis install

cd /usr/local/redis/
 
ln -s /usr/local/redis/bin/* /usr/local/bin/

cd /opt/redis-5.0.7/utils/

./install_server.sh 

一路回车
Please select the executable path [/usr/local/bin/redis-server] /usr/local/redis/bin/redis-server  //手动输入
***************  Redis 进程控制**********************

/etc/init.d/redis_6379 status

/etc/init.d/redis_6379 stop

/etc/init.d/redis_6379 start

vim /etc/6379.conf

redis-cli    //登录

2.3 Redis配置文件


bind:监听的主机地址

port:端口

daemonize yes:启用守护进程

pidfile:指定PID文件

loglevel notice:日志级别

logfile:指定日志文件

三、 Redis数据库常用命令

返回值1 为操作成功,返回值为0操作失败

  • redis-cli命令行工具

[root@localhost utils]# /usr/local/redis/bin/redis-cli
127.0.0.1:6379>

  • 连接远程数据库

[root@localhost utils]# redis-cli -h 192.168.10.161 -p 6379
192.168.10.161:6379>

  • redis-cli命令行工具

[root@localhost utils]# /usr/local/redis/bin/redis-cli
127.0.0.1:6379> help @list
  BLPOP key [key ...] timeout
  summary: Remove and get the first element in a list, or block until one is available
  since: 2.0.0
……
127.0.0.1:6379> help set
  SET key value [EX seconds] [PX milliseconds] [NX|XX]
  summary: Set the string value of a key
  since: 1.0.0
  group: string

  • set:存放数据
  • get:获取数据
[root@localhost ~]# /usr/local/redis/bin/redis-cli
127.0.0.1:6379> set teacher zhanglong
OK
127.0.0.1:6379> get teacher
"zhanglong"

  • keys:获取符合规则的键值列表

127.0.0.1:6379> set cname tt
OK
127.0.0.1:6379> keys *
1) "cname"

  • exists:判断键值是否存在

127.0.0.1:6379[3]> set ttyy aa
OK
127.0.0.1:6379[3]> exists ttyy
(integer) 1
127.0.0.1:6379[3]> 

  • del:删除当前数据库的指定key

127.0.0.1:6379> set cname aa
OK
127.0.0.1:6379> keys *
1) "cname"
127.0.0.1:6379> exists cname
(integer) 1
127.0.0.1:6379> del cname
(integer) 1
127.0.0.1:6379> keys *
(empty list or set)


  • type:获取key对应的value值类型

127.0.0.1:6379[3]> set ttyy aa
OK
127.0.0.1:6379[3]> type ttyy
string


  • rename(覆盖)/ renamenx(不覆盖):对已有的key进行重命名

127.0.0.1:6379[3]> rename ttyy zznn
OK
127.0.0.1:6379[3]> keys *
1) "zznn"
127.0.0.1:6379[3]> 

  • dbsize:查看当前数据库中key的数目

127.0.0.1:6379[3]> keys *
1) "zznn"
127.0.0.1:6379[3]> dbsize
(integer) 1
127.0.0.1:6379[3]> 

其他常用redis命令


flushdb	'//清空库'

192.168.79.133:6379> move uuu 11	'//将uuu键值对移动到第12个库'
(integer) 1

四、redis-benchmark测试工具

  • -h:指定服务器主机名

  • -p:指定服务器端口

  • -c:指定并发连接数

  • -n:指定请求数

  • -d:以字节的形式指定SET/GET值的数据大

  • 向IP地址为192.168.75.134、端口为6379的Redis服务器发送100个并发连接与100000个请求测试性能


[root@localhost redis]# /usr/local/redis/bin/redis-benchmark -h 192.168.75.134 -p 6379 -c 100 -n 100000
====== PING_INLINE ======
  100000 requests completed in 0.89 seconds
  100 parallel clients
  3 bytes payload
  keep alive: 1

98.42% <= 1 milliseconds
100.00% <= 2 milliseconds
112107.62 requests per second

====== PING_BULK ======
  100000 requests completed in 0.91 seconds
  100 parallel clients
  3 bytes payload
  keep alive: 1

98.20% <= 1 milliseconds
99.91% <= 2 milliseconds
100.00% <= 3 milliseconds
100.00% <= 3 milliseconds
109649.12 requests per second

====== SET ======
  100000 requests completed in 0.96 seconds
  100 parallel clients
  3 bytes payload
  keep alive: 1

96.26% <= 1 milliseconds
99.65% <= 2 milliseconds
99.93% <= 3 milliseconds
99.94% <= 4 milliseconds
99.99% <= 5 milliseconds
100.00% <= 5 milliseconds
103626.95 requests per second

====== GET ======
  100000 requests completed in 0.99 seconds
  100 parallel clients
  3 bytes payload
  keep alive: 1

95.36% <= 1 milliseconds
99.67% <= 2 milliseconds
99.99% <= 3 milliseconds
100.00% <= 3 milliseconds
100704.94 requests per second


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

[root@localhost redis]# /usr/local/redis/bin/redis-benchmark -h 192.168.75.134 -p 6379 -q -d 100
PING_INLINE: 120481.93 requests per second
PING_BULK: 120627.27 requests per second
SET: 118063.76 requests per second
GET: 118483.41 requests per second
INCR: 118623.96 requests per second
LPUSH: 115473.45 requests per second
RPUSH: 116822.43 requests per second
LPOP: 116009.28 requests per second
RPOP: 116686.12 requests per second
SADD: 119904.08 requests per second
HSET: 120481.93 requests per second
SPOP: 118623.96 requests per second
LPUSH (needed to benchmark LRANGE): 119474.31 requests per second
LRANGE_100 (first 100 elements): 52938.06 requests per second
LRANGE_300 (first 300 elements): 21810.25 requests per second
LRANGE_500 (first 450 elements): 12210.01 requests per second
LRANGE_600 (first 600 elements): 8411.14 requests per second
MSET (10 keys): 101626.02 requests per second

五、Redis多数据库操作

  • Redis支持多数据库,默认支持16个数据库,0-15命名
  • 多数据库相互独立,互不干扰
  • 多数据库常用命令
  • 多数据库间切换
  • 多数据库间移动数据
  • 清除数据库内数据

四、 Redis持久化

4.1 持久化概述

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

4.2 持久化分类

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

4.3 Redis的默认持久化方式

  • 默认文件名dump.rdb
  • 触发条件

优缺点

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

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

4.4 RDB持久化

  • 通过RDB文件恢复数据
  • 将dump.rdb 文件拷贝到redis的安装目录的bin目录下,重启redis服务即可

配置文件选项

vim /etc/redis/6379.conf  
save 900 1 
save 300 10
save 60 10000
dbfilename dump.rdb
dir /var/lib/redis/6379
rdbcompression yes

save 900 1
save 300 10
save 60 10000

  • 900秒之内至少一次写操作、300秒之内至少发生10次写操作、60秒之内发生至少10000次写操作,只要满足其一都会触发快照操作,注释所有的save项表示关闭RDB
    dbfilename dump.rdb ##RDB文件名称

dir /var/lib/redis/6379 ##RDB文件路径

rdbcompression yes ##是否进行压缩

4.5 AOF持久化

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

4.6 根据AOF文件恢复数据

  • 将appendonly.aof 文件拷贝到Redis的安装目录的bin目录下,重启Redis服务即可

配置文件选项


vim /etc/redis/6379.conf
appendonly yes  ##开启AOF持久化
appendfilename "appendonly.aof "  ##AOF文件名称
# appendfsync always
appendfsync everysec   
##always:同步持久化,每次发生数据变化会立刻写入磁盘
##everysec:默认推荐,每秒异步记录一次(默认值)
##no:不同步,交给操作系统决定如何同步

# appendfsync no
aof-load-truncated yes  ##忽略最后一条可能存在问题的指令

4.7 AOF的重写机制

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

4.8 AOF重写的原理

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

4.9 AOF的重写配置


vim /etc/redis/6379.conf

# 在日志进行BGREWRITEAOF时,如果设置为yes表示新写操作不进行同步fsync,只是暂存在缓冲区里,避免造成磁盘IO操作冲突,等重写完成后在写入。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性能管理

5.1 查看Redis内存使用


[root@master1 ~]# /usr/local/redis/bin/redis-cli
127.0.0.1:6379> info memory
[root@localhost redis]# redis-cli 
127.0.0.1:6379> info memory
# Memory
used_memory:11768208
used_memory_human:11.22M  ##内存的使用
used_memory_rss:26865664
used_memory_rss_human:25.62M
used_memory_peak:25172352
used_memory_peak_human:24.01M
used_memory_peak_perc:46.75%
used_memory_overhead:841542
used_memory_startup:791400
used_memory_dataset:10926666
used_memory_dataset_perc:99.54%
allocator_allocated:12203688
allocator_active:12582912
allocator_resident:21553152
total_system_memory:4254142464
total_system_memory_human:3.96G
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:379224
allocator_rss_ratio:1.71
allocator_rss_bytes:8970240
rss_overhead_ratio:1.25
rss_overhead_bytes:5312512
mem_fragmentation_ratio:2.29   ##内存的碎片率
mem_fragmentation_bytes:15138480
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

5.2 Redis性能管理

5.2.1 内存碎片率

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

5.2.2 内存使用率

  • redis实例的内存使用率超过可用最大内存,操作系统将开始进行内存与swap空间交换

5.2.3 避免内存交换

  • 针对缓存数据大小选择
  • 尽可能的使用Hash数据结构
  • 设置key的过期时间

5.2.4 回收key

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

你可能感兴趣的:(非关系型数据库,redis)