一、认识Redis

什么是Redis?它主要用来什么的?

Redis,英文全称是Remote Dictionary Server(远程字典服务),是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

与MySQL数据库不同的是,Redis的数据是存在内存中的。它的读写速度非常快,每秒可以处理超过10万次读写操作。因此redis被广泛应用于缓存,另外,Redis也经常用来做分布式锁。除此之外,Redis支持事务、持久化、LUA 脚本、LRU 驱动事件、多种集群方案。

Redis的基本数据结构类型

大多数小伙伴都知道,Redis有以下这五种基本类型:
String(字符串)
Hash(哈希)
List(列表)
Set(集合)
zset(有序集合)

它还有三种特殊的数据结构类型:
Geospatial
Hyperloglog
Bitmap

Redis 的五种基本数据类型

在这里插入图片描述
String(字符串)
简介:String是Redis最基础的数据结构类型,它是二进制安全的,可以存储图片或者序列化的对象,值最大存储为512M
应用场景:共享session、分布式锁,计数器、限流。

Hash(哈希)
简介:在Redis中,哈希类型是指v(值)本身又是一个键值对(k-v)结构
应用场景:缓存用户信息等。

字符串和哈希类型对比如下图:
在这里插入图片描述
List(列表)
简介:列表(list)类型是用来存储多个有序的字符串,一个列表最多可以存储2^32-1个元素。
应用场景:消息队列,文章列表,

Set(集合)
在这里插入图片描述
简介:集合(set)类型也是用来保存多个的字符串元素,但是不允许重复元素
应用场景:用户标签,生成随机数抽奖、社交需求。

有序集合(zset)
简介:已排序的字符串集合,同时元素不能重复
应用场景:排行榜,社交需求(如用户点赞)。

缓存穿透、缓存击穿、缓存雪崩

缓存雪崩:Redis中的缓存数据是有过期时间的,当在同一时间大量的缓存同时失效时,由于大量请求无法在redis缓存中处理,就会发送到数据库,导致数据库压力激增,可能会导致数据库崩溃,从而导致整个系统崩溃。
解决缓存雪崩的关键:避免Redis的缓存在短时间内大量的过期
解决方案:
①根据业务需要来合理的设置过期的时间
②使用redis分布式锁:让一时间只有一个相同请求落到MySql上,反正都是查询同一个信息,之后的其他请求就可以去Redis中找了。
在这里插入图片描述
③使用锁或队列:用加锁或者队列的方式来保证不会有大量的线程对数据库一次性进行读写,从而避免失效时大量的并发请求落到底层存储系统上,该方法不适用高并发情况。

缓存穿透:在Redis缓存和数据库中都找不到相关的数据。也就是说这是个非法的查询,假设客户端发出了大量非法的查询 比如id是负的 ,每次这个查询都需要去Redis和数据库中查询,可能会导致数据库崩溃
解决缓存穿透的要点,不让非法数据到数据库中查询
解决方案:
①过滤非法查询:在后台服务中过滤非法查询,直接不让他落到Redis服务上。比如id<=0就直接断言。
②缓存空对象:如果他的查询数据是合法的,但是确实Redis和MySql中都没有,那么我们就在Redis中储存一个空对象,这样下次客户端继续查询的时候就能在Redis中返回了。但是,如果客户端一直发送这种恶意查询,就会导致Redis中有很多这种空对象,浪费很多空间
③采用布隆过滤器:它实际上是一个很长的二进制向量 (位图) 和一系列随机映射函数(哈希函数)。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难

缓存击穿:缓存击穿和缓存雪崩类似,也是因为Redis中key过期导致的。只不过缓存击穿是某一个热点的key过期导致的。当有一个热点数据突然过期时,就会导致突然有大量的请求直接落到数据库上,导致数据库崩溃。
解决缓存击穿的要点,不让热点key突然过期
解决方案:
①预先设置热门数据:在 redis 高峰访问之前,把一些热门数据提前存入到 redis 里面,加大这些热门数据 key 的时长。
②实时调整:现场监控哪些数据热门,实时调整 key 的过期时长。
③使用redis分布式锁:让一时间只有一个相同请求落到MySql上,反正都是查询同一个信息,之后的其他请求就可以去Redis中找了。

Redis 过期策略和内存淘汰策略

Redis的过期策略

1.定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即对key进行清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。

2.惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。

3.定期过期:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。
expires字典会保存所有设置了过期时间的key的过期时间数据,其中,key是指向键空间中的某个键的指针,value是该键的毫秒精度的UNIX时间戳表示的过期时间。键空间是指该Redis集群中保存的所有键。

Redis中同时使用了惰性过期和定期过期两种过期策略。
假设Redis当前存放30万个key,并且都设置了过期时间,如果你每隔100ms就去检查这全部的key,CPU负载会特别高,最后可能会挂掉。
因此,redis采取的是定期过期,每隔100ms就随机抽取一定数量的key来检查和删除的。
但是呢,最后可能会有很多已经过期的key没被删除。这时候,redis采用惰性删除。在你获取某个key的时候,redis会检查一下,这个key如果设置了过期时间并且已经过期了,此时就会删除。

Redis 内存淘汰策略

1.针对设置了过期时间的key做处理:
volatile-ttl:在设置了过期时间的key中,根据过期时间进行淘汰,越早过期的优先被淘汰。
volatile-random:从设置了过期时间的key中,随机淘汰数据。
volatile-lru:从设置了过期时间的key中使用LRU(最近最少使用)算法进行淘汰。
volatile-lfu:4.0版本新增,在过期的key中,使用LFU算法进行删除key。

2.针对所有的key做处理:
allkeys-random:从所有key中随机淘汰数据。
allkeys-lru:从所有key中使用LRU(最近最少使用)算法进行淘汰。
allkeys-lfu:4.0版本新增,从所有key中使用LFU算法进行淘汰;

3.不处理:
noeviction:默认策略,新写入操作会报错。

LRULeast Recently Used)算法,顾名思义:最近最少使用,淘汰很久没被访问的数据,以最近一次访问时间作为参考。
LFULeast Frequently Used)算法,顾名思义:最不经常使用,淘汰最近一段时间被访问次数最少的数据,以次数作为参考。

绝大多数情况我们都可以用LRU策略,当存在大量的热点缓存数据是,LFU可能更好点。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值