5

Redis缓存

 3 years ago
source link: https://segmentfault.com/a/1190000038465574
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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.2redis的做用

引入缓存机制可以有效的减少用户访问物理设备的次数,从而提高相应速度;

1.2如何设计缓存?

1.缓存数据如何存储? 应该采用什么样的数据结构呢? K-V key的唯一性

2.缓存数据的容量大小 应该动态维护缓存数据,将不需要的数据提前删除. LRU算法/LFU算法/随机算法/TTL算法

3.缓存数据保存到内存中,但是内存的特点断电即擦除. 定期将内存数据持久化(写入磁盘中)

4.单台缓存服务器性能不足,所以一般需要搭建集群(实现高可用).

5.使用C语言开发.

2 Redis属性说明

2.1 Redis持久化策略

2.1.1 为什么要持久化

Redis中的记录都保存在内存中,如果内存断电或者服务器宕机,则内存数据直接丢失.业务中不允许发生. 所以需要将数据定期进行维护.

2.1.2 RDB模式

说明: RDB模式是Redis的默认的持久化策略.无需手动的开启.

特点:

1.Redis会定期的执行RDB持久化操作. 缺点: 可能导致内存数据丢失 .

2.RDB记录的是 内存数据的快照 ,并且后续的快照会覆盖之前的快照.每次只保留最新数据.效率更高.

命令:

1).save 命令 要求立即执行持久化操作 save会造成线程的阻塞.

2).bgsave 命令 后台执行持久化操作 后台运行不会造成阻塞. 异步操作, 不能保证立即执行

2.1.3 AOF模式

说明: AOF模式默认条件下是关闭的,需要手动的开启,如果开启了AOF模式则RDB模式将失效.但是如果手动执行save命令,则也会生成RDB文件.

1).开启AOF模式

yURNVnu.png!mobile

特点:

1.AOF模式记录程序的 执行的过程 .所以可以 保证数据不丢失 .

2.由于AOF记录程序运行的过程,所以整个 持久化文件相对大 ,所以需要定期维护. 效率低

.1.4 RDB与AOF模式持久化对比

1).RDB模式

save 900 1 如果在900秒内,执行了一次更新操作则持久化一次

save 300 10

save 60 10000 操作越快 ,持久化的周期越短.

2).AOF模式

appendfsync always 用户执行一次更新操作,则持久化一次 异步操作

appendfsync everysec 每秒操作一次

appendfsync no 不主动操作 一般不用.

2.1.5 关于RDB与AOF总结

策略: 如果数据允许少量丢失,首选RDB模式,

如果数据不允许丢失则首选AOF模式.

企业策略: 又要满足效率,同时满足数据不丢失.

主机: 采用RDB模式

从机: 采用AOF模式

2.1.6问题

问题1:误操作将redis服务器执行了flushAll命令,问你如何处理??

解决方案: 需要将从库中的AOF文件 进行编辑,删除多余的flushAll命令,之后重启redis即可.

问题2:误将aof文件一并删除,问如何处理???

答: 杀人祭天!!!

2.2Redis内存策略

2.2.1 LRU算法

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

判断维度: 时间T

2.2.2 LFU算法

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

判断维度: 使用次数

2.2.3 随机算法

随机算法

2.2.4 TTL算法

将剩余时间短的数据,提前删除.

2.2.5 Redis的内存优化策略

  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 不做任何操作,只是返回报错信息.
    UfIvQna.png!mobile

2.3 关于Redis常见问题

2.3.1 缓存穿透

说明: 用户高并发环境下访问 数据库缓存 中都 不存在的数据 称之为缓存穿透现象.

AfyyUv.png!mobile

解决方案:

1). 禁用IP 限制IP访问.

2). 限流 每秒最多访问3次

3). 布隆过滤器

布隆过滤器

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

原理:

j6nm6zR.png!mobile

布隆过滤器优化:

问题:如何解决hash碰撞问题

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

如何降低hash碰撞的几率:

答:

1.扩容二进制向量位数.

2.增加hash函数的个数

当位数增加/函数适当增加,则可以有效的降低hash碰撞的几率. 默认值 0.03

7jqa2e2.png!mobile

2.3.2 什么是缓存击穿

说明: 某个(一个)热点数据在缓存中突然失效. 导致大量的用户直接访问数据库.导致并发压力过高造成异常.

aQFBRbB.png!mobile

解决方案:

1.尽可能将热点数据的超时时间 设定的长一点

2.设定多级缓存 超时时间采用随机算法.

JFBBzqI.png!mobile

2.3.3 什么是缓存雪崩

说明: 在缓存服务器中,由于大量的缓存数据失效,导致用户访问的命中率过低.导致直接访问数据库.

问题分析:

  1. fluashAll命令可能导致缓存雪崩.
  2. 设定超时时间时,应该采用随机算法
  3. 采用多级缓存可以有效防止.

6bYZ7bI.png!mobile

3.linux系统安装redis

3.1 上传Redis

1).上传redis

YzyAjuQ.png!mobile

2).解压redis服务

[root@localhost src]# tar -xvf redis-5.0.4.tar.gz

3).移动文件/修改文件名称

73Mbqi6.png!mobile

3.2 安装Redis

说明:在Redis根目录中执行如下命令

1).make

uUnuAnn.png!mobile

2). make install

aUbUb2A.png!mobile

3.3 修改redis配置文件

修改redis根目录下的redis.conf文件

1).去除IP绑定

J7RrimR.png!mobile

2).修改保护模式

aIvmqyv.png!mobile

3).开启后台启动

YFZ7jub.png!mobile

3.4 Redis服务器命令

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

1).启动redis

redis-server redis.conf

Zryaiin.png!mobile

2).进入redis客户端

redis-cli -p 6379

ctrl + c 退出客户端

yuYN7v.png!mobile

3).关闭redis服务器

MzYBj27.png!mobile

方法二:

redis-cli -p 6379 shutdown

说明:如果操作端口是默认端口(6379) 6379可以不写;

4 redis分片机制

4.1 redis性能优化

说明: 单台redis内存容量是有限的.但是如果有海量的数据要求实现缓存存储,则应该使用多个Redis节点.

eyeQN3A.png!mobile

4.2 Redis分片机制定义

Nbei2aQ.png!mobile

4.3 Redis分片机制配置

4.3.1 配置规划

说明: 准备3台redis服务器 分别为 6379/6380/6381

4.3.2 准备3个配置文件

EB3quuj.png!mobile

修改各自端口号 改为6380 6381

iAVvMjA.png!mobile

4.3.3 启动redis服务器

B3Qfmmq.png!mobile

4.3.4 检查redis启动状态

ue6Z7rr.png!mobile

5.Redis哨兵机制

5.1 Redis分片机制问题

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

5.2 Redis主从结构搭建

5.2.1 复制配置文件

qeuuYvf.png!mobile

5.2.2 准备3台redis

JzMzeu6.png!mobile

5.2.3 主从搭建

命令1: info replication

ZfANfyy.png!mobile

命令2: slaveof IP PORT 主从挂载命令

a6zMzaz.png!mobile

检查主从结构状态

AjQZbaz.png!mobile

ni6rYr.png!mobile

关于主从结构说明:

主和从都知道 当前的主从的状态, 并且只有主机可以写操作.从机只能读操作.

5.2 Redis哨兵机制工作原理

1).当哨兵启动时,首先会监控主机,从主机中获取当前所有的节点的状态,同时哨兵开启心跳检测机制.

2).当主机发生宕机的现象时,由于哨兵有PING-PONG机制 发现主机宕机,则哨兵开始进行选举.

3).当选举成功之后,新的主机当选之后,其他的节点当新主机的从.

ARbeqqz.png!mobile

5.3 编辑哨兵配置文件

6VZ3aa7.png!mobile

1)关闭保护模式

UZNbMv7.png!mobile

2).开启后台运行

Bn2IFba.png!mobile

3).编辑监控配置

j6Rf2iB.png!mobile

4).修改选举时间

vaa6f2f.png!mobile

5.4 启动哨兵服务

命令: redis-sentinel sentinel.conf

FNbiym.png!mobile

6.集群机制

就是结合分片和哨兵机制,且用不到哨兵服务,主机宕机由剩余的主机选取主机,就不用担心哨兵宕机而影像整个服务运行,一般一主两或三从,最少三个主机

6.1搭建集群:

计划三台主机三台从机,端口号7000~7005;

  1. 在redis下创建一个cluster文件夹,在cluster目录下创建7000~7005六个目录,在其中一个目录下复制一个redis.conf文件(redis个人目录下的,没被污染过)
  2. 修改配置文件,详情见redis集群搭建步骤,将修改好的配置文件复制给其余五个目录,之后将这五个目录下的配置文件中的7000换成对应的数据(:%S/7000/7001/g)
  3. 通过创建脚本命令来启动/关闭
  4. 创建redis集群:redis-cli --cluster create --cluster-replicas 1 192.168.126.129:7000 192.168.126.129:7001 192.168.126.129:7002 192.168.126.129:7003 192.168.126.129:7004 192.168.126.129:7005

6.2搭建成功

INBnymb.png!mobile


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK