Redis缓存服务器
1.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)。
速度: 读: 11.2万次/秒 写: 8.6万次/秒 平均10万次/秒
2.流程图
3.缓存机制
说明: 缓存中的数据都是数据库中的记录. 引入缓存机制之后,主要的目的为了降低用户访问物理设备的频次.提高服务器响应效率.
维度说明:
1).开发语言: C语言开发
2).数据结构问题: K-V结构 map/properties key不能重复
3).内存数据 断电及擦除: 定期将内存数据持久化操作
4).内存资源有效: 如何有效的维护内存大小? 定期清理内存. LRU算法/LFU算法/TLL算法
4.Redis安装
4.1 安装步骤
上传安装包并解压,解压命令:tar -xvf redis-5.0.4.tar.gz 解压后通过命令 mv redis-5.0.4 redis 改名为redis。完成后进入redis根目录进行操作
命令1: make
命令2: make install
3.4.3修改redis配置文件
命令: vim redis.conf
1).关闭IP绑定
2).关闭保护模式
3).开启后台运行
4.2 Redis的常用命令
1)启动命令:redis-server redis.conf
2)查看redis是否运行:ps -ef | grep redis
3)进入redis客户端:redis-cli -p xxxx
4)关闭redis:redis-cli -p xxxx shutdown
5.Redis持久化机制
Redis中的运行环境是在内存中, 但是内存特点 断电即擦除.
想法:能否保存redis中的内存数据不丢失呢?
持久化: 将内存数据定期保存到磁盘中.
5.1 RDB模式
5.1.1 RDB模式说明
1.Redis 定期 将内存数据保存到RDB文件中.
2.RDB模式 redis默认的规则.
3.RDB模式记录的是内存数据的快照 ,持久化效率更高(只保留最新数据)
4.RDB模式由于定期持久化,可能导致数据丢失.
5.1.2 RDB持久化
- 持久化操作 save 同步操作 可能其他线程陷入阻塞
- 后端持久化 bgsave 异步操作 用户操作不会陷入阻塞 该操作什么时候完成不清楚.
5.1.3 RDB配置
save 900 1 900秒内用户更新1次 则持久化1次
save 300 10 300秒内用户更新10次 持久化 1次
save 60 10000 60秒内用户更新10000次 持久化1次
save 1 1 保证数据安全性 问题:效率极低 容易阻塞
如果想让持久化性能更优,则需要通过监控的手段灵活运用.
总之用户操作越频繁,则持久化周期越短.
5.2 AOF模式
说明:
当开启AOF策略之后,redis持久化以AOF为主.
特点:
- AOF文件默认关闭的,需要手动开启
- AOF文件记录的是用户的操作过程.则可以实现实时持久化操作.(几乎不丢数据)
- AOF文件做追加的操作,所有持久化文件较大.
- AOF持久化时,采用异步的方式进行.
- AOF文件需要定期清理.
5.2.1 打开AOF模式
默认关闭
手动打开
5.1.2 AOF持久化原则
appendfsync always 用户执行一次操作,持久化一次
appendfsync everysec 每秒持久化一次
appendfsync no 不主动持久化
5.3 如何选择AOF模式和RDB模式
1.如果用户追求速度,允许少量的数据丢失 首选RDB模式. 快
2.如果用户追求数据的安全性. 首选AOF模式.
一般来说redis会开启两种模式
常规用法: 会配置redis主从结构 主机开启RDB模式 从机开启AOF模式
6. Redis内存优化
6.1 为何要进行redis内存优化
因为redis是运行在内存中,内存在电脑中的资源是有限的,不能无限制的扩容,所以在存储时就需要对内存数据进行优化
redis中内存大小的设定为:
最大内存设定为:
6.2 LRU算法
LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面(数据)予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t,当须淘汰一个页面时,选择现有页面中其 t 值最大的,即最近最少使用的页面予以淘汰。
维度: 时间T
6.3 LFU算法
LFU(least frequently used (LFU) page-replacement algorithm)。即最不经常使用页置换算法,要求在页置换时置换引用计数最小的页,因为经常使用的页应该有一个较大的引用次数。但是有些页在开始时使用次数很多,但以后就不再使用,这类页将会长时间留在内存中,因此可以将引用计数寄存器定时右移一位,形成指数衰减的平均使用次数。
维度: 引用次数
6.4随机算法
说明: 随机生成挑选数据删除.
6.5 TTL算法
说明: 根据设定了超时时间的数据,将马上要超时的数据提前删除.
6.6 算法优化
1.volatile-lru 设定超时时间的数据中,采用lru算法删除数据.
2.allkeys-lru 在所有的数据中 采用LRU算法删除数据.
3.volatile-lfu 在设定了超时时间的数据中 采用LFU算法删除数据.
4.allkeys-lfu 在所有数据中. 采用LFU算法删除数据.
5.volatile-random 设定了超时时间数据,采用随机的方式删除数据
6.allkeys-random 所有数据采用随机算法.
7.volatile-ttl 设定超时时间的数据,采用TTl算法删除.
8.noeviction 默认不删除数据. 如果内存满了,则报错返回. 默认策略
7.Redis缓存常见问题
7.1 缓存穿透
在高并发的条件下,用户频繁访问一个不存在的数据,导致大量的请求直接发往数据库,极大可能会使服务器宕机
解决方案:
- 只要能够保障用户访问的数据,数据库中一定存在,布隆过滤器
- IP限流,黑名单,微服务中可以通过API网关进行控制
7.2 缓存击穿
说明: 在高并发条件下,用户频繁访问一个热点数据.,但是该热点数据在缓存中失效,导致用户直接访问数据库,给数据库带来巨大压力
7.3 缓存雪崩
说明: 在高并发的条件下,有大量的缓存数据失效了,redis缓存服务器命中率就变低了,导致用户直接访问数据库的可能性增大
主要问题: 热点数据失效
解决方案:
1.为热点数据设定超时时间时,采用随机数10秒+随机数,保障数据不会同时失效
2. 设定多级缓存,一级缓存数据失效可以访问二级缓存,极大减少用户访问数据库的概率,减轻数据库的压力
8. Redis分片机制
说明: 如果有海量的内存数据需要保存,但是都把数据保存到1个redis中,查询的效率太低,如果这台redis服务器宕机,则整个缓存将不能使用,因此采用分片机制来提高效率
8.1 Redis分片搭建
8.1.1 准备配置文件
8.1.2 修改端口号
分别将6379/6380/6381的端口号进行配置
8.1.3 启动三台Redis
命令:redis-server 6379.conf & redis-server 6380.conf & redis-server 6381.conf &
校验命令:ps -ef | grep redis
9. 一致性Hash算法
一致性哈希算法在1997年由麻省理工学院提出,是一种特殊的哈希算法,目的是解决分布式缓存的问题。在移除或者添加一个服务器时,能够尽可能小地改变已存在的服务请求与处理请求服务器之间的映射关系。一致性哈希解决了简单哈希算法在分布式哈希表( Distributed Hash Table,DHT) 中存在的动态伸缩等问题 。
1.首先求出memcached服务器(节点)的哈希值,并将其配置到0~2^32的圆(continuum)上。
2.然后采用同样的方法求出存储数据的键的哈希值,并映射到相同的圆上。
3.然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过2^32仍然找不到服务器,就会保存到第一台memcached服务器上
核心知识:
1.一致性hash解决了数据与节点的映射关系(数据归谁管理)
2. 节点增加/减少时,数据可以弹性伸缩.
9.1 原理
9.2 特性—平衡性
说明: 平衡性是指hash的结果应该平均分配到各个节点,这样从算法上解决了负载均衡问题
解决策略: 引入虚拟节点
9.3 特性—单调性
单调性是指在新增或者删减节点时,不影响系统正常运行
无论节点增/减,数据都能找到与之匹配的node进行数据的挂载
9.4 特性—分散性
分散性是指数据应该分散地存放在分布式集群中的各个节点(节点自己可以有备份),不必每个节点都存储所有的数据
10. Redis哨兵机制
说明:
1.当哨兵启动时,会链接redis主节点,获取所有节点的相关信息
2.当哨兵通过心跳检测机制 PING -PONG 命令校验服务器是否正常
3.如果哨兵连续3次发现服务器没有响应,则断定当前主机宕机
4.之后由哨兵采用随机算法挑选其中的一个从机当选主机,并且其他的节点当做新主机的从
10.1 配置哨兵
1).复制文件
cp sentinel.conf sentinel/
2).关闭保护模式
3.开启后台运行
4.哨兵监控
5.修改宕机时间
10.2 哨兵命令
1.启动 redis-sentinel sentinel.conf
2.关闭哨兵 ps -ef |grep redis kill -9 PID号
备注:如果搭建错误,则需要删除最后一条主从关系,之后重启服务器,重新搭建
10.3 集群搭建错误删除
1.关闭redis集群
2.删除多余的配置文件
10.4 分片与哨兵
1.分片作用: 扩大内存实现海量数据数据的存储,缺点: 没有实现高可用
2.哨兵作用: 实现了节点的高可用,缺点: 1.哨兵不能实现扩容 2.哨兵本身没有高可用
11. 集群工作原理
11.1 集群宕机条件
宕机条件: 如果节点主机数量缺失,则集群崩溃.
案例1: 1主1从.现在→ 3台主机/3台从机 共6台redis. 至少宕机2台 集群崩溃
案例2: 1主2从.现在→ 3台主机/6台从机 共9台redis. 至少宕机5台 集群崩溃