目录
一、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;
缺点:实现复杂,存在误判可能。