一、redis简介概述
①概述
②epoll的优势
二、redis优点
1)支持数据持久化
2)数据备份
3)原子性
4)支持数据多样
三、安装部署
(一)安装
(二) Redis命令工具
(三)redis-cli 命令行工具(远程登陆)
(四)redis-benchmark 测试工具
三、Redis数据库常用命令
1)select 切换数据库
2)keys * 查询
3)set 存放数据
4)get key 查看键 和type 键 字符串类型
5)exists 查看键是否存在
6)del 删除键
7)rename 重命名
①rename 重命名
②renamenx n 不进行修改 x进行修改
8)dbsize 查看当前库所有键
9)设置密码和删除密码
四、Redis多数据库常用命令(16个库0-15)
1)多数据库间切换
命令格式:select序号
2)多数据库间移动数据
格式: move键值序号
3)清除数据库内数据(rm -rf )
FLUSHDB:清空当前数据库数据
FLUSHALL:清空所有数据库的数据,慎用
4)redis远程数据备份(全量、增量)
五、redis高可用
概述
六、redis持久化
RDB简述
AOF简述
###########################################################
一、Redis简介
Redis是一个开源的、使用c语言编写的NosQL数据库。
Redis基于内存运行并支持持久化(支持存储在磁盘),采用key-value(键值对)的存储形式,是目前分布式架构中不可或缺的一环。
Redis服务器程序是单进程模型
Redis服务在一台服务器上可以同时启动多个Redis进程,Redis的实际处理速度则是完全依靠于主进程的执行效率。若在服务器上只运行一个Redis进程,当多个客户端同时访问时,服务器的处理能力是会有一定程度的下降;若在同一台服务器上开启多个Redis进程,Redis在提高并发处理能力的同时会给服务器的cu造成很大压力。即:在实际生产环境中,需要根据实际的需求来决定开启多少个Redis进程。
建议可以开2个进程
原因:
1、备份
2、抗高并发的同时尽量不给cPU造成太大的压力
若对搞并发要求高一些,可能会考虑在同一台服务器上开启多个进程,若cpu资源比较紧张,采用单进程即可。
单进程快速的原因
使用epoll (默认)+I/o多路复用机制
首先, Redis
是跑在单进程中的,所有的操作都是按照顺序线性执行的,但是由于读写操作等待用户输入或输出都是阻塞的,所以I/o操作在一般情况下往往不能直接返回,这会导致某一文件的 T/o阻塞导致整个进程无法对其它客户提供服务,而工/o多路复用就是为了解决这个问题而出现的。
epoll 机制优势:
1.epoll没有最大并发连接的限制,上限是最大可以打开文件的数目,这个数字一般远大于2048,一般来说这个数目和系统内存关系很大―,具体数目可以cat /proc/sys/fs/file-max查看。
2.效率提升,Epoll 最大的优点就在于它只管你"活跃"的连接﹐而跟连接总数无关,因此在实际的网络环境中,Epoll的效率就会远远高于select 和poll 。
3.内存拷贝,Epoll_在这点上使用了"共享内存",这个内存拷贝也省略了
I/o多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪,能够通知程序进行相应的操作。
二、、Redis具有以下几个优点(redis特性(与其他nosql对比))
(1)、具有极高的数据读写速度:数据读取的速度最高可达到110000次/s,数据写入速度最高可达到81000 次/s。
(2)、支持丰富的数据类型:支持key-value、Strings、Lists、Hashes(散列值)、sets等数据类型操作。
string字符串(可以为整形、浮点和字符型,统称为元素)
list列表:(实现队列,元素不唯一,先入先出原则)
set集合:(各不相同的元素)
hash hash散列值:(hash的key必须是唯一的)
set l ordered sets集合/有序集合
(3 )支持数据的持久化:可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使。
( 4)原子性:Redis所有操作都是原子性的。
(5)支持数据备份:即master-salve模式的数据备份。
丰富的特性– Redis还支持 publish(消息发布)/subscribe (订阅),通知,设置key有效期等等特性。
Redis作为基于内存运行的数据库,缓存是其最常应用的场景之一。除此之外,Redis常见应用场景还包括获取最新a个数据的操作、排行榜类应用、计数器应用、存储关系、实时分析系统、日志记录。
支持key-value、strings、Lists、Hashes(散列值)、Sets 及ordered Sets等数据类型操作。
三、部署步骤
(一)、 Redis安装部署
systemctl stop firewalld
setenforce o
yum install -y gcc gcc-c++ make
yum repolist
重新yum
yum install -y gcc*
#将redis-5.0.7.tar.gz压缩包上传到/opt目录中
tar zxvf redis-5.0.7.tar.gz -c / opt /
cd /opt/redis-5.0.7/
make
make PREFIX=/usr/local/redis install
#由于Redis源码包中直接提供了Makefile文件,所以在解压完软件包后,不用先执行./configure进行配置,可直接执行make 与make install命令进行安装
#执行软件包提供的 install_server.sh 脚本文件设置Redis服务所需要的相关配置文件
cd /opt/ redis-5.0.7/utils
… 一直回车.
Please select the redis executable path, [/usr/local/bin/redis-server] /usr/local/redis/bin/redis-server
#需要手动修改为/usr/local/redis/bin/redis-server注意要一次性正确输入
selected config:
Port : 6379 #默认侦听端口为6379
Config file : letc/ redis / 6379.conf #配置文件路径
Log file : /var/ log / redis_6379.log #日志文件路径
Data dir : lvar/ libl redis/ 6379 #数据文件路径
Executable : /usr/local/redis/bin/redis-server #可执行文件路径
Cli Executable : /usr / local/ redis/bin/ redis-cli #客户端命令工具
#把redis的可执行程序文件放入路径环境变量的目录中便于系统识别
ln -s /usr/local/redis/bin/* /usr/local/bin/
#当install_server.sh 脚本运行完毕,Redis服务就已经启动,默认侦听端口为6
netstat -natp | grep redis
#Redis服务控制
/etc/init.d/ redis_6379 stop #停止
/etc/init.d/ redis_6379 start #启动
/etc/init.d/ redis_6379 restart #重启
/etc/init.d/redis_6379 status #状态
#修改配置letc/redis/6379.conf参数
vim /etc/redis/6379.conf
bind 127.0.0.1 192.168.226.129 #70行,添加监听的主机地址
port 6379 #93行,Redis默认的监听端口
daemonize yes #137行,启用守护进程
pidfile /var / run/redis_6379.pid #159行,指定PID文件
loglevel notice #167行,日志级别
logfile / var / log / redis_6379.log #172行,指定日志文件
/etc/init.d/redis_6379 restart #重启redis
#700行,开启AOF持久化功能
(二) 、 Redis命令工具
redis-server:用于启动Redis的工具
redis-benchmark:用于检测Redis在本机的运行效率
redis-check-aof:修复AoF持久化文件
redis-cli: Redis命令行工具
rdb和aof 是redis服务中持久化功能的两种形式RDB AOF
redis-cli 常用于登陆至redis数据库
(三)、 redis-cli 命令行工具(远程登陆)
语法: redis-cli -h host -p port -a password
-h :指定远程主机
-p:指定Redis服务的端口号
-a :指定密码,未设置数据库密码可以省略-a选项
若不添加任何选项表示,则使用127.0.0.1∶6379连接本机上的 Redis数据库,
redis-cli -h 192.168.226.129 -p 6379
(四)、 redis-benchmark 测试工具
redis-benchmark是官方自带的 Redis 性能测试工具,可以有效的测试Redis服务的性能。
基本的测试语法: redis-benchmark[选项][选项值]
-h :指定服务器主机名。
-p :指定服务器端口。
-s :指定服务器socket(套接字)-c:指定并发连接数。
-n :指定请求数。
-d :以字节的形式指定SET/GET 值的数据大小。
-k : 1=keep alive O=reconnect
-r : SET/GET/INCR使用随机key,SADD使用随机值。
-P:通过管道传输请求。
-q :强制退出redis。仅显示querylsec 值。–csv :以csv格式输出。
-l :生成循环,永久执行测试。
-t :仅运行以逗号分隔的测试命令列表。
-I : Idle模式。仅打开N个idle连接并等待。
#向IP地址为#向IP地址为192.168.226.129、端口为6379的Redis服务器发送100个并发连接与100000个请求测试性能
redis-benchmark -h 192.168.10.31 -p 6379 -c 100 -n 100000
#测试存取大小为100字节的数据包的性能
redis-benchmark -h 192.168.10.31 -p 6379 -q -d 100
#测试本机上Redis 服务在进行set与lpush操作时的性能
redis-benchmark -t set, lpush -n 100000 -q
三、Redis数据库常用命令
set:存放数据,命令格式为set key valueget:获取数据,命令格式为get key
redis-cli
127.0.0.1:6379> set teacher zhangsanOK
127.0.0.1:6379> get teacher"zhangsan"
#keys命令可以取符合规则的键值列表,通常情况可以结合、?等选项来使用*。
127.0.0.1:6379>set k1 1
127.0.0.1:6379>set k2 2
127.0.0.1:6379>set k3 3
127.0.0.1:6379>set v1 4
127.0.0.1:6379>set v5 5
127.0.0.1:6379>set v22 5
127.0.0.1:6379>KEYS * #查看当前数据库中所有键
- “myset:rand_int”
- “counter:rand_int”
- “mylist”
- “key:rand_int”
127.0.0.1:6379> select 10 #切换数据库ID10
OK
127.0.0.1:6379[10]>
127.0.0.1:6379> set class xiaoming #创建键与数据
OK
127.0.0.1:6379> keys *
- “counter:rand_int”
- “myset:rand_int”
- “class”
- “mylist”
- “key:rand_int”
127.0.0.1:6379> get class #查看键
"xiaoming
127.0.0.1:6379> type class #字符串类型
string
127.0.0.1:6379> keys k* #查看以k开头的所有键
- “kw”
- “key:rand_int”
127.0.0.1:6379> keys r? #“?”表示匹配单个
- “rw”
127.0.0.1:6379> keys r?? #“r??”表示匹配多个字符
(empty list or set)
127.0.0.1:6379> exists class #查看“class”这个键是否存在
(integer) 1
127.0.0.1:6379> exists school
(integer) 0
127.0.0.1:6379> exists clsass school
(integer) 0
#exists命令可以判断键值是否存在
127.0.0.1:6379> exists clsass school
(integer) 0 #0表示键不存在
127.0.0.1:6379> exists class school
(integer) 1 #“1”表示键存在1个,只会显示存在几个不会具体的显示哪个键存在
127.0.0.1:6379> set school
(error) ERR wrong number of arguments for ‘set’ command
127.0.0.1:6379> set school wangshi集团
OK
#del命令可以删除当前数据库的指定key。
127.0.0.1:6379> keys *
- “school”
- “myset:rand_int”
- “counter:rand_int”
- “rw”
- “key:rand_int”
- “xw”
- “class”
- “mylist”
- “kw”
127.0.0.1:6379> del rw
(integer) 1
127.0.0.1:6379> del kw
(integer) 1
#type命令可以获取key对应的vlue 值类型。
127.0.0.1:6379> type school
string
#rename 命令时对已有key进行重命名(覆盖)。
命令格式:rename 源key 目标key
使用rename重命名时,无论目标key是否存在都在进行重命名,且源key的值会覆盖目标key的值。在实际使用过程中,建议先用exists查目标key是否存在,然后在决定是否执行rename命令,以避免覆盖重要的数据。
127.0.0.1:6379> rename class pengshijituan
OK
127.0.0.1:6379> keys *
- “myset:rand_int”
- “counter:rand_int”
- “key:rand_int”
- “xw”
- “mylist”
- “pengshijituan”
#rename nx
rename n 不进行修改 x进行修改
nx 组合:先判断命令的作用时对已有key进行重命名,并检测新名是否存在,如果目标key存在则不进行重命名(不覆盖)
命令格式: renamenx 源key 目标key
127.0.0.1:6379> set zhang 28
OK
127.0.0.1:6379> get zhang
“28”
127.0.0.1:6379> rename pengshijituan zhang
OK
127.0.0.1:6379> get zhang
“xiaoming”
127.0.0.1:6379> keys *
- “myset:rand_int”
- “counter:rand_int”
- “zhang”
- “key:rand_int”
- “xw”
- “wangwu”
- “mylist”
127.0.0.1:6379> renamenx wangwu zhang
(integer) 0
127.0.0.1:6379> get wangwu
“10”
127.0.0.1:6379> get zhang
“xiaoming”
#dbsize命令的作用是查看当前数据库中key的数目。看所有数据库
127.0.0.1:6379> dbsize
(integer) 7
#使用config set requirepass your password命令设置密码
127.0.0.1:6379> config set requirepass 12345678
OK
127.0.0.1:6379> keys *
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth 12345678
OK
127.0.0.1:6379> keys *
- “myset:rand_int”
- “counter:rand_int”
- “zhang”
- “key:rand_int”
- “xw”
- “wangwu”
- “mylist”
#使用config get requirepass命令查看密码(一旦设置密码,必须先验证通过密码,否则所有操作不可用)
127.0.0.1:6379> auth 12345678
127.0.0.1:6379>config get requirepass
#删除密码
127.0.0.1:6379> auth 12345678
127.0.0.1:6379> config set requirepass ‘’ #取消密码,设置为空
#以上不设置,无法重启redis
(六)、Redis多数据库常用命令(16个库0-15)
Redis支持多数据库,Redis默认情况下包含16个数据库,数据库名称是用数字0-15来依次命名的。
多数据库相互独立,互不干扰。
#多数据库间切换
命令格式:select序号
使用redis-cli连接Redis数据库后,默认使用的是序号为О的数据库。
127.0.0.1:6379> select 10 #切换至序号为10的数据库
127.0.0.1: 6379[10]> select 15 #切换至序号为15的数据库
127.0.0.1 : 6379 [15]> select o #切换至序号为0的数据库
#多数据库间移动数据
格式: move键值序号
127.0.0.1:6379[1]> select o #切换至目标数据库0
OK
127.0.0.1:6379> get k1 #查看目标数据是否存在
“100”
127.0.0.1:6379> move k1 1 #将数据库o中k1移动到数据库1中
(integer) 1
127.0.0.1:6379> select 1 #切换至目标数据库1
127.0.0.1:6379> get k1 #查看被移动数据
127.0.0.1:6379> get k1 #在数据库0中无法查看到k1的值
(nil)
#清除数据库内数据(rm -rf )
FLUSHDB:清空当前数据库数据
FLUSHALL:清空所有数据库的数据,慎用!
redis远程数据备份(全量、增量)
任务1 redis单库备份、全库备份单库指定key备份
是以shell 脚本的形式
redis backup .sh
#!/bin/bash
TIME=$
BCDIR=
redis _server=
port
psword
redis缓存穿透击穿雪崩
redis 分布式锁()
当多个客户端访问redis同一个关键数据时,客户端的请求修改数据时均会使用setnx,当第一
个客户端的请求任务在执行修改过程中,redis会对此数据进行加锁(可以通过固定过期时间/watch dog
的形式续期+通知lock.unlock {释放锁}的机制释放)在锁定期间,第二个客户端的请求任务不会修改数据,而是会等待的:缓解高并发的压力(因为本身redis使用的是单线程epoll-I/o复用的机制)所以第二个任务请求(socket所被分配的文件描述符,不是就续状态,所以不会消耗太多资源)不会占用太多资源
核心的技术——》setnx +分布式锁
四、Redis高可用
指标:稳定性/容灾能力/故障切换能力 高达9个9
一租服务器以一个周期为时间段,计算这组服务器正常运转的时间99.999999999% 99.99%
在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999%等等)。
但是在Redis语境中,高可用的含义似乎要宽泛一些,除了保证提供正常服务(如主从分离、快速容灾技术),还需要考虑数据容量的扩展,数据安全不会丢失等。
在Redis中,实现高可用的技术主要包括持久化、主从复制、哨兵和集群,下面分别说明它们的作用,以及解决了什么样的问题。
持久化
持久化是最简单的高可用方法(有时甚至不被归为高可用的手段),主要作用是数据备份,即将数据存储在硬盘,保证数据不会因进程退出而丢失。
主从复制
主从复制是高可用Redis的基础,哨兵和集群(cluster)都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。缺陷:故障恢复无法自动化;写操作无法负载均衡;存储能力受到单机的限制(吃资源)。
哨兵:在主从复制的基础上,哨兵实现了自动化的故障恢复。缺陷:写操作无法负载均衡;存储能力受到单机的限制。
集群(cluster):通过集群,
Redis解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了较为完善的高可用方案
五、Redis持久化
持久化的功能:
Redis是内存数据库,数据都是存储在内存中,为了避免服务器断电等原因导致Redis进程异常退出后数据的永久丢失,需要定期将Redis中的数据以某种形式(数据或命令)从内存保存到硬盘;当下次Redis重启时,利用持久化文件实现数据恢复。除此之外,为了进行灾难备份,可以将持久化文件拷贝到一个远程位置NFS) 。
Redis提供两种方式进行持久化:
RDB持久化:原理是将Reids在内存中的数据库记录定时保存到磁盘上/周期性的把内存中的数据保存在磁盘中。(类似快照)
AoF持久化(append only file):原理是将Reids的操作日志以追加的方式写入文件,类似于MysgL的binlog/从redis的操作日志记录中将执行的过程同步到磁盘中。(基于日志持久化方式)
总结
REDIS的持久化
1、rdb和aof的基本理解
①RDB:周期性的把内存中的数据保存在磁盘中
②AOF:从redis的操作日志记录中将执行的过程同步到磁盘中
2、RDB和AOF的持久化过程
RDB:1)内存中>写入磁盘中 保存方式
2)结果数据》写入磁盘中 保存的数据对象
3)内存》写入磁盘后,会进行压缩,来减小*.rdb的磁盘占用空间量
AOF:1)内存》append追加到缓冲区》调用 cpu写入磁盘
2)操作日志记录中的执行语句》追加到缓冲》调用cpu写入磁盘
3)内存》缓冲》磁盘 写入后,会周期性的进行重写,跳过一些“无效操作”来保存
3、RDB(bgsave)和AOF(bgsave)触发方式
RDB分为①手动融发
② 自动触发save m n(假设save 900 60 则表示60s内有90o条语句执行,则触发RDB持久化)
③特殊触发:当手动关闭REDIs时,会进行RDB方式的持久化
/etc/ init.d/ redis_6379 stop l restart
shutdown关闭时
AOF分为①手动触发
②自动触发
1 )always每条语句,同步执行持久化(有强一致性要求的场景
2)no 下进行持久化
3 ) every second每秒进行一次AOF持久化(建议使用的,均衡型场景)
4、RDB 和AOF 优先级
前提: ①因为REDIS默认是将数据保存在内存中的,所以若redis重启、关闭时内存中的数据会丢失
②在redis 每次启动时,都会读取持久化的文件,来恢复数据到内存中,以保证redis数据的完整性
RDB 和AOF优先级:AOF>>RDB
六、RDB和AOF的配置内容解读
RDB配置
save m n
自动触发最常见的情况是在配置文件中通过save m n,指定当m秒内发生n次变化时,公触发bgsave。
vim /etc/redis/ 6379.conf
–219行–以下三个save条件满足任意一个时,都会引起bgsave的调用
save 900 1 :当时间到9oo秒时,如果redis数据发生了至少1次变化,则执行bgsave
save 300 10 :当时间到30o秒时,如果redis数据发生了至少10次变化,则执行bgsave
save 60 10000 :当时间到60秒时,如果redis数据发生了至少10000次变化,则执行bgsave
–242行–是否开启RDB文件压缩
rdbcompression yes
–254行–指定RDB文件名
dbfilename dump .rdb
–264行–指定RDB文件和AoF文件所在目录
dir /var/ lib/ redis/6379
AOF配置
开启AOF
Redis服务器默认开启RDB,关闭AOF:要开启AoF,需要在配置文件中配置:
vim /etc/ redis/ 6379.conf
-
700行–修改,开启AOF
appendonly yes
-
–704行–指定A0F文件名称
appendfilename “appendonly.aof”
–796行–是否忽略最后一条可能存在问题的指令
aof-load-truncated yes