一、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)、**w支持丰富的数据类型:支持key-value、Strings、Lists、Hashes(散列值)、sets等数据类型操作。
string字符串(可以为整形、浮点和字符型,统称为元素) list列表:(实现队列,元素不唯一,先入先出原则) set集合:(各不相同的元素) hash hash散列值:(hash的key必须是唯一的) set l ordered sets集合/有序集合 (3 )*力w支持数据的持久化:可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使。 ( 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 l 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 letc/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
(二) 、 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 -pport -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
–796行–是否忽略最后一条可能存在问题的指令 aof-load- truncated yes
机智的机制 /etc/init.d/ redis_6379 restart
|