关于Redis,你想知道的都有
目录
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)。
Redis的优点:
- Redis并发速度快,读:11.2万/秒 写:8.6万/秒 平均10万/秒 单台
- 数据类型丰富:Redis 支持String/hash/list/set/sSet
- 原子性:Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过 MULTI 和 EXEC指令包起来。
- 丰富的特性 – Redis 还支持 publish/subscribe, 通知, key 过期等等特性。
- 线程安全:Redis 是单进程单线程的,redis 利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销。所以Redis没有线程安全问题。
Redis持久化策略
概念介绍
说明:redis的运行环境是内存中,其特点是断电或者宕机即数据清空。为了保证数据的有效性,提高用户的查询效率。所以内存的数据必须持久化。定期将内存中的数据写入到执行的文件中(磁盘中)。如果redis服务器宕机了,下次重启时,则先读取持久化文件实现数据的恢复。
RDB模式
说明:
- RDB模式是redis的默认的持久化策略。
-
.Redis会定期的将数据以快照的形式保存的RDB文件中。
风险:RDB模式由于定期保存数据,所以可以会丢失数据。
-
RDB模式由于记录的是内存数据的快照所以持久化的效率较高。
新的快照会覆盖旧的快照。每次保留的都是最新的数据。持久化文件的大小,相对固定。
AOF模式
AOF模式说明
- AOF模式默认条件下是关闭状态,需要手动开启。
- AOF模式可以实现实时持久化操作。可以有效的解决数据丢失问题。
- AOF模式做持久化操作时,记录的是用户的操作过程。
- AOF的持久化文件相对较大,恢复数据的速度较慢。
AOF持久化策略
appendfsync always 当用户更新了redis,则追加用户操作记录到aof文件中
appendfsync everysec 每秒持久化一次. 略低于rdb模式.
appendfsync no 不持久化(不主动持久化,由操作系统决定什么时候持久化) 该操作一般不配.
关于持久化操作的总结
规则:
1.如果内存数据可以允许少量的数据丢失,则首选rdb。
2.如果内存数据存储的是业务数据不允许丢失,则选用aof模式。(AOF文件相对较大,所以定期维护。)
3.redis中所有的操作都是单进程单线程操作。(串行的)所以不会造成线程并发性问题。
面试问题:
(一)如果小李在操作redis时不慎执行了FLUSHALL,你作为项目经理如何处理???
答:
1.首先关闭所有的redis
2.找到redis的AOF文件. 将FLUSHALL命令删除.之后重启redis服务器即可.
(二)问题描述: 如果同时开启了aof模式和rdb模式.问哪个生效?
答:
1.默认条件下redis采用rdb模式,如果开启了AOF模式,则以aof模式为主.
2.同时可以通过save指令,实现rdb模式的持久化操作.
Redis内存策略
内存策略前提
说明:redis的数据保存在内存中,但是内存资源是有限的.如果需要存储海量的数据,则将之前的旧的数据应该先删除,之后再新增.
redis定义内存大小
说明:redis中提供了9种内存机制,可以根据其中不同的算法,实现内存数据的优化.
1).修改redis内存 (conf文件)
2).进制换算
内存优化算法介绍
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 不删除任何数据,只是报错返回.
修改内存策略设置: (conf文件)
LRU算法
LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t,当须淘汰一个页面时,选择现有页面中其 t 值最大的,即最近最少使用的页面予以淘汰。
判断维度:时间T
LFU算法
LFU(least frequently used (LFU) page-replacement algorithm)。即最不经常使用数据置换算法,要求在页置换时置换引用计数最小的页,因为经常使用的页应该有一个较大的引用次数。但是有些页在开始时使用次数很多,但以后就不再使用,这类页将会长时间留在内存中,因此可以将引用计数寄存器定时右移一位,形成指数衰减的平均使用次数。
判断维度: 使用次数
RANDOM
随机算法: 就像灭霸的响指 4bug 灭霸为什么不没有被干掉.
TTL
说明:根据剩余的存活时间,挑选时间最少的删除.
关于redis内存的面试问题
缓存穿透
场景说明:
有个坏人得知数据库中没有name="xxx"的数据.则多线程并发操作访问name="xxx"的数据.
说明:访问数据库中压根不存在的数据,则导致缓存失效.所有的请求都访问数据库.导致数据库有宕机的风险.称之为缓存穿透.
解决方案:
一般做数据的有效性的校验.
缓存击穿
场景说明:美国的暴乱信息,则redis缓存服务器中存储.但是该数据设定了有效期.当数据有效期时间一到,该数据就会在内存中删除.如果在这时有海量的用户访问"暴乱信息"则都会去查询数据库,导致数据库在一定的时间内并发增多,数据库有宕机的风险.
说明:某个热点数据(1个数据)由于超时/删除,导致大量的用户请求在同一时间访问数据库.
如何解决:
1.将热点数据永久保存.
2.添加互斥(排它)锁(每次只能有一个用户访问数据库/第二次走缓存) lock操作
缓存雪崩
说明: 在redis内存中的数据,在一定的时间内,有大量的缓存数据失效(多个),这时用户大量的访问缓存服务器,但是缓存中没有指定数据,则访问数据库.容易出现数据库宕机的现象.
如何解决:
1.让热点数据永久有效
2.设定超时时间采用随机数. 让超时的数据不要在同一时间发生
3.设定多级缓存
redis分片机制
分片机制的说明
需求说明
说明:由于业务需要,通常可能会将海量的数据保存到redis的内存中,实现用户快读读取.但是Redis内存容量有限,不能一味的扩大内存.因为寻址的时间大大增加,性价比不高.所以最好的方式准备多台redis分别存储数据,实现内存的扩容.提高读写效率.
一致性hash
一致性哈希算法在1997年由麻省理工学院提出,是一种特殊的哈希算法,目的是解决分布式缓存的问题。 [1] 在移除或者添加一个服务器时,能够尽可能小地改变已存在的服务请求与处理请求服务器之间的映射关系。一致性哈希解决了简单哈希算法在分布式哈希表( Distributed Hash Table,DHT) 中存在的动态伸缩等问题 [2] 。
1).新增/移除节点.要求尽可能小的改变原有的映射关系.
2).解决了分布式环境下的存储动态伸缩性(弹性)问题.
算法说明
1).常识1: 对同样的数据进行hash运算,所得到的结果必然相同.
常识2: 一般条件下 hash值的取值范围 2^32
2).为什么hash是2^32次方 (8位16机制数) 16进制(0-9 A-F)---->2^4
(2^4)^8=2^4*8=2^32 00000000-FFFFFFFF
3).一致性hash算法的原理
运算发生在内存中,但是数据存储需要链接redis实现set/get操作
一致性hash特点
平衡性
特点说明:
平衡性是指hash的结果应该平均分配到各个节点,这样从算法上解决了负载均衡问题 [4] 。
问题描述:
由于节点是通过hash计算得到的结果.所以可能出现如下的情况,发现数据分配严重不平衡.
优化:采用虚拟机节点的方式,实现数据的平衡
图解:引入虚拟节点之后,将原本属于node3的数据,自动的划分给了node2.实现了尽可能的数据平衡.
单调性
概念说明:单调性是指在新增或者删减节点时,不影响系统正常运行,其中的数据可以自动的实现迁移.
分散性
介绍:
分散性是指数据应该分散地存放在分布式集群中的各个节点(节点自己可以有备份),不必每个节点都存储所有的数据
归纳:鸡蛋不要放到一个篮子里.
Redis哨兵
哨兵工作原理
哨兵主要作用: 实现了redis节点的高可用(HA)
工作流程:
1).当哨兵启动时,首先要监控当前redis的主机.并且从主机中获取所有的从机信息。
2).当redis主机宕机之后,哨兵通过心跳检测机制检验主机是否宕机。如果连续3次都没有获取主机的反馈,则断定主机宕机.之后根据算法筛选出新的主机。
3).当哨兵选举出新的主机之后,则为了保证主从的关系,则会动态的修改各自的redis.conf配置文件。并且将其他的节点标识为新主机的从。
关于分片和哨兵总结
Redis分片特点
1.Redis分片机制可以实现Redis内存数据的扩容.
2.Redis分片机制中,是业务服务器进行一致性hash的计算.而redis服务器只需要负责数据的存储即可.所以redis分片机制性能更高.
3.Redis分片机制本身没有实现高可用的效果.如果redis节点缺失,则直接影响用户的使用.
Redis哨兵特点
1).redis哨兵实现了redis节点的高可用.
2).redis哨兵机制不能实现内存数据的扩容
3).哨兵本身没有实现高可用.哨兵如何宕机,则直接影响用户使用
目标:
1.既能实现redis分片机制,又能实现redis节点的高可用,同时不需要第三方监控.节点之间互相监督.
Redis集群
为什么搭建集群
通常,为了提高网站响应速度,总是把热点数据保存在内存中而不是直接从后端数据库中读取。
Redis是一个很好的Cache工具。大型网站应用,热点数据量往往巨大,几十G上百G是很正常的事儿。
由于内存大小的限制,使用一台 Redis 实例显然无法满足需求,这时就需要使用多台 Redis作为缓存数据库。但是如何保证数据存储的一致性呢,这时就需要搭建redis集群.采用合理的机制,保证用户的正常的访问需求.
采用redis集群,可以保证数据分散存储,同时保证数据存储的一致性.并且在内部实现高可用的机制.实现了服务故障的自动迁移.
面试题
问题1: redis集群中数据最多存储16384个 ?
答:
错误。
redis的hash槽算法,只能判断某个数据数据哪台redis管理.至于数据存储多少个,取决于redis的内存决定.
crc16("key1")%16384=1000
crc16("key2")%16384=1000
计算只能哪块存储,
问题2:redis集群中最多有多少台主机?????
答:
16384台主机 。
一块区域由一个redis管理. 一般工作中使用30-80 够用即可.