缓存加速——NoSQL之Redis配置与优化实操

缓存加速——NoSQL之Redis配置与优化实操

  • 一:关系数据库与非关系型数据库
    • 1.1:关系型数据库
    • 1.2:非关系型数据库
    • 1.3:非关系型数据库产生背景
  • 二:Redis
    • 2.1:简介
    • 2.2:Redis安装部署
    • 2.3:Redis数据库常用命令
    • 2.4:Redis多数据库操作
    • 2.5:Redis持久化
      • 2.5.1:持久化概述
      • 2.5.2:持久化分类(重点)
    • 2.6:RDB持久化
    • 2.7:AOF持久化
    • 2.8:Redis性能管理
    • 2.9:设置hash结构
    • 2.10:设置过期时间
  • 三:源码编译Redis以及数据库操作

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

1.1:关系型数据库

  • 一个结构化的数据库,创建在关系模型基础上
  • 一般面向于记录
  • 包括
    • Oracle、Mysql、SQL Server、Microsoft Access、DB2等

1.2:非关系型数据库

  • 除了主流的关系型数据库外的数据库,都认为是非关系型
  • 包括
    • Redis、MongoDB、Hbase、CouhDB等

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

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

二:Redis

2.1:简介

  • Redis基于内存运行并支持持久化

  • 采用key-value(键值对)的存储形式

  • 优点

    • 具有极高的数据读写速度
    • 支持丰富的数据类型
    • 支持数据的持久化
    • 原子性
    • 支持数据备份
  • redis(remote dictionary server,远程字典服务)是一个开源的使用ANSI C语言编写、遵守BSD协议,支持网络,可基于内存可持久化的日志型、key-Value的数据库,并提供多种语言的API。它通常被称为结构服务器,因为值(value)可以是字符串(string),哈希(hash),列表(list),集合(sets)和有序集合(sorted sets)等类型

  • redis是完全开源免费的,是一个高性能的key-value数据库

  • redis的特点

    redis支持数据的持久化,可以将内存中的数据库保存在磁盘中,重启的时候可以再次加载进行使用

    redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储

    redis支持数据的备份,即master-slave模式的数据备份(下一篇将会详述redis群集)

  • redis与其他key-value的不同

    redis有着更为复杂的数据结构并且提供对他们的原子操作,这是一个不同于其他数据库的进化路径。redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象

    redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据不能大于硬件内存。在内存数据库方面的另外一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式生产的,因为他们不需要进行随机访问

2.2:Redis安装部署

  • 操作步骤
    • 解压软件包
    • make && make install
    • 设置Redis相关配置文件
    • 查看运行状态
  • 编译安装Redis
tar zxvf redis-5.0.7 -C /opt
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/local/redis/bin/* /usr/local/bin/
  • 设置Redis相关配置文件
[root@localhost redis]# cd /usr/local/src/redis-4.0.9/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 [/varlog/redis_6379.log]
Selected default - /varllog/redis_6379.log
Please select the data directory for this instance [/varllib/redis/6379]
Selected default -/var/lib/redis/6379
Please select the redis executable path[/usr/local/redis/bin/redis-server
  • Redis进程控制
[root@localhost utils]# /etc/init.d/redis_6379 status
Redis is running (5436)
[root@localhost utils]# /etc/init.d/redis_6379 stop
Stopping ...
Redis stopped
[root@localhost utils]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@localhost utils]# /etc/init.d/redis_6379 restart
Stopping ...
Redis stopped
Starting Redis server...
  • 配置参数
    • bind:监听的主机地址
    • port:端口
    • daemonize yes:启用守护进程
    • pidfile:指定PID文件
    • loglevel notice:日志级别
    • logfile:指定日志文件

2.3:Redis数据库常用命令

  • 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>
  • 获取命令帮助

    • help @:获取中的命令列表
    • help :获取某个命令的帮助
    • help :获取可能帮助的主题列表
  • 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"
  • key相关
    • keys:获取符号规则的键值列表
    • exists:判断键值是否存在
    • del:删除当前数据库的指定key
    • type:获取key对应的value值类型
    • rename(覆盖)/renamenx(不覆盖):对已有的key进行重命名
    • dbsize:查看当前数据库中key的数目
  • Redis-benchmark测试工具
    • -h:指定服务器主机名

    • -p:指定服务器端口

    • -c:指定请求数

    • -d:以字节的形式指定set/get值的数据大小

    • -q:强制退出Redis,仅显示query/sec值

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

[root@localhost ~]# /usr/local/redis/bin/redis-benchmark -h 192.168.10.161 -p 6379 -c 100-n 100000
  • 测试存取大小为100字节的数据包的性能
[root@localhost ~]# /usr/local/redis/bin/redis-benchmark -h 192.168.10.161 -p 6379 -q -d 100

2.4:Redis多数据库操作

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

2.5:Redis持久化

2.5.1:持久化概述

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

2.5.2:持久化分类(重点)

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

2.6:RDB持久化

  • Redis的默认持久化方式
  • 默认文件名dump.rdb
  • 触发条件
    • 在指定的时间间隔内,执行指定次数的写操作(配置文件控制)
    • 执行save或者是bgsave(异步)命令
    • 执行flush命令,清空数据库所有数据
    • 执行shutdown命令,保证服务器正常关闭且不丢失任何数据
  • 优缺点
    • 适合大规模的数据恢复
    • 如果业务对数据完整性和一致性要求不高,RDB是很好的选择
    • 数据的完整性和一致性不高
    • 备份时占用内存
  • 通过RDB文件恢复数据
    • 将dunp.rdb文件拷贝到Redis的安装目录的bin目录下,重启Redis服务即可
  • 配置文件选项
vim letc/redis/6379.conf
save 900 1    '900秒之内至少一次写操作、300秒之内至少发生10次写操作、60秒之内发生至少10000次写操作,只要满足其一都会触发快照操作,注释所有的save项表示关闭RDB'
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

2.7:AOF持久化

  • Redis默认不开启
  • 弥补RDB的不足(数据的不一致性)
  • 采用日志的形式来记录每个写操作,并追加到文件中
  • Redis重启会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作
  • 根据AOF文件恢复数据
    • 将appendonly.aof文件拷贝到Redis的安装目录的bin目录下,重启Redis服务即可
  • 配置文件选项
vim /etc/redis/6379.conf
appendonly yes     '开启AOF持久化'
appendfilename "appendonly.aof "   'AOF文件名称'
#appendfsync always					'always:同步持久化,每次发生数据变化会立刻写入磁盘
everysec:默认推荐,每秒异步记录—次(默认值)
no:不同步,交给操作系统决定如何同步'
appendfsync everysec
# appendfsync no
aof-load-truncated yes   '忽略最后一条可能存在问题的指令'
  • AOF的重写机制

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

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

#aof文件可能在尾部是不完整的,当redis启动的时候,aof文件的数据被载入内存。重启可能发生在redis所
在的主机操作系统宕机后,尤其在ext4文件系统没有加上data=ordered选项(redis宕机或者异常终止不会造
成尾部不完整现象。)出现这种现象,可以选择让redis退出,或者导入尽可能多的数据。如果选择的是yes,
当截断的aof文件被导入的时候,会自动发布一个log给客户端然后load。如果是no,用户必须手动redis-
check-aof修复AOF文件才可以
aof-load-truncated yes
 
#加载redis时,可以识别AOF文件以“redis”开头。
#字符串并加载带前缀的RDB文件,然后继续加载AOF尾巴
aof-use-rdb-preamble yes

2.8:Redis性能管理

  • 查看Redis内存使用
[root@master1~]# /usr/localredis/bin/redis-cli
127.0.0.1:6379>info memory
  • 内存碎片率

    • 操系统分配的内存值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-Iru:使用LRU算法从所有数据集合中淘汰数据
        • allkeys-random:从数据集合中任意选择数据淘汰
        • no-enviction:禁止淘汰数据

2.9:设置hash结构

20.0.0.51:6379> hset person name zhangsan
20.0.0.51:6379> hset person age 18
20.0.0.51:6379> hset person score 88
20.0.0.51:6379> hset people name lisi
(integer) 1
20.0.0.51:6379> keys *				'查询哪些键名'
1) "nannan"
2) "myset:__rand_int__"
3) "people"
4) "person"
5) "mylist"							'456是默认'
6) "key:__rand_int__"
7) "counter:__rand_int__"

2.10:设置过期时间

20.0.0.51:6379> set name lisi
oK
20.0.0.51:6379> expire name 20			'时间是秒,20秒后键名失效'
(integer)1

三:源码编译Redis以及数据库操作

  • 关闭防火墙和核心防护
iptables -F
setenforce 0
  • 安装环境源
yum install gcc gcc-c++ make -y
  • 解压源码包并安装编译
tar zxvf redis-5.0.7 -C /opt
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/local/redis/bin/* /usr/local/bin/
[root@localhost redis-5.0.7]# cd utils/
[root@localhost utils]# ./install_server.sh 
'......一直回车'
[root@localhost utils]# netstat -lunpt |grep redis
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      16935/redis-server  
  • 数据库操作
  [root@localhost init.d]# vim /etc/redis/6379.conf 
  bind 127.0.0.1 20.0.0.51    						'绑定本机地址'
  [root@redis init.d]# ls
  functions  netconsole  network  README  redis_6379	'redis_6379  服务管理脚本'
  [root@localhost init.d]# service redis_6379 restart     '重启服务'
  Stopping ...
  Redis stopped
  Starting Redis server...
  [root@localhost ~]# redis-cli -h 20.0.0.51 -p 6379    '-h远程指定地址,-p指定端口'
  [root@localhost ~]# redis-cli -h 127.0.0.1 -p 6379		'本地连接'
  20.0.0.51:6379> keys *
  (empty list or set)
  20.0.0.51:6379> set nannan man					'存放数据'
  OK
  20.0.0.51:6379> keys *
  1) "nannan"
  20.0.0.51:6379> get nannan						'获取数据'
  "man"
  20.0.0.51:6379> del lpf
  (integer) 1								'状态码返回1说明前面命令正确执行'
  										'状态码返回0说明前面命令错误执行'
  '服务的三大法宝'
  1.配置文件
  2.服务管理脚本 service systemctl 管理的脚本,一般要手撕
  3.命令脚本 自动生成										

你可能感兴趣的:(缓存,Redis,云计算)