您的位置:首页 > 数据库 > Redis

reids的缓存机制,redis事务控制,redis分片机制,一致性hash算法,redis持久化策略,Redis内存策略,内存优化算法

2020-06-26 04:15 471 查看

redis:利用缓存机制可以有效的降低用户访问数据的次数,减少了数据库的压力

缓存机制要素:
1.用k-v数据结构储存
2.要求缓存速度快
3.用lru算法控制内存大小
**LRU是什么?**按照英文的直接原义就是Least Recently Used,最近最久未使用法,它是按照一个非常著名的计算机操作系统基础理论得来的:最近使用的页面数据会在未来一段时期内仍然被使用,已经很久没有使用的页面很有可能在未来较长的一段时间内仍然不会被使用。基于这个思想,会存在一种缓存淘汰机制,每次从内存中找到最久未使用的数据然后置换出来,从而存入新的数据!它的主要衡量指标是使用的时间,附加指标是使用的次数。在计算机中大量使用了这个机制,它的合理性在于优先筛选热点数据,所谓热点数据,就是最近最多使用的数据!因为,利用LRU我们可以解决很多实际开发中的问题,并且很符合业务场景添加链接描述
https://www.geek-share.com/detail/2753558900.html
4.如果缓存宕机/断电,使用持久化操作把数据保存进磁盘保证数据的安全性
5.多线程操作,把并发改串行来保证数据的一致性/安全性

Redis介绍
一个内存中的数据结构储存系统,可以用做数据库,缓存,消息中间件,支持多种类型的数据结构,如:字符串Strings,散列hashes,列表lists,集合sets,有序集合sorted sets.范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。

redis事务控制
redis的事务是弱事务,只对单台redis有效,如果有多台redis,一般使用队列的形式

redis分片机制
说明:Redis内存容量有限,不能一味的扩大内存.因为寻址的时间大大增加,性价比不高.所以最好的方式准备多台redis分别存储数据,实现内存的扩容.提高读写效率.

一致性hash算法
一种特殊的哈希算法,目的是为了解决分布式缓存问题,在移除或添加一个服务器时,能够尽可能的改变已存在的服务请求与处理请求服务器之间的映射关系,一致性hash算法解决了简单hash算法在分布式hash表中存在的动态伸缩等问题

特点
1.新增/移出节点:要求尽可能小的改变原有的映射关系
2.解决了分布式环境下的储存动态伸缩(弹性)问题

算法说明
1.对同样的数据尽兴hash运算,所得到的结果必然相同
2.一般条件下hash值的取值范围 2^32

一致性hash算法的原理
运算发生在内存中,但是数据储存需要链接redis实现set/get操作

一致性hash的特点
1.平衡性:指hash的结果应该平均分配到各个节点上,这样从算法上解决了负载不均的问题,通过添加虚拟节点实现数据平衡(虚拟节点:为负载小的节点创建虚拟节点)

单调性:单调性是指在新增或者删除节点上,不影响系统正常运行,其中的数据可以自动的实现迁移

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

redis持久化策略
redis的运行环境是内存中,其特点是断电或者宕机即数据清空.为了保证数据的有效性,提高用户的查询效率.所以内存的数据必须持久化.定期将内存中的数据写入到执行的文件中(磁盘中).如果redis服务器宕机了.如果下次重启时,则先读取持久化文件实现数据的恢复.

RDB模式:
1).RDB模式是redis的默认的持久化策略.

2).Redis会定期的将数据以快照的形式保存的RDB文件中.

风险:RDB模式由于定期保存数据,所以可以会丢失数据.

3).RDB模式由于记录的是内存数据的快照所以持久化的效率较高.
新的快照会覆盖旧的快照.每次保留的都是最新的数据. 持久化文件的大小,相对固定.

AOF模式:
1).AOF模式默认条件下是关闭状态,需要手动开启

2).AOF模式可以实现实时持久化操作.可以有效的解决数据丢失问题.

3).AOF模式做持久化操作时,记录的是用户的操作过程.

4).AOF的持久化文件相对较大,恢复数据的速度较慢.

AOF持久化策略
appendfsync always 当用户更新了redis,则追加用户操作记录到aof文件中

appendfsync everysec 每秒持久化一次. 略低于rdb模式.

appendfsync no 不持久化(不主动持久化,由操作系统决定什么时候持久化) 该操作一般不配.

总结:
1.如果内存数据可以允许少量的数据丢失,则首选rdb
2.如果内存数据存储的是业务数据不允许丢失,则选用aof模式.(AOF文件相对较大,所以定期维护.)
3.redis中所有的操作都是单进程单线程操作.(串行的)所以不会造成线程并发性问题

面试题1:
如果小李在操作redis时不慎执行了FLUSHALL,你作为项目经理如何处理???

答:

1.首先关闭所有的redis

2.找到redis的AOF文件. 将FLUSHALL命令删除.之后重启redis服务器即可.

面试题2.
问题描述: 如果同时开启了aof模式和rdb模式.问哪个生效?

答:

1.默认条件下redis采用rdb模式,如果开启了AOF模式,则以aof模式为主.

2.同时可以通过save指令,实现rdb模式的持久化操作.

Redis内存策略
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 不删除任何数据,只是报错返回.

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

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

Random:随机算法

TTL算法:
根据剩余的存活时间,挑选时间最少的删除

1.缓存穿透:
访问数据库中压根不存在的数据,则导致缓存失效.所有的请求都访问数据库.导致数据库有宕机的风险.称之为缓存穿透.

解决方案:
一般做数据的有效性的校验.

2.缓存击穿
场景说明:美国的暴乱信息,则redis缓存服务器中存储.但是该数据设定了有效期.当数据有效期时间一到,该数据就会在内存中删除.如果在这时有海量的用户访问"暴乱信息"则都会去查询数据库,导致数据库在一定的时间内并发增多,数据库有宕机的风险.

说明:某个热点数据(1个数据)由于超时/删除,导致大量的用户请求在同一时间访问数据库.

如何解决:
1.将热点数据永久保存.
2.添加互斥(排它)锁(每次只能有一个用户访问数据库/第二次走缓存) lock操作

缓存雪崩:
在redis内存中的数据,在一定的时间内,有大量的缓存数据失效(多个),这时用户大量的访问缓存服务器,但是缓存中没有指定数据,则访问数据库.容易出现数据库宕机的现象.

如何解决:
1.让热点数据永久有效
2.设定超时时间采用随机数. 让超时的数据不要在同一时间发生
3.设定多级缓存

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: