文章目录
数据库类型
关系型数据库
●一个结构化的数据库,创建在关系模型基础上
●一个面向于记录
●包括
- Oracle MysQL SQL Server Microsoft Access DB2等
非关系型数据库
●除了主流的关系型数据库外的数据库,都认为是非关系型
●包括
- Redis MongBD Hbase CouhDB等
非关系数据库产生背景
●High performance-----对数据库高并发读写需求
●Huge Storage-----对海量数据高效存储与访问需求
●High Scalability && High Availability-------对数据库高可扩展性与高可用性需求
●非关系型数据库,解决并发和海量存储
Redis简介
●Redis基于内存运行并支持持久化
●采用key-vlue(键值对)的存储形式
●优点
- 具有极高的数据读写速度,反复拿数据
- 支持丰富的数据类型;提取数据时可以直接提取,不需要进行数据类型转换
- 支持数据的持久化
- 原子性
- 支持数据件形式备份
Redis安装部署
操作步骤:
- 解压软件包
- make && make install
- 设置Redis相关配置文件
- 查看运行状态
1.编译安装redis数据库
[root@localhost ~]# setenforce 0
[root@localhost ~]# iptables -F
[root@localhost ~]# yum -y install gcc gcc-c++ ##安装环境包
用xhell将工具放到家目录下
[root@localhost ~]# tar zxvf redis-5.0.7.tar.gz -C /opt ##将工具解压到/opt目录下
[root@localhost redis-5.0.7]# cd /opt/redis-5.0.7/ ##切换到数据库目录下
[root@localhost redis-5.0.7]# make ##直接make
[root@localhost redis-5.0.7]# make PREFIX=/usr/local/redis/ install ##指定目录并安装
[root@localhost bin]# ln -s /usr/local/redis/bin/* /usr/local/bin/ ##将redis命令建立软连接方便系统识别
2.执行redis配置文件脚本,并进行配置
[root@localhost ~]# cd /opt/redis-5.0.7/
[root@localhost redis-5.0.7]# cd utils/ ##回到redis源码包解压目录
[root@localhost utils]# ./install_server.sh
优化一些redis的配置:
[root@localhost utils]# /etc/init.d/redis_6379 stop ##先关闭redis服务
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
[root@localhost utils]# netstat -ntap | grep 6379 ##查看服务情况
[root@localhost utils]# /etc/init.d/redis_6379 start
Starting Redis server...
设置Redis相关配置文件
[root@localhost ~]# cd /opt/redis-5.0.7/
[root@localhost redis-5.0.7]# cd utils/ ##回到redis源码包解压目录
[root@localhost utils]# ./install_server.sh
Redis进程控制
[root@localhost utils]# /etc/init.d/redis_6379 stop ##关闭服务
[root@localhost utils]# /etc/init.d/redis_6379 start ##开启服务
[root@localhost utils]# /etc/init.d/redis_6379 status ##查看状态
Redis is running (66325)
[root@localhost utils]# /etc/init.d/redis_6379 restart ##重启服务
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
Starting Redis server...
Redis配置文件
- 配置参数()
- Bind:监听的主机地址
- Port:端口
- Daemonize yes:启用守护进程
- Pidfile:指定PID文件
- Loglevel notice:日志级别
- Logfile:指定日志文件
Redis数据库常用命令
Redis-cli命令行工具
连接本地数据库
[root@localhost utils]# redis-cli ##直接登录
连接远程数据库
设置监听端口,启动服务
[root@localhost utils]# vim /etc/redis/6379.conf ##修改配置文件
# JUST COMMENT THE FOLLOWING LINE.
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bind 127.0.0.1 192.168.148.136 ##设置监听地址
[root@localhost utils]# /etc/init.d/redis_6379 stop ##关闭服务
[root@localhost utils]# /etc/init.d/redis_6379 start ##开启服务
[root@localhost utils]# redis-cli -h 192.168.148.136 -p 6379 ##根据本地地址和端口登录(要是在配置文件中设置的)
获取命令帮助
help @:获取中的命令帮助
192.168.148.136:6379> help @list ##获取list的命令帮助
Help :获取某个命令的帮助
192.168.148.136:6379> help set ##获取set命令的帮助
Set:存放数据
192.168.148.136:6379> set color red ##存放color键;值为red
OK
Get:获取数据
192.168.148.136:6379> get color ##获取键的数据
"red"
key相关命令
●Keys:获取符合规则的键值列表
192.168.148.136:6379> keys * ##显示创建的键值
1) "color" ##创建的color键
●Exists:判断键值是否存在
192.168.148.136:6379> EXISTS color ##判断color键值是否存在
(integer) 1 ##操作成功的话返回的是非0值
192.168.148.136:6379> EXISTS name ##判断name键值是否存在
(integer) 0 ##操作不成功的话返回的是0
●Del:删除当前数据库的指定key
192.168.148.136:6379> set name lisi ##先创建一个键“name”
OK
192.168.148.136:6379> get name
"lisi"
192.168.148.136:6379> del name ##将name键删除
(integer) 1
192.168.148.136:6379> keys * ##name键被删除了
1) "color"
●Type:获取key对应的value值类型
192.168.148.136:6379> type color ##color值的类型
String ##字符串类型为整形
192.168.148.136:6379> set score 88
OK
192.168.148.136:6379> type score
String ##数字的类型也是整形
●Rename(覆盖) /renamenx(不覆盖):对已有的key进行重命名
192.168.148.136:6379> rename score sprit ##将score的键名改为sprit
OK
●Dbsize:查看当前数据库中key的数目
192.168.148.136:6379> keys * ##先显示数据库中的key
1) "sprit"
2) "color"
3) "add"
192.168.148.136:6379> dbsize ##当前库的key的数目为3
(integer) 3
●还有一些模糊查询的方法:
192.168.148.136:6379> keys spr* ##*直接都过滤出来
1) "sprit"
192.168.148.136:6379> keys spr?? ##一个?代表一个字符
1) "sprit"
Redis-benchmark测试工具
- -h:指定服务器主机名
- -p:指定服务器端口
- -c:指定并发连接数
- -n:指定请求数
- -d:以字节的形式指定SET/GET值的数据大小
- -q:强制退出Redis,仅显示query/sec值
举例:
●向IP地址为192.168.148.136,端口为6379的Redis服务器发送100个并发连接与100000个请求测试性能
[root@localhost utils]# /usr/local/redis/bin/redis-benchmark -h 192.168.148.136 -p 6379 -c 100 -n 100000
●测试存取大小为100字节的数据的性能
[root@localhost utils]# /usr/local/redis/bin/redis-benchmark -h 192.168.148.136 -p 6379 -q -d 100
Redis多数据库操作
●Redis支持多数据库,默认支持16个数据库,0-15命名
●多数据库相互独立,互不干扰
●多数据库常用命令
- 多数据库间切换
192.168.148.136:6379> select 5 ##切换至5数据库
OK
192.168.148.136:6379[5]> set name wangwu ##在5数据库创建数据
OK
192.168.148.136:6379[5]> get name ##调用name数据
"wangwu"
- 多数据库间移动数据
192.168.148.136:6379[5]> move name 6 ##将5数据库的name键移动到6数据库
(integer) 1
192.168.148.136:6379[5]> select 6
OK
192.168.148.136:6379[6]> keys *
1) "name"
192.168.148.136:6379[6]> get name ##数据移到6数据库中
"wangwu"
- 清除数据库内数据
192.168.148.136:6379[6]> flushdb ##清空数据库
OK
192.168.148.136:6379[6]> keys * ##数据库被清除了
(empty list or set)
●设置hash结构
- 结构类型:hset 对象名 属性名 值
192.168.148.136:6379> hset student name zhaoliu ##定义student对象;属性名为name 值为zhaoliu
(integer) 1
192.168.148.136:6379> hset student age 20 ##定义student对象;属性名为age 值为20
(integer) 1
192.168.148.136:6379> hset student score 90 ##定义student对象;属性名为score 值为90
(integer) 1
查看属性方式:
- 格式:hget 对象名 属性名
192.168.148.136:6379> hget student name ##调用student中的name属性
"zhaoliu"
192.168.148.136:6379> hget student age ####调用student中的age属性
"20"
Redis持久化
持久化概述
●Redis是运行在内存中,内存中的数据断电丢失
●为了能够重用Redis数据,或者防止系统故障,需要将Redis中的数据写入到磁盘空间中,即持久化
持久化分类
●RDB方式:创建快照的方式获取某一时刻Redis中所有数据副本
- RDB的缺点:快照只能基于一个时间点,不可以连续,上一个快照的时间点到下一个快照的开始的时间点中间会有盲区,可能会造成少量的数据丢失
●AOF方式:将执行的写命令写到文件的末尾,以日志的方式来记录数据的变化
- AOF缺点:日志文件量多的话,需要逆向恢复数据库,一条一条去恢复,人力成本大
●生产环境两种方式叠加使用:AOF+RDB
- 先恢复RDB快照,中间短暂的盲区用AOF的方式去恢复
Redis的默认持久化方式
默认文件名dump.rdb;文件位置放在:/var/lib/redis/6379
触发条件
- 在指定的时间间隔内,执行指定次数的写操作(配置文件控制)
- 执行save或者是bgsave(异步)命令
- 执行flushall命令,清空数据库所有数据(此命令慎用)
- 执行shutdown命令,保证服务器正常关闭且不丢失任何数据
优缺点:
- 适合大规模的数据恢复
- 如果业务对数据完整性和一致性要求不高,RDB是很好的选择
- 数据的完整性和一致性不高
- 备份时占用内存
通过RDB文件恢复数据
- 将dump.rdb文件拷贝到redis的安装目录的bin目录下,重启redis服务即可
配置文件选项
[root@localhost 6379]# vim /etc/redis/6379.conf
# like in the following example:
#
# save ""
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 ##是否进行压缩
AOF持久化
●Redis默认不开启
●弥补RDB的不足(数据的不一致性)
●采用日志的形式来记录每个写操作,并追加到文件中
●Redis重启会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作
●根据AOF文件恢复数据
将appendonly.aof文件拷贝到redis安装目录的bin目录下,重启redis服务即可
[root@localhost 6379]# vim /etc/redis/6379.conf
appendonly yes ##修改为yes即可开启AOF持久化
appendfilename "appendonly.aof" ##AOF文件名称
# appendfsync always ##always:同步持久化,每次发生数据变化会立刻写入磁盘
appendfsync everysec ##everysec:默认推荐,每秒异步记录次(默认值)
# appendfsync no ##no:不同步,交给操作系统决定如何同步
##取消注释的时候注意前方空格,一定要删掉
aof-load-truncated yes ##忽略最后一条可能存在问题的指令
●AOF重写机制
概述
- AOF的工作原理是将写操作追加到文件中,文件的冗余内容会越来越多
- 当AOF文件的大小超过所设定的阀值时,Redis就会对AOF文件的内容压缩
原理
*Redis会fork出一条新进程,读取内存中的数据(并没有读取旧文件),并重新写到一个临时文件中,最后替换旧的aof文件
●AOF重新配置
[root@localhost 6379]# vim /etc/redis/6379.conf
no-appendfsync-on-rewrite no ##在日志进行BGREWRITEAOF时, 如果设置为yes表示新写操作不进行同步fsync,只暂存在缓冲区里,避免造成磁盘I0操作冲突,等重写完成后在写入。redis中默认为no
auto-aof-rewrite-percentage 100 ##当前AOF文件大小是上次日志重写时AOF文件大小两倍时,发生BGREWRITEAOF操作
auto-aof-rewrite-min-size 64mb ##当前AOF文件执行BGREWRITEAOF命令的最小值,避免刚开始启动Reids时由于文件尺寸较小导致频繁的BGREWRITEAOF.当AOF文件到达64M的时候,发生BGREWRITEAOF操作
Redis性能管理
查看Redis内存使用
[root@localhost 6379]# redis-cli -h 192.168.148.136 -p 6379
192.168.148.136:6379> info memory
used_memory:11767696 ##内存使用总量
used_memory_human:11.22M
......
mem_fragmentation_ratio:2.23 ##内存碎片率
内存碎片率
●操系统分配的内存值used_memory_rss除以redis使用的内存值
used_ _memory计算得出
●内存碎片是由操作系统低效的分配/回收物理内存导致的
- 不连续的物理内存分配
●跟踪内存碎片率对理解redis实例的资源性能是非常重要的
- 内存碎片率稍大于1是合理的,这个值表示内存碎片率比较低
- 内存碎片率在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:禁止淘汰数据