文章目录
前言
关系型数据库
- 一个结构化的数据库,创建在关系模型基础上
- 一般面向于记录
包括Oracle、MySQL、sQL Server、Microsoft Access、DB2等
非关系型数据库
- 除了主流的关系型数据库外的数据库,都认为是非关系型
包括Redis、MongBD、Hbase、CouhDB等
非关系型数据库产生的背景
- High performance一对数据库高并发读写需求
- Huge Storage——对海量数据高效存储与访问需求
- High Scalability && High Availability——对数据库高可扩展性与高可用性需求
一、Redis简介
Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
Redis的主要特点
- Redis基于内存运行并支持持久化
- 采用key-value(键值对)的存储形式
优点
- 具有极高的数据读写速度
- 支持丰富的数据类型
- 支持数据的持久化
- 原子性
- 支持数据备份
二、Redis的安装部署
安装环境组件编译器,编译安装redis
[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 '指定redis目录并安装'
[root@localhost redis-5.0.7]# cd /usr/local/redis/
[root@localhost redis]# ls
bin
[root@localhost redis]# cd bin/
[root@localhost bin]# ls
redis-benchmark redis-check-rdb redis-sentinel
redis-check-aof redis-cli redis-server
执行redis配置文件脚本,并进行配置
[root@localhost bin]# cd /opt/redis-5.0.7/utils/ '回到redis源码包解压目录'
[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] '选择redis默认接口,直接回车'
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf] '选择redis默认配置文件名称,直接回车'
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log] '选择默认redis日志文件名称,直接回车'
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/bin/redis-server] '选择redis可执行文件路径'
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
Is this ok? Then press ENTER to go on or Ctrl-C to abort. '直接回车完成配置'
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
优化redis配置
[root@localhost utils]# ln -s /usr/local/redis/bin/* /usr/local/bin/ '将redis命令创建软连接,便于系统识别'
[root@localhost utils]# netstat -ntap |grep 6379
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 72538/redis-server
[root@localhost bin]# service redis_6379 stop '关闭redis服务'
Stopping ...
Redis stopped
[root@localhost bin]# service redis_6379 start '开启redis服务'
Starting Redis server...
[root@localhost bin]# netstat -ntap |grep 6379 '检查redis开启情况'
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 72620/redis-server
tcp 0 0 127.0.0.1:6379 127.0.0.1:55370 TIME_WAIT -
[root@localhost bin]# redis-cli
127.0.0.1:6379> keys *
(empty list or set)
设置监听端口,启动服务
[root@localhost bin]# vim /etc/redis/6379.conf '修改配置文件'
bind 127.0.0.1 192.168.179.124 '添加监听端口'
[root@localhost bin]# service redis_6379 restart
[root@localhost bin]# redis-cli -h 192.168.179.124 -p 6379 '指定端口登录'
192.168.179.124:6379> keys *
(empty list or set)
三、Redis数据库常用命令
3.1 Redis-cil命令行工具
获取命令帮助
help @<group>:获取<group>中的命令列表
help <command>:获取某个命令的帮助
help <tab>:获取可能帮助的主题列表
Redis-cil命令行工具
set:存放数据
get:获取数据
key相关命令
keys:获取符合规则的键值列表
exists:判断键值是否存在
del:删除当前数据库的指定key
type:获取key对应的value值类型
rename(覆盖)l renamenx(不覆盖):对已有的key进行
重命名
dbsize:查看当前数据库中key的数目
192.168.179.124:6379> help set '查看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
192.168.179.124:6379> set name zhangsan '创建键(name),值(zhangsan)'
OK
192.168.179.124:6379> set addr beijing '创建键(addr),值(beijing)'
OK
192.168.179.124:6379> keys *
1) "addr"
2) "name"
192.168.179.124:6379> keys na?? '查看na开头的4个字节的key'
1) "name"
192.168.179.124:6379> keys ad* '查看ad开头的key'
1) "addr"
192.168.179.124:6379> EXISTS name '查看name是否存在'
(integer) 1
192.168.179.124:6379> del addr '删除addr键'
(integer) 1
192.168.179.124:6379> keys *
1) "name"
192.168.179.124:6379> rename name user '将name键重命名为user'
OK
192.168.179.124:6379> keys *
1) "user"
192.168.179.124:6379> type user '查看user对应的值类型'
string
192.168.179.124:6379> dbsize '查看当前数据库中key的数目'
(integer) 1
3.2 redis-benchmark测试工具
-h:指定服务器主机名
-p:指定服务器端口
-c:指定并发连接数
-n:指定请求数
-d:以字节的形式指定SET/GET值的数据大小
-q:强制退出Redis,仅显示query/sec值
[root@localhost bin]# redis-benchmark -h 192.168.179.124 -p 6379 -c 100 -n 100000
'压测ip地址192.168.179.124,端口为6379,并发量100,请求量100000个'
====== SET ======
100000 requests completed in 1.18 seconds
100 parallel clients
3 bytes payload
keep alive: 1
====== GET ======
100000 requests completed in 1.18 seconds
100 parallel clients
3 bytes payload
keep alive: 1
[root@localhost bin]# redis-benchmark -h 192.168.179.124 -p 6379 -q -d 100
'压测IP地址为192.168.179.124,端口为6379,-q:强制退出redis,-d:指定字节数量'
SET: 84674.01 requests per second
GET: 86580.09 requests per second
3.3 Redis多数据库操作
- Redis支持多数据库,默认支持16个数据库,0-15命名
- 多数据库相互独立,互不干扰
- 多数据库常用命令
- 多数据库间切换
- 多数据库间移动数据
- 清除数据库内数据
[root@localhost bin]# redis-cli -h 192.168.179.124 -p 6379
192.168.179.124:6379> keys *
1) "myset:__rand_int__"
2) "user"
3) "key:__rand_int__"
4) "mylist"
5) "counter:__rand_int__"
192.168.179.124:6379> select 13 '进入第12个库'
OK
192.168.179.124:6379[13]> keys * '查看所有键'
(empty list or set)
192.168.179.124:6379[13]> select 0 '返回第一个库'
OK
192.168.179.124:6379> move user 13 '将user键值对移动到第13个库'
(integer) 1
192.168.179.124:6379> select 13
OK
192.168.179.124:6379[13]> keys *
1) "user"
192.168.179.124:6379[13]> get user '查看user键值'
"zhangsan"
192.168.179.124:6379[13]> flushdb '清空库'
OK
192.168.179.124:6379[13]> keys *
(empty list or set)
四、Redis持久化
持久化概述
- Redis是运行在内存中,内存中的数据断电丢失
- 为了能够重用Redis数据,或者防止系统故障,需要将Redis中的数据写入到磁盘空间中,即持久化
持久化分类
- RDB方式:创建快照的方式获取某一时刻Redis中所有数据的副本
- AOF方式:将执行的写命令写到文件的末尾,以日志的方式来记录数据的变化
4.1 RDB持久化
Redis的默认持久化方式
默认文件名dump.rdb
触发条件
- 在指定的时间间隔内,执行指定次数的写操作(配置文件控制)
- 执行save或者是bgsave(异步)命令
- 执行flushall命令,清空数据库所有数据
- 执行shutdown命令,保证服务器正常关闭且不丢失任何数据
优缺点
- 适合大规模的数据恢复
- 如果业务对数据完整性和一致性要求不高,RDB是很好的选择
- 数据的完整性和一致性不高
- 备份时占用内存
通过RDB文件恢复数据
- 将dump.rdb文件拷贝到redis的安装目录的bin目录下,重启redis服务即可
[root@localhost redis]# cd /var/lib/redis/6379/
[root@localhost 6379]# ls
dump.rdb
配置文件选项
[root@localhost 6379]# vim /etc/redis/6379.conf
save 900 1 '900秒之内至少一次写操作'
save 300 10 '300秒之内至少发生10次写操作'
save 60 10000 '60秒之内发生至少10000次写操作'
... '只要满足其一都会触发快照操作,注释所有的save项表示关闭RDB'
dbfilename dump.rdb 'RDB文件名称'
dir /var/lib/redis/6379 'RDB文件路径'
rdbcompression yes '是否进行压缩'
4.2 AOF持久化
- Redis默认不开启
- 弥补RDB的不足(数据的不一致性)
- 采用日志的形式来记录每个写操作,并追加到文件中
- Redis 重启会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作
根据AOF文件恢复数据
- 将appendonly.aof文件拷贝到Redis的安装目录的bin目录下,重启Redis服务即可
[root@localhost log]# cd /var/lib/redis/6379/
[root@localhost 6379]# ls
appendonly.aof dump.rdb
配置文件选项
[root@localhost 6379]# vim /etc/redis/6379.conf
appendonly yes '开启AOF持久化'
appendfilename "appendonly.aof" 'AOF文件名称'
# appendfsync always '同步持久化,每次发生数据变化会立刻写入磁盘'
appendfsync everysec '默认推荐,每秒异步记录一次(默认值)'
# appendfsync no '不同步,交给操作系统决定如何同步'
aof-load-truncated yes '忽略最后一条可能存在问题的指令'
AOF的重写机制
- AOF的工作原理是将写操作追加到文件中,文件的冗余内容会越来越多
- 当AOF文件的大小超过所设定的阈值时,Redis就会对AOF文件的内容压缩
AOF重写的原理
- Redis会fork出一条新进程,读取内存中的数据(并没有读取旧文件),并重新写到一个临时文件中,最后替换旧的aof文件
AOF的重写配置
[root@localhost 6379]# vim /etc/redis/6379.conf
no-appendfsync-on-rewrite no
'在日志进行BGREWRITEAOF时,如果设置为yes表示新写操作不进行同步fsync,只是暂存在缓冲区里,避免造成磁盘IO操作冲突,等重写完成后在写入。Redis中默认为no'
auto-aof-rewrite-percentage 100
'当前AOF文件大小是上次日志重写时AOF文件大小两倍时,发生BGREWRITEAOF操作'
auto-aof-rewrite-min-size 64mb
'当前AOF文件执行BGREWRITEAOF命令的最小值,避免刚开始启动Reids时由于文件尺寸较小导致频繁的BGREWRITEAOF'
五、Redis性能管理
查看Redis内存使用
[root@localhost 6379]# redis-cli
127.0.0.1:6379> info memory
# Memory
used_memory:853320 '内存使用总量'
used_memory_human:833.32K
used_memory_rss:3473408
......
allocator_frag_ratio:1.24
allocator_frag_bytes:406552
allocator_rss_ratio:4.44 '内存碎片率'
内存碎片率
- 操系统分配的内存值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:禁止淘汰数据