文章目录
- 关系数据库与非关系型数据库
- 关系型数据库
- 非关系型数据库
- 非关系型数据库产生背景
- Redis简介
- Redis优点
- Redis配置文件
- 数据库常用命令
- redis-cli命令工具
- key相关命令
- redis-benchmark测试工具
- Redis多数据库操作
- Redis安装部署
- Redis持久化
- 持久化概述
- 持久化分类
- RDB持久化
- AOF持久化
- AOF文件恢复数据
- 配置文件选项
- AOF的重写机制
- AOF重写的原理
- AOF的重写配置
- Redis性能管理
- 查看Redis内存使用情况
- 内存使用率
- 回收key
- Redis安装部署及相关操作配置示例
关系数据库与非关系型数据库
关系型数据库
—个结构化的数据库,创建在关系模型基础上,库中存表,表中存数据
- 一般面向于记录
- 包括Oracle、MySQL、sQLServer、Microsoft Access、DB2等
非关系型数据库
除了主流的关系型数据库外的数据库,都认为是非关系型
- 包括Redis、MongBD、Hbase、CouhDB等
非关系型数据库产生背景
- High performance——对数据库高并发读写需求
- Huge Storage——对海量数据高效存储与访问需求
- High Scalability && High Availability——对数据库高可扩展性与高可用性需求
Redis简介
Redis基于内存运行并支持持久化,采用key-value(键值对)的存储形式。在Redis中存取高热数据(频繁存取的数据),从Redis中读取数据的时候,不需要进行数据的类型转换,所以可以达到极高的数据读写速度,这与从数据库中提拿数据不同,在Java中连接数据库取数据时是需要进行数据类型的转换的,这样就会占据很多的资源。
Redis优点
- 具有极高的数据读写速度
- 支持丰富的数据类型
- 支持数据的持久化
- 原子性
- 支持数据备份
Redis配置文件
常用配置参数,配置文件/etc/redis/6379.conf
- bind:监听的主机地址
- port:端口
- daemonize yes:启用守护进程
- pidfile:指定PID文件
- loglevel notice:日志级别
- logfile:指定日志文件
数据库常用命令
redis-cli命令工具
连接本地数据库
- redis-cli
连接远程数据库
- redis-clli -h 192.168.10.161 -p 6379
如果没有对命令进行过管理,系统无法识别Redis命令,就要使用命令的绝对路径
- /usr/local/redis/bin/redis-cli
获取命令帮助
- help @:获取中的命令列表
- help :获取某个命令的帮助
- help :获取可能帮助的主题列表
存放获取数据
- set:存放数据
- get:获取数据
key相关命令
键相关命令
- keys:获取符合规则的键值列表
- exists:判断键值是否存在
- del:删除当前数据库的指定key
- type:获取key对应的value值类型
- rename(覆盖)l renamenx(不覆盖)∶对已有的key进行重命名
- dbsize:查看当前数据库中key的数目
redis-benchmark测试工具
redis-benchmark工具一般对Redis数据库进行压测
- -h:指定服务器主机名
- -p:指定服务器端口
- -c:指定并发连接数
- -n:指定请求数
- -d:以字节的形式指定SET/GET值的数据大小
- -q:强制退出Redis,仅显示query/sec值
如以下操作可压测
向IP地址为192.168.10.161、_端口为6379的Redis服务器发送100个并发连接与100000个请求测试性能
[root@localhost ~]#/usrlocal/redis/bin/redis-benchmark -h192.168.10.161-p 6379-c 100-n 10000o
测试存取大小为100字节的数据包的性能
[root@localhost~]#lusr/local/redis/bin/redis-benchmark -h192.168.10.161-p 6379-q-d 100
Redis多数据库操作
Redis支持多数据库,默认支持16个数据库,0-15命名
- 多数据库相互独立,互不干扰
- 多数据库常用命令
- 多数据库间切换
- 多数据库间移动数据
- 清除数据库内数据
Redis安装部署
操作步骤大致为:
- 解压软件包
- make && make install
- 设置Redis配置文件
- 查看运行状态
Redis持久化
持久化概述
- Redis是运行在内存中,内存中的数据断电丢失
- 为了能够重用Redis数据,或者防止系统故障,需要将Redis中的数据写入到磁盘空间中,即持久化
持久化分类
- RDB方式:创建快照的方式获取某一时刻Redis中所有数据的副本
- AOF方式:将执行的写命令写到文件的末尾,以日志的方式来记录数据的变化
RDB持久化
Redis的默认持久化方式,默认文件名dump.rdb
触发条件
- 在指定的时间间隔内,执行指定次数的写操作(配置文件控制)
- 执行save或者是bgsave(异步)命令
- 执行flushall命令,清空数据库所有数据,这个命令谨慎操作
- 执行shutdown命令,保证服务器正常关闭且不丢失任何数据
优缺点
- 适合大规模的数据恢复
- 如果业务对数据完整性和一致性要求不高,RDB是很好的选择
- 数据的完整性和一致性不高,基于时间点的备份,在两次快照间隔期间为盲点
- 备份时占用内存
通过RDB文件恢复数据
通过RDB文件进行数据恢复,将dump.rdb文件拷贝到redis的安装目录的bin目录下,重启redis服务即可
配置文件选项
vim letc/redis/6379.conf
##900秒之内至少一次写操作、300秒之内至少发生10次写操作、60秒之内发生至少10000次写操作,只要满足其一都会触发快照操作,注释所有的save项表示关闭RDB
save 900 1
save 300 10
save 60 10000
## RDB文件名称
dbfilename dump.rdb
##RDB文件路径
dir /var/lib/redis/6379
是否进行压缩
rdbcompression yes
AOF持久化
Redis默认不开启,可弥补RDB的不足(数据的不一致性),采用日志的形式来记录每个写操作,并追加到文件中,Redis 重启会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
AOF文件恢复数据
将appendonly.aof文件拷贝到Redis的安装目录的bin目录
下,重启Redis服务即可
配置文件选项
vim letc/redis/6379.conf
appendonly yes
appendfilename "appendonly.aof "
# appendfsync always
appendfsync everysec
# appendfsync no
aof-load-truncated yes
AOF的重写机制
AOF的工作原理是将写操作追加到文件中,文件的冗余内容会越来越多
当AOF文件的大小超过所设定的阈值时,Redis就会对AOF文件的内容压缩
AOF重写的原理
Redis会fork出一条新进程,读取内存中的数据(并没有读
取旧文件),并重新写到一个临时文件中,最后替换旧的
aof文件
AOF的重写配置
大概为不缓存中避免造成冲突、去重和缓存空间
vim letc/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性能管理
查看Redis内存使用情况
使用命令info memory
[rootmaster1~]#/usr/local/redis/bin/redis-cli
127.0.0.1:6379>info memory
#Memory
##内存使用总量
used memory:2650536
used memory human:2.53M
used memory rss:12120064
used memory rss_human:11.56M
used_memory peak:2650536
used_memory peak_human:2.53M
used memory peakperc:10o.o0%
used_memory overhead:2573336
used memory startup:1458272
used_memory_dataset:77200
used_memory dataset perc:6.48%
total system'memory:1912078336
totai_system memory human:1.78G
used memory lua:37888
used memory iua_ human:37.00K
maxmemory:o
maxmemory human:0B
maxmemory policy:noeviction
mem_fragmentation_ratio:4.57 ##内存碎片率
mem_allocator:jemalloc-4.0.3
active_defragrunning:o
lazyfreeperding_objects:o
###内存碎片率
- 操系统分配的内存值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:禁止淘汰数据
Redis安装部署及相关操作配置示例
Redis安装部署
[root@localhost ~]#yum -y install gcc gcc-c++
[root@localhost ~]#tar zxvf redis=5.0.7.tar.gz
[root@localhost ~]#cd redis-5.0.7/
[root@localhost ~]#make
[root@localhost ~]#make PREFIX=/usr/local/redis install
[root@localhost ~]#ln -s /usr/local/redis/bin/* /usr/local/bin/
[root@localhost ~]# cd 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/bin/redis-server]
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!
[root@localhost ~]# ls /usr/local/reids/bin/
redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-sentinel redis-server
这里面的几个可执行文件,benchmark为压测、aof和rdb为持久化的文件、cli用户端管理命令
[root@localhost ~]# netstat -lutpn | grep redis
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 6118/redis-server 1
[root@localhost ~]# /etc/init.d/redis_6379 stop
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
[root@localhost ~]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@localhost ~]# /etc/init.d/redis_6379 restart
Stopping ...
Redis stopped
Starting Redis server...
[root@localhost ~]# /etc/init.d/redis_6379 status
Redis is running (6294)
[root@localhost ~]# vim /etc/redis/6379.conf
#前面的数字为行数,Redis配置文件里的内容基本上都是配置好的,咱们看看就好了
70 bind 127.0.0.1
93 port 6379
137 daemonize yes
159 pidfile /var/run/redis_6379.pid
167 loglevel notice
172 logfile /var/log/redis_6379.log
常用操作命令
登录数据库
[root@localhost ~]# redis-cli
获取命令帮助
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
#keys可查看键
127.0.0.1:6379> keys *
(empty list or set)
#创建键与值
127.0.0.1:6379> set color yellow
OK
127.0.0.1:6379> keys *
1) "color"
#查看值
127.0.0.1:6379> get color
"yellow"
127.0.0.1:6379> set person st
OK
127.0.0.1:6379> keys *
1) "person"
2) "color"
127.0.0.1:6379> get person
"st"
#删除键
127.0.0.1:6379> del color
(integer) 1
127.0.0.1:6379> keys *
1) "person"
#因为之前已经删过color了,没有这个键,所以错误操作返回0值
127.0.0.1:6379> del color
(integer) 0
#插入几个键值
127.0.0.1:6379> set games wzry
OK
127.0.0.1:6379> set dearing xy
OK
127.0.0.1:6379> keys *
1) "games"
2) "person"
3) "dearing"
#查询键值,*可匹配多个字符
127.0.0.1:6379> keys per*
1) "person"
#?可匹配一个字符
127.0.0.1:6379> keys per???
1) "person"
#判断键是否存在
127.0.0.1:6379> exists dearing
(integer) 1
127.0.0.1:6379> exists people
(integer) 0
#查看值类型
127.0.0.1:6379> type games
string
#重命名
127.0.0.1:6379> rename person man
OK
127.0.0.1:6379> keys *
1) "games"
2) "man"
3) "dearing"
127.0.0.1:6379>
redis-benchmark测试工具
给Redis并发连接100总请求数10000,查看下SET和GET的速度
[root@localhost ~]# redis-benchmark -h 127.0.0.1 -p 6379 -c 100 -n 10000
...
====== SET ======
10000 requests completed in 0.09 seconds
100 parallel clients
3 bytes payload
keep alive: 1
90.57% <= 1 milliseconds
97.74% <= 2 milliseconds
99.94% <= 3 milliseconds
100.00% <= 3 milliseconds
107526.88 requests per second
====== GET ======
10000 requests completed in 0.09 seconds
100 parallel clients
3 bytes payload
keep alive: 1
测试存取大小为100字节的数据包的性能
[root@localhost ~]# redis-benchmark -h 127.0.0.1 -p 6379 -q -d 100
SET: 119760.48 requests per second
GET: 121802.68 requests per second
持久化
RDB持久化是默认开启的
[root@localhost ~]# vim /etc/redis/6379.conf
#触发快照操作的规则,若注释所有save,表示关闭RDB
# save ""
save 900 1
save 300 10
save 60 10000
#RDB的文件名
# The filename where to dump the DB
dbfilename dump.rdb
#RDB文件的存放路径
dir /var/lib/redis/6379
#压缩
rdbcompression yes
AOF持久化,默认是关闭的,相关配置基本上都是配好的,要开启的话只要改yes
[root@localhost ~]# vim /etc/redis/6379.conf
#AOF默认是关闭的,要开启的话吧no改成yes
appendonly no
#aof文件名
appendfilename "appendonly.aof"
#aof模式
# appendfsync always
appendfsync everysec
# appendfsync no
aof-load-truncated yes
回收key
[root@localhost 6379]# vim /etc/redis/6379.conf
#可设置多种模式,默认是关闭的,相关模式上文已经说明过了
# The default is:
#
# maxmemory-policy noeviction