Redis(相关概念版)

目录

一、Redis

二、事务

三、Redis持久化

1、RDB

2、AOF

四、Redis删除策略

1、数据删除策略

(1)定时删除

(2)惰性删除

(3)定期删除

2、逐出算法中的删除策略

五、企业级解决方案


一、Redis


Redis是一种基于内存的数据库,对数据的读写操作都是在内存中完成,因此读写速度非常快,常用于缓存、消息队列、分布式锁等场景。

Redis提供了多种数据类型来支持不同的业务场景,比如String (字符串)、Hash (哈希)、List (列表)、Set(集合)、Zset(有序集合)、Bitmaps (位图)、HyperLogLog (基数统计)、GEO (地理信息)、Stream (流), 并且对数据类型的操作都是原子性的,因为执行命令由单线程负责的,不存在并发竞争的问题。

除此之外,Redis 还支持事务、持久化、Lua 脚本、多种集群方案(主从复制模式、哨兵模式、切片机群模式)、 发布/订阅模式,内存淘汰机制、过期删除机制等等。

二、事务

Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。Redis事务的主要作用就是串联多个命令防止别的命令插队。

特点:

(1)Redis事务没有没有隔离级别的概念;

(2)所有的命令在事务中,并没有直接被执行,只有发起执行命令(Exec)的时候才会执行;

(3)Redis单条命令是保证原子性的,但事务不保证原子性。

常用命令:

(1)multi:标记一个事务的开始;

(2)exec:执行所有事务块内的命令;

(3)discard:取消事务,放弃执行事务块内的所有命令。 

悲观锁:

悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每 次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。


乐观锁:

乐观锁(Optimistic Lock)顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。Redis就是利用这种check-and-set机制实现事务的。 

三、Redis持久化

Redis 是内存数据库,如果不将内存中的数据库状态保存到磁盘,那么一旦服务器进程退出,服务器中的数据库状态也会消失。所以 Redis 提供了持久化功能!

Redis提供了两种实现持久化的方式:

(1)RDB:将当前数据状态进行保存,快照形式,存储数据结果,存储格式简单,关注点在数据

(2)AOF:将数据的操作过程进行保存,日志形式,存储操作过程,关注点在数据的操作过程

1、RDB

(1)概念:在指定的时间间隔内将内存中的数据集快照写入磁盘。

(2)优点:RDB是一个紧凑压缩的二进制文件,存储效率较高;RDB内部存储的是redis在某个时间点的数据快照,非常适合用于数据备份,全量复制等场景;RDB恢复数据的速度要比AOF快很;RDB节省磁盘空间。

(3)缺点:fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑;虽然Redis在fork时使用了写时拷贝技术,但是如果数据庞大时还是比较消耗性能 、RDB方式无论是执行指令还是利用配置,无法做到实时持久化,具有较大的可能性丢失数据;Redis的众多版本中未进行RDB文件格式的版本统一,有可能出现各版本服务之间数据格式无法兼容现象。

2、AOF

(1)概念:以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中命令达到恢复数据的目的;与RDB相比可以简单描述为改记录数据为记录数据产生的过程AOF的主要作用是解决了数据持久化的实时性,目前已经是Redis持久化的主流方式。

(2)AOF写数据三种策略:
always(每次):每次写入操作均同步到AOF文件中,数据零误差,性能较低;

everysec(每秒):每秒将缓冲区中的指令同步到AOF文件中,数据准确性较高,性能较高在系统突然宕机的情况下丢失1秒内的数据;

no(系统控制):由操作系统控制每次同步到AOF文件的周期,整体过程不可控。

四、Redis删除策略

1、数据删除策略
(1)定时删除

创建一个定时器,当key设置有过期时间,且过期时间到达时,由定时器任务立即执行对键的删除 操作。

优点:节约内存,到时就删除,快速释放掉不必要的内存占用;

缺点:CPU压力很大,无论CPU此时负载量多高,均占用CPU,会影响redis服务器响应时间和指 令吞吐量。

总结:用处理器性能换取存储空间(拿时间换空间)。

(2)惰性删除

数据到达过期时间,不做处理。等下次访问该数据时,如果未过期,返回数据,如果已过期,删除,返回不存在。

优点:节约CPU性能,发现必须删除的时候才删除;

缺点:内存压力很大,出现长期占用内存的数据。

总结:用存储空间换取处理器性能(拿空间换时间)。

(3)定期删除

周期性轮询redis库中的时效性数据,采用随机抽取的策略,利用过期数据占比的方式控制删除频度。

优点1:CPU性能占用设置有峰值,检测频度可自定义设置;

优点2:内存压力不是很大,长期占用内存的冷数据会被持续清理。

总结:周期性抽查存储空间 (随机抽查,重点抽查)。

2、逐出算法中的删除策略

maxmemory-policy删除策略:

① volatile-lru:挑选最近最少使用的数据淘汰;

② volatile-lfu:挑选最近使用次数最少的数据淘汰;

③ volatile-ttl:挑选将要过期的数据淘汰;

④ volatile-random:任意选择数据淘汰。

五、企业级解决方案

1、缓存预热:“宕机”服务器启动后迅速宕机。

解决方案:

(1)日常例行统计数据访问记录,统计访问频度较高的热点数据;

(2)将统计结果中的数据分类,根据级别,redis优先加载级别较高的热点数据。

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

解决方案:

(1)给不同的Key的TTL添加随机值;

(2)利用Redis集群提高服务的可用性;

(3)给缓存业务添加降级限流策略;

(4)给业务添加多级缓存。

3、缓存击穿:缓存击穿问题也叫热点Key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了,无 数的请求访问会在瞬间给数据库带来巨大的冲击。

常见的解决方案有两种:

(1)互斥锁;

(2)逻辑过期。

4、缓存穿透:缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。

常见的解决方案有两种:

(1)缓存空对象

优点:实现简单,维护方便;

缺点: 额外的内存消耗,可能造成短期的不一致。

(2)布隆过滤

优点:内存占用较少,没有多余key;

缺点:实现复杂,存在误判可能。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值