文章目录
一: Redis介绍
1.1: 关系型数据库与非关系型数据库
- 关系数据库与非关系型数据库
- 关系型数据库
一个结构化的数据库,创建在关系模型基础上
一般面向于记录
包括 Oracle、MySQL、SQL Server、Microsoft Access、DB2等 - 非关系型数据库
除了主流的关系型数据库外的数据库,都认为是非关系型
包括Redis、MongBD、Hbase、CouhDB等
- 关系型数据库
1.2: 关系型数据库产生背景
- 非关系型数据库产生背景
- High performance—对数据库高并发读写需求
- Huge Storage———对海量数据高效存储与访问需求
- High Scalability &&High Availability———对数据库高
- 可扩展性与高可用性需求
1.3: Redis简介
-
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优势
性能极高-redis的读的速度是110000次/s,写的速度是81000次/s
丰富的数据类型-redis支持二进制案例的strings,lists,hashes,sets以及ordered sets数据类型操作
原子-redis的所有操作都是原子性的,意思就是要么成功执行要么完全不执行。单个操作是原子性的,多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来
丰富的特性-redis还支持publish/subscribe通知,key过期等特性
-
redis与其他key-value的不同
redis有着更为复杂的数据结构并且提供对他们的原子操作,这是一个不同于其他数据库的进化路径。redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象
redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据不能大于硬件内存。在内存数据库方面的另外一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式生产的,因为他们不需要进行随机访问
二: Redis安装部署
2.1: 操作步骤
-
解压软件包 --> make && make install --> 设置Redis相关配置文件 --> 查看运行状态
-
在centos7系统上安装redis,具体步骤如下
1.下载redis的安装包 [root@localhost ~]# yum install vsftpd -y [root@localhost ~]# mount.cifs //192.168.1.150/qq-Download /mnt [root@localhost ~]# cd /mnt 2.通过yum工具,安装编译工具 [root@localhost ~]# yum install gcc gcc-c++ make -y 3.解压redis软件包 tar xzvf redis-5.0.7.tar.gz -C /opt 4.编译且安装 cd /opt/redis-5.0.7/ make make PREFIX=/usr/local/redis install 5.开启服务,设置各类文件 cd /opt/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/redis/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/redis/bin/redis-server Cli Executable : /usr/local/redis/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 redis]# netstat -natp | grep 6379 tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 6475/redis-server 1 6.创建软链接,便于服务控制 ln -s /usr/local/redis/bin/* /usr/local/bin/ 7.进入redis数据库 [root@localhost init.d]# vim /etc/redis/6379.conf bind 127.0.0.1 192.168.100.140 //绑定本机地址 [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 192.168.100.140 -p 6379 //-h远程指定地址,-p指定端口 [root@localhost ~]# redis-cli -h 127.0.0.1 -p 6379 //本地连接 192.168.100.140:6379> keys * (empty list or set) 192.168.100.140:6379> set nannan man "存放数据" OK 192.168.100.140:6379> keys * 1) "nannan" 192.168.100.140:6379> get nannan "获取数据" "man" 192.168.100.140:6379> del lpf (integer) 1 状态码返回1说明前面命令正确执行 状态码返回0说明前面命令错误执行 //服务的三大法宝 1.配置文件 2.服务管理脚本 service systemctl 管理的脚本,一般要手撕 3.命令脚本 自动生成
2.2: key相关命令
-
keys:获取符合规则的键值列表 exists:判断键值是否存在 del:删除当前数据库的指定key type:获取key对应的value值类型 rename(覆盖)/ renamenx(不覆盖)∶对已有的key进行 重命名 dbsize:查看当前数据库中key的数目
2.3: Redis数据库常用命令
-
Redis数据库常用命令
redis-benchmark测试工具 -h:指定服务器主机名 -p:指定服务器端口 -c:指定并发连接数 -n:指定请求数 -d:以字节的形式指定SET/GET值的数据大小 -q:强制退出Redis,仅显示query/sec值
//向IP地址为192.168.100.140、端口为6379的Redis服务器 发送100个并发连接与100000个请求测试性能 ====== GET ====== 10000 requests completed in 0.12 seconds 100 parallel clients 3 bytes payload keep alive: 1 ====== SET ====== 10000 requests completed in 0.12 seconds //时间需要0.12s 100 parallel clients 3 bytes payload keep alive: 1 ...... [root@localhost ~]# /usr/local/redis/bin/redis-benchmark -h 192.168.100.140 -p 6379 -c 100 -n 10000 //测试存取大小为100字节的数据包的性能 [root@localhost ~]# /usr/local/redis/bin/redis-benchmark -h 192.168.100.140 -p 6379 -q -d 100 LPUSH (needed to benchmark LRANGE): 86805.56 requests per second LRANGE_100 (first 100 elements): 51519.84 requests per second LRANGE_300 (first 300 elements): 24443.90 requests per second LRANGE_500 (first 450 elements): 18294.91 requests per second LRANGE_600 (first 600 elements): 13495.28 requests per second MSET (10 keys): 89365.51 requests per second
2.4: Redis配置文件
-
配置参数(/etc/redis/6379.conf) bind:监听的主机地址 port:端口 daemonize yes:启用守护进程 pidfile:指定PID文件 loglevel notice:日志级别 logfile:指定日志文件
2.5: Redis 数据库常用命令
-
redis-cli命令行工具 获取命令帮助 help @<group>:获取<group>中的命令列表 help <command>:获取某个命令的帮助 help <tab>:获取可能帮助的主题列表
2.6: Redis多数据库操作
- Redis支持多数据库,默认支持16个数据库,0-15命名
- 多数据库相互独立,互不干扰
- 多数据库常用命令
多数据库间切换
多数据库间移动数据
清除数据库内数据
2.7: 设置hash结构,推荐使用
-
192.168.100.140:6379> hset person name zhangsan 192.168.100.140:6379> hset person age 18 192.168.100.140:6379> hset person score 88 192.168.100.140:6379> hset people name lisi (integer) 1 192.168.100.140:6379> keys * //查询哪些键名 1) "nannan" 2) "myset:__rand_int__" 3) "people" 4) "person" 5) "mylist" //456是默认 6) "key:__rand_int__" 7) "counter:__rand_int__"
2.8: 设置过期时间
-
192.168.100.140:6379> set name lisi oK 192.168.100.140:6379> expire name 20 "时间是秒,20秒后键名失效" (integer)1
三: Redis配置文件的分析
3.1: 持久化概述
- 持久化概述
Redis是运行在内存中,内存中的数据断电丢失
为了能够重用Redis数据,或者防止系统故障,需要将
Redis中的数据写入到磁盘空间中,即持久化 - 持久化分类
RDB方式: 创建快照的方式获取某一时刻Redis中所有数
据的副本
AOF方式: 将执行的写命令写到文件的末尾,以日志的方
式来记录数据的变化
3.2: RDB持久化
-
Redis的默认持久化方式
-
默认文件名dump.rdb
-
触发条件
在指定的时间间隔内,执行指定次数的写操作(配置文件控制)
执行save或者是bgsave(异步)命令
执行flushall命令,清空数据库所有数据
执行shutdown命令,保证服务器正常关闭且不丢失任何数据 -
优缺点
适合大规模的数据恢复
如果业务对数据完整性和一致性要求不高,RDB是很好的选择
数据的完整性和一致性不高
备份时占用内存 -
通过RDB文件恢复数据
将dump.rdb文件拷贝到redis的安装目录的bin目录下,重启redis服务即可
[root@localhost ~]# vim /etc/redis/6379.conf #RDB核心规则配置 save <指定时间间隔> <执行指定次数更新操作>,满足条件就将内存中的数据同步到硬盘 中。官方出厂配置默认是 900秒内有1个更改,300秒内有10个更改以及60秒内有10000个更改,则将内存中的 数据快照写入磁盘。 若不想用RDB方案,可以把 save "" 的注释打开,下面三个注释 #save "" save 900 1 "这三项默认设置" 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
3.3: AOF持久化
-
Redis默认不开启
-
弥补RDB的不足(数据的不一致性)
-
采用日志的形式来记录每个写操作,并追加到文件中
-
Redis 重启会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作
-
AOF不是默认开启,要手动开启.RDB默认开启
[root@localhost ~]# vim /etc/redis/6379.conf #Redis 默认不开启。它的出现是为了弥补RDB的不足(数据的不一致性),所以它采用日志的形式来记录每个写操作,并追加到文件中。Redis 重启的会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作默认redis使用的是rdb方式持久化,这种方式在许多应用中已经足够用了。但是redis如果中途宕机,会导致可能有几分钟的数据丢失,根据save来策略进行持久化,Append Only File是另一种持久化方式,可以提供更好的持久化特性。Redis会把每次写入的数据在接收后都写入 appendonly.aof 文件,每次启动时Redis都会先把这个文件的数据读入内存里,先忽略RDB文件。若开启rdb则将no改为yes appendonly no appendfilename "appendonly.aof" 指定本地数据库文件名,默认值为 appendonly.aof #aof持久化策略的配置 #no表示不执行fsync,由操作系统保证数据同步到磁盘,速度最快 always表示每次写入都执行fsync,以保证数据同步到磁盘 everysec表示每秒执行一次fsync,可能会导致丢失这1s数据 # appendfsync always "always:数据要求高" appendfsync everysec "everysec:一般情况使用 " # appendfsync no # 在aof重写或者写入rdb文件的时候,会执行大量IO,此时对于everysec和always的aof模式来说,执行 fsync会造成阻塞过长时间,no-appendfsync-on-rewrite字段设置为默认设置为no。如果对延迟要求很高的应用,这个字段可以设置为yes,否则还是设置为no,这样对持久化特性来说这是更安全的选择。设置为yes表示rewrite期间对新写操作不fsync,暂时存在内存中,等rewrite完成后再写入,默认为no,建议yes。Linux的默认fsync策略是30秒。可能丢失30秒数据 no-appendfsync-on-rewrite no #aof自动重写配置。当目前aof文件大小超过上一次重写的aof文件大小的百分之多少进行重写,即当aof文件 增长到一定大小的时候Redis能够调用bgrewriteaof对日志文件进行重写。当前AOF文件大小是上次日志重写得到AOF文件大小的二倍(设置为100)时,自动启动新的日志重写过程 auto-aof-rewrite-percentage 100 #设置允许重写的最小aof文件大小,避免了达到约定百分比但尺寸仍然很小的情况还要重写 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