Redis介绍
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
Redis性能
读:11.2万/秒
写:8.6万/秒
平均: 10万/秒 吞吐量
Redis安装和使用
安装redis
要求:命令的执行值redis的根目录中运行.
命令:
1.make 表示编译文件
2.make install 表示安装redis服务.
修改配置文件
vim redis.conf
去除IP绑定
#bind 127.0.0.1(69行左右)
关闭保护模式
protected-mode no(88行左右)
开启后台启动
daemonize yes(136行左右)
VIM常见报错
报错演示:
报错原因:在vim编辑状态下.程序异常外退出导致Linux程序启动保护模式.导致异常.
解决方案:
1. 根据选项 点击 D
2. 利用删除指令 直接删除临时文件 rm –rf .xxxxxx.swap
Redis运行命令
启动命令
Redis-server 忽略 一切加载都是默认项
Redis-server redis.conf 目的读取配置文件
进入客户端
redis-cli –p 6379(端口号)
exit 退出客户端
ctrl + c 退出
简化:如果Redis默认的端口号为6379则命令可以简化
redis-cli
Redis关闭
redis-cli –p 6379(端口号) shutdown
kill -9 PID PID2
redis-cli shutdown 简化命令
Redis入门案例
linux防火墙操作密令
连接虚拟机Redis要确保虚拟机防火墙关闭
1 关闭防火墙—–service iptables stop
2 启动防火墙—–service iptables start
3 重启防火墙—–service iptables restart
4 查看防火墙状态——service iptables status
5 永久关闭防火墙——chkconfig iptables off
6 永久关闭后启用——chkconfig iptables on
添加jar包文件
1 | <!-- jedis --> |
入门案例——String
1 | /** |
入门案例——hash
1 |
|
入门案例——List
1 |
|
SpringBoot整合Redis
导入jar包
1 | <!--spring整合redis --> |
入门案例
1 | //String类型操作方式 配置文件3处 防火墙 |
超时时间定时
1 | //设定数据的超时方法 |
对象转化JSON
转化说明
利用ObjectMapper实现对象的转化.
1 | ObjectMapper mapper = new ObjectMapper(); |
对象与JSON互转
1 | /** |
List与JSON互转
1 | //实现List集合与JSON转化 |
编辑pro文件
jedis.host=192.168.175.129
jedis.port=6379
编辑配置类
1 | //表示redis配置类 |
设定虚拟机静态IP
检查当前IP
检查网关地址
配置静态IP
Redis分片机制
Redis单台问题
1. 使用redis单台时内存会明显不足.如果一味的扩容内存,则运行的效率低.
2. 如果redis单台服务器宕机.
Redis分片(分区)介绍
核心特点:实现了redis内存的扩容.
说明:使用多个redis节点,共同为用户提供服务.内存空间翻倍.
用户使用时当做一个整体.并且内存保存的数据不一.
分片搭建
创建新文件
在Redis根目录下创建一个新的文件夹
复制配置文件
复制配置文件到新建的文件夹里
[root@localhost redis-5.0.4]# cp redis.conf shards/redis-6379.conf
[root@localhost redis-5.0.4]# cp redis.conf shards/redis-6380.conf
[root@localhost redis-5.0.4]# cp redis.conf shards/redis-6381.conf
修改端口号
可以使用:/port快速定位数据
将6380.conf中端口号改为6380.
同理 修改其他配置文件
启动多台Redis
启动Redis
redis-server redis-6379.conf
redis-server redis-6380.conf
redis-server redis-6381.conf
检查redis服务
ps -ef | grep redis
Redis分片测试
入门案例
1 | /** |
Hash一致性算法
概念
概念:同一个字符串hash值是一致的.
Hash一致性说明
Hash一致性——特性
问题说明
因为所有节点都是通过ip地址加算法计算获取的,则可能会出现节点分配不均的问题.导致数据丢失.
均衡性
说明:均衡性要求节点中的数据尽可能的平均.
措施:引入虚拟节点概念
单调性
说明:当节点新增时,能够实现数据的自动的迁移.
补充说明:如果节点一旦丢失,则导致内存丢失则整个分片无法使用.
分散性
概念:由于分布式原因,导致系统不能获取全部的内存空间.导致一个key有多个位置.
负载
概念:由于分布式原因,系统不能获取全部的内存地址.导致同一个位置保存多个数据
Spring整合Redis分片
编辑properties文件
redis.nodes=ip:端口,ip:端口,……
redis.nodes=192.168.175.129:6379,192.168.175.129:6380,192.168.175.129:6381
编辑配置类
1 | //表示redis配置类 |
Redis持久化策略
说明
Redis中的数据都在内存中,如果断电宕机则内存数据丢失.其中数据应该持久化保存.不允许丢失.
持久化策略:
1. RDB模式
2. AOF模式
Redis持久化工作原理
说明:按照配置的时间,定期将内存数据保存到redis中的持久化文件中.
当redis服务器宕机之后重启时,首先读取指定的持久化文件,恢复内存数据,方便用户使用.
RDB模式
概念:
RDB模式是Redis中默认的持久化策略.保存的是redis的内存快照。占用的资源少.持久化效率最高的.
RDB特点:
1.RDB模式能够定期持久化,但是有丢失数据的风险.
2.Redis中默认的持久化策略
3.RDB模式做内存的快照. 效率高
4.占用磁盘空间较小.
RDB模式配置
1. 修改持久化文件名称
2.持久化文件目录设定
3.持久化策略
save 900 1 用户在900秒内做1次set操作时持久化1次
save 300 10 用户在300秒内做10次set草时持久化1次
save 60 10000 60秒内做10000次set 持久化一次
使用save持久化化时,如果执行持久化操作,则程序陷入阻塞.用户不能执行set.
AOF模式
特点:
1. AOF模式可以实现数据的实时持久化.
2. 记录的是用户的操作过程.
3. 持久化文件会比较大.
4. 持久化效率低.
5. AOF模式默认是关闭的
6. AOF模式持久化是异步的.
AOF模式持久化策略
1.开启AOF模式
2.修改持久化文件名称
3.持久化策略
# appendfsync always 只要用户执行”更新”命令则持久化一次
appendfsync everysec 每秒持久化一次.
# appendfsync no 由默认的操作系统决定什么时候持久化.
Redis缓存策略说明
1. 如果有并发查询时.如果缓存服务器宕机/缓存失效.则查询数据库.可能导致数据库宕机. 俗称缓存雪崩
2. 如果用户,高并发查询一个不存在的数据时.后台数据库有宕机的风险,俗称缓存穿透
限流 直至封杀IP地址. IP模拟器
3. 如果高并发条件下.当某一个热点的key,超时或者失效时.数据库有宕机的风险.俗称:缓存击穿
Redis内存机制
业务需求
Redis中的数据都保存内存中.内存中的数据如果一味的新增,不删除则内存数据很快存满.导致新的数据保存错误.
需求:用户每次都能存储数据,但是内存大小是可控的.要求动态维护内存大小.
Redis中内存策略
LRU算法
内存管理的一种页面置换算法,对于在内存中但又不用的数据块(内存块)叫做LRU,操作系统会根据哪些数据属于LRU而将其移出内存而腾出空间来加载另外的数据。
LFU算法
LFU(least frequently used (LFU) page-replacement algorithm)。即最不经常使用页置换算法,要求在页置换时置换引用计数最小的页,因为经常使用的页应该有一个较大的引用次数。但是有些页在开始时使用次数很多,但以后就不再使用,这类页将会长时间留在内存中,因此可以将引用计数寄存器定时右移一位,形成指数衰减的平均使用次数。
LFU:根据数据使用的次数多少删除数据.
内存优化策略
1. volatile-lru设定超时时间的数据采用LRU算法删除数据.
2. allkeys-lru所有的数据采用LRU算法删除数据
3. volatile-lfu设定了超时时间的数据采用LFU删除数据
4. allkeys-lfu所有的数据采用LFU算法删除数据
5. volatile-random设定了超时时间的随机删除
6. allkeys-random所有key随机删除
7. volatile-ttl设定了超时时间的数据排序.将马上要超时的数据提前删除.
8. Noeviction不删除数据.如果内存数据存满则报错返回. 该策略是默认策略
Redis主从同步
高可用介绍(HA)
“高可用性”(High Availability)通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性。
概括:利用技术手段实现了当服务器宕机,自动的实现故障的迁移.
业务说明
Redis的最终形态必须实现高可用,实现高可用的前提必须满足主从同步.
当发生故障,由于从机与主机的数据是相同的,所以可以非常灵活实现数据的故障迁移.
主从同步搭建
复制文件
说明:将分片文件夹shards复制为sentinel.(shards文件参考上方分片)
cp –r shards sentinel
检查主从关系
进入Redis-6379客户端,输入info replication
实现主从挂载
说明:6379当主机, 6380/6381当从机.
命令:在客户端中cli端 执行指令 **
**saveof IP 端口
挂载情况
主从测试
当在6379中写入数据时,从机80/81也同步了数据.
主从同步持久性
问题说明:通过slaveof指令可以指定主从关系.如果从机关闭之后重启问情况如何??
回答:
当6381重启之后,发现主从结构不存在了.6381变为主机.
如何解决该问题:
需求:当6381为从机时,当重启服务器依然是从机.
需要人为的动态修改redis.conf配置文件.
Redis哨兵实现高可用
Redis中哨兵的作用
分片作用:redis分片实现了redis内存扩容.
Redis哨兵:主要实现了redis节点的高可用.
Redis哨兵实现步骤
1. redis哨兵会监听redis主节点.
目的1:检查主节点是否存活
目的2:获取连接主节点的从机. IP:端口
2. 当利用ping-pong检测机制.检查主节点是否存活,当哨兵连续3次检测都没有数据返回.则表明主节点宕机.
3. 哨兵根据从主节点获取的从节点信息,进行推选.从中挑选一台新的从节点当做现在的主节点.将新的主从关系写入其他节点的redis.conf文件中.
4. 当服务器重启后,能够了解当前主从关系,实现了redis高可用.
Redis哨兵配置
复制哨兵配置文件
cp sentinel.conf sentinel/
编辑sentinel配置文件
1. 关闭保护模式 17行
2.开启哨兵后台启动 26行
3.修改哨兵监控 84行
sentinel monitor mymaster 127.0.0.1 6379 1
mymaster:当前主机的变量
IP:端口: redis主节点的IP和端口
投票生效票数: **
**规则:超半数即可,哨兵的数量是奇数.
4.主机宕机后多久进行推选.
5.修改哨兵推选失败超时时间.
Redis哨兵测试
1. 启动redis哨兵
redis-sentinel sentinel.conf
2. 当关闭redis-6379之后等10秒之后.检查主从结构是否正确.
Spring整合哨兵
入门案例
1 | //测试哨兵get/set操作 |
Spring整合哨兵思路
1. 利用配置类,封装JedisSentinelPool.
2. 利用工具API封装2个方法.set/get
编辑pro文件
redis.sentinels=192.168.175.129:26379
redis.sentinel.masterName=mymaster
编辑配置类
1 | //表示redis配置类 |
编辑工具API
1 |
|
编辑RedisAOP配置项
项目测试
说明:重启tomcat服务器.检查程序调用是否正确.当redis节点宕机时.检查是否影响用户操作redis.
Redis集群
背景
1. Redis分片
用户通过API利用hash一致性算法,实现了数据存储.利用分片机制实现了内存的扩容!!!
缺点:如果一个节点宕机.,则违反单调性要求,分片失效.
2. Redis哨兵
哨兵基于心跳检测机制.实现redis节点高可用.但是前提必须配置主从.
哨兵缺点:
1. 操作的redis依然是单台,内存无法扩容.
2. Redis哨兵也有可能宕机.
分片:没有高可用效果.
哨兵:哨兵本身没有高可用需要借助第三方. 内存没有扩容.
Redis集群介绍
说明:搭建redis集群可以实现redis分片和哨兵的全部功能!!!.Redis集群中所有的主节点参与选举.redis集群中全部的节点都能互相通信.所有的节点都有投票权(发现某个节点宕机投票数+1)
集群搭建
集群设计
最小的集群单位3个主节点,从机不做要求,搭建策略一主一从
主机3台
端口:7000/7001/7002
从机3台
端口:7003/7004/7005
准备集群文件
1.准备集群文件夹
redis根目录下Mkdir cluster
2.在cluster文件夹中分别创建7000-7005文件夹mkdir 7000 7001 7002 7003 7004 7005
复制配置文件
说明:
将redis根目录中的redis.conf文件复制到cluster/7000/ 并以原名保存cp redis.conf cluster/7000/
编辑配置文件
1. 注释本地绑定IP地址
2.关闭保护模式
3.修改端口号
4. 启动后台启动
5. 修改pid文件
6. 修改持久化文件路径
7. 设定内存优化策略
8. 关闭AOF模式
9. 开启集群配置
10. 开启集群配置文件,保存集群中的状态信息.谁是主机,谁是从机
11. 修改集群超时时间
复制修改后的配置文件
说明:将7000文件夹下的redis.conf文件分别复制到7001-7005中
1 | [root@localhost cluster]# cp 7000/redis.conf 7001/ |
批量修改
说明:分别将7001-7005文件中的7000改为对应的端口号的名称,
修改时注意方向键的使用
通过脚本编辑启动/关闭命令
1. 创建启动脚本 vim start.sh
2.编辑关闭的脚本 vim shutdown.sh
3.启动redis节点sh start.sh
4.检查redis节点启动是否正常
ps ef | grep redis
创建redis集群
#5.0版本执行 使用C语言内部管理集群redis-cli --cluster create --cluster-replicas 1 192.168.35.130:7000 192.168.35.130:7001 192.168.35.130:7002 192.168.35.130:7003 192.168.35.130:7004 192.168.35.130:7005
Redis高可用测试
1. 关闭redis主机.检查是否自动实现故障迁移.
2. 再次启动关闭的主机.检查是否能够实现自动的挂载.
一般情况下 能够实现主从挂载
个别情况: 宕机后的节点重启,可能挂载到其他主节点中(7001-7002) 正确的
Redis集群工作原理
数据存储原理
分片数据存储原理: 根据hash一致性算法实现数据存储.
Hash一致性运算发生在服务器端.
在存储数据前已经计算完成存储到哪台redis服务器中.
分片中存在的问题:
* 分片的数据是用户通过服务器程序计算进行存储.用户也可以利用redis的客户端进行非法的操作.修改分片中的数据!!! *
集群中数据存储:1.当在从节点中存储数据时.不允许操作,只有主节点能够set/get数据。2.Redis集群与分片明显不同.存储数据必须满足条件.
Redis集群储存条件:
说明:redis集群一共有16384个槽位.这些操作会均匀的分配给主节点.
当数据进行存取时首先根据key进行计算.计算槽位的位置.之后从节点中获取数据.
Crc16算法
Redis集群宕机条件
宕机条件:Redis集群宕机的条件是主节点宕机则集群奔溃
例子:9个redis节点 3主6从 节点宕机多少次集群奔溃
5-7台集群奔溃
条件说明:Redis集群中当节点宕机后,由主节点进行推选.如果当前节点没有从节点时.从其他主节点中借用多余的从节点
SpringBoot整合Redis集群
测试案例
1 |
|
编辑pro文件
redis.nodes=192.168.175.129:7000,192.168.175.129:7001,192.168.175.129:7002,192.168.175.129:7003,192.168.175.129:7004,192.168.175.129:7005
编辑配置类
1 | //表示redis配置类 |