Redis知识点

一.什么是Redis

Redis是一个使用c语言,基于内存的且持久化的key-value数据库

Redis有以下特点:

1.性能高,Redis读数据速度能达到110000次/s,写数据速度是 81000 次/s ;而MySQL的读数据速度为5k/s,写数据速度为3k/s。
2.数据结构丰富,Redis支持string,list,zset,hash等数据结构的储存
3.原子性,Redis的所有操作是支持原子性的.
4.持久化存储,Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重载的时候再次加载进行使用

redis的五种数据结构原理分析_redis的数据结构_至臻于勤-大道至简的博客-CSDN博客

二.缓存穿透,缓存击穿,缓存雪崩

1.缓存穿透

查询一条不存在的数据,mysql查询不到数据也不会写入缓存,而是每次请求都查数据库

解决方法:

一.缓存空数据,查询返回的数据为空,仍然把这个空结果进行缓存(缺点:消耗内存,可能发生不一致的问题)
二.布隆过滤器(相当是一个位为单位的数组,数组中每个单元只能存储二进制0或1,有误判)

2.缓存击穿

给某一个key设置了过期时间,当key过期的时候,恰好这个时间点对这个key有大量的并发请求过来,这些并发的请求可能或瞬间把数据库压垮。

解决方法:

互斥锁:首先查询缓存未命中然后获取互斥锁查询数据库重建缓存数据,写入缓存,释放锁,其他线程来的时候可能没有缓存数据成功那么就休眠重试,然后当有的时候就好了(强一致,性能差)
逻辑过期:(高可用,性能优)

3.缓存雪崩

是指同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量的请求到达数据库带来巨大压力

解决方法:

给不同的key的TTL添加随机值
利用Redis集群提高服务的可用性(哨兵模式,集群模式)
给缓存业务添加降级限流策略 (nginx或spring cloud gateway)
给业务添加多级缓存 (Guava或Caffeine)

三.特性

缓存-双写一致性

先删除缓存和后删除缓存都会发生错误

解决方法:

 读锁

 写锁

redis做为缓存,mysql的数据如何与redis进行同步呢?

 介绍异步的方案实现同步(介绍redisson读写锁的这种方案)

1.允许延时一致的业务,采用异步通知
2.使用MQ中间件,更新数据之后,通知缓存删除
3.利用canc中间件,不需要修改业务代码,伪装为mysql的一个从节点https://blog.csdn.net/weixin_45648789/article/details/129254988

1.强一致性的,采用Redisson提供的读写锁
2.共享锁:读锁readLock,加锁之后,其他线程可以共享读操作
3.排他锁:独占锁writeLock也叫,加锁之后,阻塞其他线程读写操作

Redis持久化存储

redis是内存数据库,一旦重启后所有数据都会丢失,因此,需要将redis中的数据做持久存储到磁盘,redis的持久化分两种

RDB

按照一定的时间周期执行快照,将内存中的数据保存到硬盘中,RDB是redis默认的持久化方式

RDB的优点:
1.适合冷备份,RDB是按时间周期存储,可以快速恢复之前某个时间段的数据。
2.性能最大化,在同步数据的时候fork一个子进程去持久化,主进程继续处理命令。
3.RDB数据恢复时的速度比AOF更高.
缺点:
1.数据安全性低,RDB是间隔一段时间做持久化,如果这段时间发生故障,会发现数据丢失。
2.RDB在生成数据快照时,若文件很大,客户端会暂停几毫秒甚至几秒,此时正在进行秒杀操作,性能会受到影响。

AOF

将redis执行的每次写命令记录到单独的日志文件中,当redis重启时会从持久化的日志文件中恢复数据。

AOF的优点:
1.数据安全性高,AOF每进行一次命令操作就会异步将数据记录到AOF中一次,若数据丢失,也只会丢失这一次的数据。
2.rewrite模式。如用flushall命令误操作清空了所有数据,在后台没开始重写AOF文件之前,可以拷贝AOF日志文件,并删除其中的flushall命令。
缺点:
1.同样的数据,AOF文件比RDB文件更大,恢复速度更慢

RDB与AOF混合持久化

若单独使用RDB,可能会丢失很多数据;若单独使用AOF,数据恢复没有RDB快。因此,Redis4.0之后提供了混合持久化方式,也就是:采用RDB快照以一定频率执行保存数据,而在两次快照之间,使用AOF日志记录这期间的所有命令操作。

两种持久化存储方式如何选择?

1.如果你的业务场景需要很高的性能,或者宕机之后能够尽快的恢复,而对数据完整性的要求不是那么高,那么可以采用RDB持久化的方式。
2.如果你的业务场景对数据完整性的要求很高,那么可以采用AOF持久化方式,而至于采用哪种回写策略,则取决于你对数据完整性的要求程度。
3.如果你的业务场景既要兼顾性能,又注重数据完整性,那么可以采用混合持久化的方式。
4.如果你对数据丢失无所谓,追求性能最大化的情况下,甚至可以禁用持久化。

过期key的删除策略

Redis(惰性删除和定期删除)是key-value型数据库,可以设置key的过期时间。在Redis中的过期策略有以下三种:

1.定时删除:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。
优点:保证内存被尽快释放;
缺点:若过期key很多,会需要占用大量CPU资源去处理过期数据,从而影响读取缓存的响应时间。
2.惰性删除:只有当访问这个key的时候,才会判断key是否过期,过期就删除。
缺点:若出现大量过期的key没有被访问,会占用大量内存;
3.定期删除:每隔一段时间,扫描一定数量设置了过期时间的key,并清除其中过期的key。
定期删除的性能介于定时删除和惰性删除之间。在内存占用方面,定期删除不如定时删除好;在CPU占用方面,定期删除不如惰性删除好。(为什么不全部扫描一遍,东西太多会占用大量内存)

内存淘汰策略

redis内存数据集大小上升到一定大小的时候,导致用于缓存的内存不足,就会施行数据淘汰策略。惰性删除+定期删除可能会残留大量的过期key,从而导致内存数据太大。

全局的键空间选择性移除

noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。
allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。(这个是最常用的)
allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。

设置过期时间的键空间选择性移除

volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。
volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。

RedisSon原理

RedisSon原理_周周哦的博客-CSDN博客

红锁

Redis中Redisson红锁(Redlock)使用原理_Redis_脚本之家

主从复制,主从同步(集群方案)

主从同步

Redis 主从同步_redis主从同步_尖笔尖的博客-CSDN博客

哨兵模式

redis哨兵模式_promising.的博客-CSDN博客

 

 redis集群脑裂

 分片集群

Redis搭建分片集群_redis分片集群_lovoo的博客-CSDN博客

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值