Redis缓存

1. Redis缓存服务

1.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万/秒 50万/秒

1.2 Linux安装Redis

1)上传redis

2)解压redis服务

tar -xvf redis-5.0.4.tar.gz

3)安装Redis
说明:在Redis根目录中执行如下命令
1).make
2). make install

1.3 Redis服务器命令

说明:Redis服务在运行时,必须依赖于配置文件redis.conf ,在操作redis时最好在redis的根目录中操作
1)启动redis

redis-server redis.conf

2)进入客户端

redis-cli -p 6379

3)退出客户端,

1、exit 2、ctrl+c

4)关闭redis服务

1、kill杀死 2、redis-cli -p 6379 shutdown

2 Redis持久化策略

2.1 为什么要持久化

Redis中的记录都保存在内存中,如果内存断电或者宕机,则内存数据就会直接丢失,为了防止数据丢失,所以需要将数据进行定期维护。目前 Redis 提供的持久化模式有两种:一种是RDB持久化(原理是将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化),另外一种是AOF(append only file)持久化(原理是将Reids的操作日志以追加的方式写入文件)

2.2 RDB模式

说明:RDB模式是redis默认的持久化策略,无需手动开启
特点:

  • RDB记录的是内存数据的快照,并且后续的快照会覆盖之前的快照.每次只保留最新数据.效率更高.
  • Redis会定期的执行RDB持久化操作. 缺点:可能导致内存数据丢失

命令:

  • save指令 将内存数据马上持久化到硬盘中. 该操作是阻塞的. 持久化操作优先.
  • bgsave指令 后台执行持久化操作. 不能保证立即马上持久化. 当服务器空闲时,会进行持久化操作.(内存不忙) 不会陷入阻塞.

2.3 AOF模式

说明: AOF模式默认条件下是关闭的,需要手动的开启,如果开启了AOF模式则RDB模式将失效.但是如果手动执行save命令,则也会生成RDB文件.
开启AOF模式:修改redsi.conf文件
在这里插入图片描述
特点:

  • AOF模式记录程序的执行的过程.所以可以保证数据不丢失.
  • 由于AOF记录程序运行的过程,所以整个持久化文件相对大,所以需要定期维护. 效率低
  • AOF模式的持久化是异步操作.不会影响用户的使用.用户使用不会陷入阻塞

2.4 RDB与AOF模式对比

1、RDB模式持久化

save 900 1      900秒内执行1次set操作.则持久化一次.
save 300 10     300秒内执行10次set操作.则持久化一次.
save 60 10000   60秒内执行10000set操作.则持久化一次. 

2、AOF模式

appendfsync always 用户执行一次更新操作,则持久化一次 异步操作
appendfsync everysec 每秒操作一次
appendfsync no 不主动操作 一般不用.

2.5 RDB与AOF总结

  • 如果使用时允许丢失部分数据(少量的)则使用RDB模式,它的效率高,也是redis默认的策略
  • 如果不允许丢失数据则采用AOF模式,它的安全性高,但是效率较低

3 Redis内存策略

3.1 LRU算法

LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t,当须淘汰一个页面时,选择现有页面中其 t 值最大的,即最近最少使用的页面予以淘汰。
判断维度: 时间T

3.2 LFU算法

LFU(least frequently used (LFU) page-replacement algorithm)即最不经常使用页置换算法,要求在页置换时置换引用计数最小的页,因为经常使用的页应该有一个较大的引用次数。但是有些页在开始时使用次数很多,但以后就不再使用,这类页将会长时间留在内存中,因此可以将引用计数寄存器定时右移一位,形成指数衰减的平均使用次数。
判断维度: 使用次数

3.3 Redis内存优化策略

volatile-lru 在设定超时时间的数据中采用LRU算法
allkeys-lru 所有的数据采用LRU算法删除
volatile-lfu 设定了超时时间的数据采用LFU算法删除
allkeys-lfu 所有数据采用LFU算法删除
volatile-random 设定了超时时间的数据采用随机算法
allkeys-random 所有数据的随机算法
volatile-ttl 设定了超时时间之后采用TTL算法
noeviction 不做任何操作,只是返回报错信息.

在这里插入图片描述

4 Redis相关问题

4.1.1 什么是缓存穿透

用户在高并发环境下访问数据库缓存中都不存在的数据称为缓存穿透现象
在这里插入图片描述
解决方案:

  • 禁用IP 限制IP访问.
  • 限流 每秒最多访问3次
  • 布隆过滤器

4.1.2布隆过滤器

布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。

原理:

首先需要将二进制向量数组进行初始化操作,将数组里的位都设置为0,再对缓存中的key依次使用哈希函数进行计算,每此都会产生一个哈希值,这个值对应数组上的一个位,然后将数组所在位标记为1。当有数据需要判断是否在缓存中存在时,同样会把数据的key用哈希哈数进行计算,在判断与哈希值对应的数组位上的标记是否为1,如果为1则数据可能存在,如果为0,则数据一定不存在

在这里插入图片描述
布隆过滤器优化:

由于hash碰撞问题,可能多个key有相同的位置,所以得出结论,布隆过滤器认为数据存在,那么数据可能存在.如果布隆过滤器认为数据不存在,则数据一定不在.

策略:

  • 扩容二进制向量位数.
  • 增加hash函数的个数
    当位数增加/函数适当增加,则可以有效的降低hash碰撞的几率. 默认值 0.03

原理:

当使用多个函数进行映射时,会产生多个哈希值,也就会对应多个位,此时这个key就会在多个位上含有标记为1的点,当有数据需要判断时,同样需要进行多个函数映射,产生出多个哈希值,如果该哈希值对应的多个位上标记的标记全为1,则数据存在,如果有一个或多个为0,则不存在。

在这里插入图片描述

4.2 什么是缓存击穿

在高并发环境下,当某个热点数据在缓存中突然失效时,导致大量用户直接访问数据库,导致数据库压力过大而造成的异常现象,

解决方案:

  • 尽可能将热点数据的超时时间 设定的长一点
  • 设定多级缓存 超时时间采用随机算法.

4.3 什么是缓存雪崩

在高并发环境下,缓存服务器中由于大量的缓存数据失效,导致用户访问的命中率过低,直接访问数据库.

解决方案:

  • 设定超时时间时,应该采用随机算法
  • 采用多级缓存可以有效防止.

5 Redis分片

5.1 redsi性能优化

说明:单台redis内存容量是有限的,但如果有海量的数据要求实现数据缓存,则应该使用多个redis节点
在这里插入图片描述

5.2 Redis分片机制

5.2.1一致性hash算法

一致性哈希算法在1997年由麻省理工学院提出,是一种特殊的哈希算法,目的是解决分布式缓存的问题。 [1] 在移除或者添加一个服务器时,能够尽可能小地改变已存在的服务请求与处理请求服务器之间的映射关系。一致性哈希解决了简单哈希算法在分布式哈希表( Distributed Hash Table,DHT) 中存在的动态伸缩等问题 [2] 。

5.2.2一致性hash算法原理

在一致性哈希算法中,整个哈希空间是一个虚拟圆环,假设有三个节点Node 经过ip地址的哈希计算,确定节点位置,当有数据需要存储时,对key进行哈希算法得到数据所在的位置,数据是按照顺时针的方式进行查找第一个存储节点。
在这里插入图片描述
在这里插入图片描述
缺点:各节点间数据存储可能会导致数据分布不均,

5.2.3 平衡性说明

平衡性是指hash的结果应该平均分配到各个节点,这样从算法上解决了负载均衡问题 .如果发现数据分布不均匀,则采用虚拟节点的方式,实现数据的平衡. 如果一次平衡不能达到目标则多次生成虚拟节点.但是数据平衡没有办法做到绝对的平均.

5.2.4 单调性说明

单调性是指在新增或者删减节点时,不影响系统正常运行
如果新增或者删除节点,则尽可能不要改变原有的数据结构.

5.2.5 分散性

分散性是指数据应该分散地存放在分布式集群中的各个节点(节点自己可以有备份),不必每个节点都存储所有的数据

6 Redis哨兵

6.1 Redis分片机制问题

说明: 如果redis分片中有一个节点宕机,则可能会影响整个服务的运行. redis分片没有实现高可用.

6.2 Redis哨兵机制工作原理

  • 当哨兵启动时,首先会监控主机,从主机中获取当前所有的节点的状态,同时哨兵开启心跳检测机制.
  • 当主机发生宕机的现象时,由于哨兵有PING-PONG机制 发现主机宕机,则哨兵开始进行选举.
  • 当选举成功之后,新的主机当选之后,其他的节点当新主机的从.
    在这里插入图片描述

6.3 关于分片/哨兵总结

  • Redis分片主要的作用实现内存的扩容,缺点:没有实现高可用的效果.
  • Redis哨兵主要的作用实现了redis节点高可用. 缺点:没有实现内存扩容
  • Redis哨兵机制实质就是引入第三方的监控,但是需要保证第三方的高可用.就必须引入更多的资源.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值