Redis

- Redis

  1. 缓存机制

说明:缓存中的数据其实是数据库数据的备份.缓存机制其实就是有效的降低了用户访问真实物理设备的访问频次.
前提:缓存一般保存到内存中
问题:
1.缓存的内存空间如何维护?
2.如何保证数据一致性?
3.缓存中的数据如何保证不丢失?
4.如何实现缓存高可用

  1. Redis介绍

网址: https://redis.io/
Redis 是一个开源(BSD许可)的,key-value存储的.内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
结果:读的速度是110000次/s,写的速度是81000次/s

  1. Redis分片介绍

说明:如果单台redis出现宕机的现象.会影响整个服务.单台的redis内存受限.
解决方法:实现redis的分片.
优点:
1.可以实现redis的内存动态扩容
2.Redis的保存的数据,分别保存到多台redis中,如果其中有一台redis出现问题,那么其中的数据只损失1/n的数据.

  1. redis的数据同步,主从模式下
哈希一致性算法

说明:redis分片时采用哈希一致性算法,实现数据动态的绑定.
术语:
1.节点(node) 代表真实的redis服务器
2.key 用户保存/读取关键字
在这里插入图片描述

均衡性

问题:
由于node节点是经过hash一致性算法计算的结果.那么可能会出现计算的节点所分配的内存不均.如果内存不均,会导致某些节点内存负载过高.
特点说明:
要求全部的数据,尽可能的均匀分配到不同的节点中,每个节点中保存的数据尽可能接近1/n
实现步骤:
如果遇到节点负载不均时,会自动的启动虚拟节点,进行数据的平衡
在这里插入图片描述

单调性

说明:如果节点的个数增加,原有的节点的挂载会自动的发生变化.将满足条件的数据自动的挂载到新的节点中.
原则:尽可能保证原有的数据不变
总结:节点增加,数据动态发生迁移

一致性hash算法只是介绍了该算法的思想,取模是2^23取模。而真正的redis集群是根据hash曹来进行一致性hash算法的,他的取模是16384这个hashSlot哈希槽!!!

  1. Redis哨兵实现

比较

分片特点:端口不一样
优点:实现内存动态扩容
缺点:
1.如果分片的节点宕机,则数据丢失
2.如果分片的节点宕机,那么整个服务器都不能正常使用.

哨兵特点:两台redis
实现主从挂载

  1. Redis中持久化策略

说明:因为redis中保存的数据都在内存中,当断电/宕机.缓存中的数据都会被清空.如果redis中没有配置持久化策略,安全性不够完善.
策略说明:
1.RDB方式(定期)
该方式是redis默认选择的持久化策略
特点:持久化的效率更高,定期持久化可能会丢失数据
2.AOF方式(/s)
该方式需要通过配置文件手动开启
特点:持久化效率低,每秒持久化/每次操作持久化,保证数据尽可能不丢失
持久化步骤:
1.当用户set操作时,redis中的数据会新增/更新
2.这时根据用户选择的持久化的策略.自动的进行数据持久化操作.以下以RDB模式为例.
3.定期会将redis中全部的数据通过xxx.RDB文件的方式保存.
4.如果redis服务器宕机重启时,首先会加载持久化文件xxx.RDB.恢复内存中的数据.
5.当用户使用redis时,这时redis内存中已经恢复了数据,为用户继续提供服务.

  1. Redis中内存策略

因为redis中的数据全部都写入内存中.当redis中的数据不能再次写入时这时redis服务会有问题.所以应该保证redis服务永远可写.如何实现redis数据内存优化呢??

  1. 数据同步:
    在这里插入图片描述
    总结数据同步即为主master将数据同步到slave从节点内存、和持久化的过程。
    当slave连接上master时,会发送一个同步命令给master。master收到后,会将数据进行rdb储存,然后将其发送给slave节点。当slave接受到后会将其持久化,并加载到内存。此后,master会发生数据变化时,会将数据以aof文件的方式发送给slave节点,完成数据同步的过程。

参考:https://www.pianshen.com/article/47361854941/

1.定义redis中最大内存

在这里插入图片描述
在这里插入图片描述

2.LRU算法:

内存管理的一种页面置换算法,对于在内存中但又不用的数据块(内存块)叫做LRU,操作系统会根据哪些数据属于LRU而将其移出内存而腾出空间来加载另外的数据。

3.内存优化手段:

volatile-lru -> 将设定超时时间的数据并且其中使用较少的数据进行删除
allkeys-lru -> 将redis中全部key进行LRU筛选,之后进行删除
volatile-random -> 设定了超时间的数据,随机删除
allkeys-random -> 全部的key随机删除
volatile-ttl -> 将已经设定了超时时间的数据,按照存活时间排序,将马上要过期的数据进行删除.
noeviction -> 不做任何操作,将报错信息返回给用户.

在这里插入图片描述

4.修改优化策略

在这里插入图片描述

  1. Redis集群搭建

比较:
分片和哨兵说明

优点:
1.分片可以实现内存的动态的扩容
2.使用分片能够将数据分开保存,如果宕机/数据损坏只丢失1/n的数据
3.哨兵可以实现redis的高可用.
缺点:
1.如果分片中的一个节点宕机,那么整个分片将不能正常运行.
2.分片中的数据因为hash一致性的原因.可能会导致数据分布不是特别的平均.
3.如果哨兵宕机,则整个服务陷入瘫痪.

说明:
redis集群实质上将redis分片和redis哨兵的机制进行整合.redis集群中每个节点多可以与其他节点进行通讯.同时集群内部有心跳检测.如果节点发生宕机的现象.由所在集群的全部服务器负责推选.保证服务的正常运行.如果全部的从节点宕机,并且这时主节点宕机那么整个集群才会奔溃.

比如有9台redis,其中有三个master是分片存储数据,每一个master下有两个slave节点做为备用。每一个slave下存储的数据都是和自己的master上的数据保持一致的!

8.redis缓存击穿、穿透、雪崩

穿透:(布隆过滤)
什么是缓存穿透?怎么解决?
访问一个不存在的key,缓存不起作用,请求会穿透到DB,流量大时DB【也不存在值】会挂掉。
解决方案:
(1)采用布隆过滤器,使用一个足够大的bitmap,用于存储可能访问的key,不存在的key直接被过滤;

布隆过滤器说明:是由n个hash函数和n个大小的二进制数组组成。原理:指由n个hash函数映射值在二进制数组上标记为1。也就是当数据量大的时候,会导致误判断的情况。怎么解决这个问题:使用白名单将肯能误判断的值记录下来。

(2)访问key未在DB查询到值,也将空值写进缓存,但可以设置较短过期时间。

雪崩:(集群)
指:很多的key在同一时间失效了,导致DB访问激增

击穿:(互斥锁)
key对应的数据存在,但在redis中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。
当不存在时,暂时先别访问数据库,而是设置一个key(读的时候让其他的读的线程等待一定时间).然后再访问。或者设置热点数据
https://www.cnblogs.com/xichji/p/11286443.html

  1. 面试问题总结

redis中能存储哪些数据类型?
字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets)
redis中的数据持久化策略?
rdb,将用户操作记录在二进制文件中,如果瘫痪或者停电了,将从文件中读取,这是redis的默认持久化策略。
Redis计数器:是能够解决并发请求的,让其串行去执行,

string

set key  value

get key

list的操作

lpush  list value1 value2 value3

lRange list 0,2 

hash的操作<key,Map>

hset key field value

hset shop1 productId1 value

hset shop1 productId2 value

hgetall key 获取所有的信息。 

布式锁的说明:使用官方推荐的Redisson来实现分布式锁,也具有续约的功能,原理是后台启动线程监控它的运行情况。实际上是采用的lua脚本来执行的。代码非常简单。

问题一:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
加上UUID后,会发现,只有当前线程可以删除这个数据。但是仍然还会出现问题,当进入到if条件后,突然stopword了,然后数据过期了,其他线程执行代码,这时候又把别人的id锁删除了。

所以:只有自己获取锁和解锁!!!!!!!!

最后使用redisson,有watchDog来监听,续约的过程。

redis的多路复用模型:

参考:
https://zhuanlan.zhihu.com/p/160157573
https://www.cnblogs.com/three-fighter/p/14705965.html

在这里插入图片描述
连接、命令、应答都转为事件处理!!!!
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值