一、概述
Redis是一个开源的,使用C语言编写,支持网络,可基于内存工作亦可持久化(AOF、RDB)的日志型,key-values(键值对)数据库,一个速度极快的非关系型数据库,也就是我们所说的NoSQL数据库,他可以存储(key)与5种不同类型的值(value)之间的映射(mapping),可以将存储在内存的键值对持久化到硬盘,可以使用复制特性来扩展读性能,还可以使用客户端分片来扩展性能,并且它还提供了多种语言的API。
Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这个称为半持久化RDB);也可以把每一次数据变化都写入到一个append onlyfile(AOF)里面(这称为“全持久化”)。
二、工作原理
Redis服务器程序是一个单进程模型,也就是说在一台服务器上可以开启多个redis进程(多实例),而redis的实际处理速度则完全依靠于主进程的执行速率,若在服务器上只运行一个redis进程,当多个客户端同时访问时,服务器处理能力会有一定程度的下降,若在一个服务器上开启多个redis进程,redis在提高并发处理能力的同时也会给CPU造成很大的压力,所以在实际生产环境中,结合实际服务器环境来决定如何使用。
三、优点
1、具有极高的数据读写速度:数据读写速度最高可达11万次/s,数据写入速度最高可达8万1千次/s
2、支持丰富的数据类型,支持丰富的数据类型不仅支持key-values数据类型,还支持Strings,Lists,Hashes,Sets,及Ordered Sets等数据类型操作
3、支持数据的持久化,在这一点上redis远远强于memcached,redis可以将数据保存到磁盘中,重启后还可以继续加载使用
4、原子性redis的所有操作都是原子性的
5、支持数据备份及master-slave模式的数据备份
四、redis 命令工具
1、redis-server: 用于启动redis的工具
2、redis-benchmark: 用于检测redis在本机的运行效率
3、redis-check-aof: 修复apf持久化文件
4、redis-check-rdb: 修复rdb持久化文件
5、redis-cli: redis client命令工具
6、redis-setinel: redis-server文件的软连接
五、redis-cli语法
redis-cli -h 远程连接主机 -p 指定端口 -a 指定密码 #注:若未设置数据库密码 -a 选项可以忽略 退出数据库操作环境可以执行quit或exit就可以返回到原来的shell文件
六、redis-benchmark测试工具
redis-benchmark [option] [option value]
常用选项:
-h:指定服务器名
-p:指定服务器端口
-s:指定服务器socket
-c:指定并发连接数
-n:指定请求连接数
-d:以字节(B)的形式指定SET/GET值的数据大小
-k:1=keep alive 0=reconnect
-r:SET/GET/INCR使用随机key,SADD使用的随机值
-P:通过管道传输<numreq>请求
-q:强制退出redis。仅显示query/sec值
--csv:以CSV格式输出
-l:生成循环,永久执行测试
-t:仅运行以逗号分隔的测试命令列表
-I:idle模式。仅打开/v个idle连接并等待
Redis-benchmark应用实例
1、测试并发数为10请求连接数为100000个请求的性能
[root@localhost ~]# redis-benchmark -h 192.168.200.111 -p 6379 -c 10 -n 100000
2、测试存取大小为100B的数据包时redis性能
[root@localhost ~]# redis-benchmark -h 192.168.200.111 -p 6379 -q -d 100
3、测试执行set,lpush操作时的性能
[root@localhost ~]# redis-benchmark -h 192.168.200.111 -p 6379 -t set,lpush -n 100000 -q
七、Redis数据库常用命令
set:用于redis数据库中存放数据 命令格式为 set key value
get:用于redis数据库中获取数据 命令格式为 get key
exists命令:用来判断键值是否存在
del命令:用来删除当前数据库中指定的key
type命令:使用type命令可以获取key对应的value值的类型
rename命令:对已有的key进行重命名
格式:rename 源key 目标key #注意:使用rename命令进行重命名时,无论目标key是否存在都会进行重命名,在实际使用过程中建议先使用exists查看目标key是否存在,再决定是否执行rename命令,以免覆盖重要的数据。
renamenx命令:对已有的key进行重命名,并检测新名是否存在
格式:renamenx 源key 目标key #注意:使用renamenx进行重命名时renamenx会检测新名是否存在,如目标key存在则不进行重命名
dbsize命令:查看当前数据库中key的数目
八、redis集群简介
我们日常在对于redis的使用中,经常会遇到一些问题:
1、高可用问题,如何保证redis的持续高可用性
2、容量问题,单实例redis内存无法无限扩充,达到32G后进入了64位世界,性能下降
3、并发性能问题,redis号称单实例10万并发,但也是有尽头的
九、redis哨兵介绍
Redis cluster是redis的分布式解决方案,在redis3.0版本中正式推出的采用的是hash slot(hash槽),可以将多个redis实例整合在一起,形成一个集群,也就是将数据分散到集群的多台机器上。有效的解决了redis分布式方面的需求,当遇到单机内存、开发、流量等瓶颈时,可以采用cluster架构达到负载均衡的目的。
Redis-cluster的优势
1. 官方推荐,毋庸置疑
2. 去中心化,集群最大可增加1000个节点,性能随节点增加而线性扩展
3. 管理方便,后续可自行增加或摘除节点,移动分槽等等。
4. 简单,易上手
十、redis数据分布
分布式数据库主要解决把整个数据集按照分区规则映射到多个节点的问题,即把数据集划分到多个节点上,每个节点负责整个数据的一个子集。常见的分区规则有哈希分区和顺序分区。Redis cluster采用哈希分区规则,因此接下来会讨论哈希规则,常见的哈希分区有以下几种:
1. 节点取余
2. 一致性哈希分区
3. 虚拟槽分区
Redis cluster采用虚拟槽分区
十一、虚拟槽分区
虚拟槽分区巧妙地使用了哈希空间,使用分散度良好地哈希函数把所有地数据映射到一个固定地范围内地整数集合。
Redis cluster槽的范围是0-16383。槽是集群数据管理和迁移地基本地单位。采用大范围槽地主要目的是为了方便数据地拆分和集群地扩展(同时这也是redis地优点),使每个节点负责一定数量地值。
十二、Redis集群原理
Redis cluster是一个无中心地结构,其每一个节点都会保存着数据和整个集群地状态。每个节点都会保存其他节点地信息,知道其它节点所负责地槽,并且会与其他节点定时发送心跳信息能够及时感知整个集群中异常地节点
Redis群集原理图
1、当client向群集中任一节点发送与数据库有关命令时
2、接受命令地redis节点会计算出命令属于哪个槽,并检查这个槽是否指派了给自己
1)如果键所在地槽正好指派给当前节点,那么节点直接执行这个命令
2)如果键所在地槽没有指派给当前节点,那么节点会向客户端返回一个moved错误,并指引客户端转向(redirect)正确地节点,在发送希望执行的命令。
群集角色工作原理介绍
集群角色有Master和Slave。群集中master之间分配slots(槽)[范围:0-16383],一共16384个slot。Slave向它指定的master同步数据,实现备份,当其中的一个master无法提供服务时,该master的slave将提升为master,以保证群集键slot的完整性,当其中的某一个master和他的slave都失效,导致slot不完整,群集将会失效,这时就需要人工处理了。
Redis架构细节信息
1. 所有redis彼此互联的机制(ping-pong机制),内部使用二进制协议优化传输速度和带宽
2. 节点的失效(fail)在群集中超过半数的主(master)节点检测失效时才会失效。
3. 客户端与redis节点直连,不需要中间代理(proxy)层,客户端不需要连接群集所有节点,连接群集中任何几个节点都可以。
4. redis-cluster把所有的物理及节点映射到[0-16383]slot上,cluster负责维护node<->slot<->key。
Redis-cluster选举
选举过程是群集所有master参与,如果半数以上的master节点与当前master节点通信时(cluster-node-timeout),认为当前的master节点挂掉,
出现以下两种情况将认为群集不可用
1. 当群集不可用时,所有对进群的操作都将不可用
2. 收到((error)CLUSTERDBWN the cluster di down)错误
1)如果群集中任意的master宕机,没有slave直接进入fail状态,此时之前分配到master上的槽[0-16383范围]在整个群集中将会出现slot不完整进入fail状态
2)如果群集中超过半数的master挂掉,无论是否有slave群集都会进入fail状态
Redis cluster中服务器节点都使用两个tcp端口号:
1. 6379端口号:用于服务于client连接
2. 16379端口号:用于群集总线,即二进制协议的节点到节点通信通道。节点使用群集总线进行故障检测,配置更新,故障转移授权等,如果开启了防火墙需要注意开放两个端口
十三、集群部署
环境(用两台主机模拟六台服务器)
主机名 IP地址 端口 描述
redis-master 192.168.200.111 7000 redis-master01
7001 redis-master02
7002 redis-master03
redis-slave 192.168.200.112 8000 redis-slave01
8001 redis-slave02
8002 redis-slave03
环境初始化(两台主机配置主机名,关闭防火墙和selinux)
[root@localhost ~]# hostname redis-master #主机名不同
[root@localhost ~]# bash
[root@redis-master ~]# iptables -F
[root@redis-master ~]# setenforce 0
[root@redis-master ~]# systemctl stop firewalld #关闭防火墙
[root@redis-master ~]# sestatus #查看系统状态
环境部署
redis编译部署及基础优化
redis-4.0源码包提取链接
链接:https://pan.baidu.com/s/1Xw0uD3Cj63zT4pmVAPLufQ?pwd=3l93
提取码:3l93
[root@redis-master ~]# yum -y install wget gcc gcc-c++ make tar openssl openssl-devel cmake #下载依赖包
[root@redis-master ~]# tar xf redis-4.0.10.tar.gz -C /usr/src/ #解压安装包
[root@redis-master ~]# cd /usr/src/redis-4.0.10/ #到解压完的目录下
[root@redis-master redis-4.0.10]# make #编译
[root@redis-master redis-4.0.10]# make MALLOC=jemalloc #避免碎片和可伸缩的并发支持
[root@redis-master redis-4.0.10]# make PREFIX=/usr/local/redis install
[root@redis-master redis-4.0.10]# mkdir -p /usr/local/redis/conf
优化redis程序命令
[root@redis-master redis-4.0.10]# cp sentinel.conf