redis

2. Redis

2.1 缓存机制说明

问题1: 为什么用户直接操作数据库效率低? 创建/销毁需要大量的时间 1 CURD操作花费的时间是"固定". 0.05S JDBC/数据库链接池.
问题2: 为什么创建链接耗时? 使用TCP协议 3次握手机制 4次挥手操作

说明: 缓存机制实质是为了降低用户访问物理设备的频次,减少用户的交互的时间,提高数据响应的能力.
在这里插入图片描述

2.2 实现缓存机制要素

  1. 数据结构应该采用什么类型? 采用K-V结构
  2. 内存特点断电即擦除如何防止? 将内存数据进行持久化操作(存到磁盘中)
  3. 内存容量有限,如何只保存热点数据? LRU算法/LFU算法/TTL算法/随机算法
  4. 为了与硬件交互性强,所以采用C语言的方式进行开发.

2.3 Redis

2.3.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 Redis安装

2.3.1 上传安装包

在这里插入图片描述

2.3.2 解压安装包

在这里插入图片描述
整合目录:
在这里插入图片描述

2.3.3 安装redis

说明:跳入到redis根目录中执行 make make install命令
1).make 执行效果
在这里插入图片描述
2).make install效果
在这里插入图片描述

2.3.4 修改redis配置文件

1).将IP绑定注释
在这里插入图片描述
2).关闭保护模式
在这里插入图片描述
3).开启后台启动
在这里插入图片描述

2.3.5 Redis入门命令

1.启动命令: redis-server redis.conf
2.进入客户端: redis-cli -p 6379
3.关闭redis: redis-cli -p 6379 shutdown
在这里插入图片描述

 

2. 关于Redis 策略说明

2.1 需求说明

如果redis服务器宕机/或者断电 则可能会导致整个内存数据丢失. 为了防止该现象的发生,redis内部引入持久化机制.

持久化: 将内存数据按照特定的规则保存到磁盘中.

2.2 RDB模式

2.2.1 RDB模式说明

1).RDB模式是Redis默认持久化机制.
2).RDB模式记录的是内存数据的快照,持久化效率更高. (只会保留当前最新数据)
3).RDB模式是定期持久化. 也可以手动操作 save(同步) 用户操作可能阻塞 /bgsave 后端运行(异步)
4).由于是定期备份,所以可能导致数据丢失.

2.2.2 RDB模式配置项

1).持久化策略
save 900 1 900秒 1次更新,则持久化一次
save 300 10 300秒 10次更新 则持久化一次
save 60 10000 60秒 10000更新 则持久化一次
save 1 1 效率极低. 不要这样配置 压测之后进行适当的调整.

2).持久化文件名称
在这里插入图片描述

3).持久化文件位置
在这里插入图片描述

2.3 AOF模式

2.3.1 AOF模式说明

1).默认条件下AOF模式处于关闭状态,如果需要开启,则手动配置
2).AOF模式记录用户的操作的过程,可以实现实时的持久化操作, 持久化文件相对较大维护不易.
3).如果同时开启了 RDB与AOF模式,则默认以AOF模式为准.
4).AOF模式是一种异步的操作,不会影响程序的正常使用

2.3.2 AOF模式配置

1).开启AOF配置
在这里插入图片描述
2).日志信息展现
在这里插入图片描述
3).AOF模式持久化策略
appendfsync always 用户执行一步操作,则持久化一次
appendfsync everysec 每秒持久化一次 性能略低于RDB模式
appendfsync no 不主动持久化

2.3.3 持久化方式如何选择

1.如果允许少量的数据丢失 首选RDB模式 快
2.如果不允许数据丢失, 首选AOF模式.
3.工作中一般如何选择 主机 选用RDB模式 从机 选用AOF模式.

2.3.4 关于持久化面试题

公司新来了个漂亮的实习生. 去生产环境下,误操作了flushall命令,问你作为主管 如何处理?
解决方案:
1.进入AOF文件中,修改文件信息.,将fluashAll命令删除

2.4 Redis 内存策略

2.4.1 需求介绍

Redis中的数据,保存到内存中. 但是内存资源相对较少.如何保证其中的数据都是热点数据呢

2.4.2 内存优化-LRU算法

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

2.4.3 内存优化-LFU算法

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

2.4.4 内存优化-Random算法

2.4.5 内存优化-TTL算法

根据剩余的存活时间,排序,根据时间少的删除数据.

2.4.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 默认规则 如果内存满了,则不做任何操作 直接报错返回.

2.4.7 设定内存优化策略

在这里插入图片描述

 

2.5 关于Redis面试问题(二)

2.5.1 什么是缓存穿透

概念: 在高并发环境下,用户长时间访问数据库中不存在的数据,称之为缓存穿透.
原理:
在这里插入图片描述
解决方案:
1. IP限流 单位时间内设定IP的请求的次数.
2. 布隆过滤器

2.5.1.0 关于计算机进制换算

1 B/byte(字节) = 8 bit(比特)(二进制位) 。

1 KB(千字节) = 1024 B/byte(字节) 。

1 MB = 1024 KB 。

1 GB = 1024 MB 。

1TB =1024 GB 。

1 PB = 1024 TB 。

1 EB = 1024 PB。

2.5.1.1 布隆过滤器介绍

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

2.5.1.2 布隆过滤器算法

在这里插入图片描述

2.5.1.3 算法优化

说明:由于hahs碰撞带来的问题.所以需要对算法进行优化 降低hash碰撞的概率.
解决方案:
1. 增加二进制向量的位数. 8/16/32/1024…
2. 增加hash函数的个数.

总结: 适当的增加二进制向量的位数和hash函数个数,可以有效的降低hash碰撞的概率
guva 包 谷歌大神手写布隆过滤器算法…
在这里插入图片描述

1.2 什么是缓存击穿

介绍: 由于某个热点数据在缓存中失效.导致大量的用户直接访问数据库.导致数据库宕机.
俗语: 趁他病 要他命

1.3 什么是缓存雪崩

说明: 由于大量的数据在缓存中失效.导致用户访问缓存的命中率低.直接导致用户访问数据库.
如何处理: 1.采用多级缓存 2.设定的超时时间不要相同. 10+随机数
在这里插入图片描述

posted @ 2021-01-25 17:11  Liang-shi  阅读(85)  评论(0编辑  收藏  举报