缓存Redis
2021-11-24 16:52:41 17 举报
AI智能生成
redis
作者其他创作
大纲/内容
数据结构
字符类型
k-V存储
hash类型
存储 对象
list列表类型
存储有序列表,可以用它做简单的消息队列
或者是微博大V的那种粉丝列表
或者是微博大V的那种粉丝列表
无序集合
去重
有序集合
有序集合
缓存
与memcached的区别
redis支持服务器端的操作:相比于memcached而言,有更多的数据结构和支持更丰富的数据操作。
在memcached,通常需要把数据拿到客户端进行类似的修改再set回去,增加了网络io的次数和数据体积。
内存使用高效率:单纯的k-v是memcached高,但是采取hash结构的话,内存利用率是redis高
性能对比:由于redis只使用单核,memcached可以使用多核,所以平均每个核上redis存储小数据比memcached高,但是100k以上的数据,memcached性能高于redis
集群模式:memcached没有原生的集群模式,需要依靠客户端来实现往集群分片中写入数据,但是redis目前是原生支持cluster模式。
在memcached,通常需要把数据拿到客户端进行类似的修改再set回去,增加了网络io的次数和数据体积。
内存使用高效率:单纯的k-v是memcached高,但是采取hash结构的话,内存利用率是redis高
性能对比:由于redis只使用单核,memcached可以使用多核,所以平均每个核上redis存储小数据比memcached高,但是100k以上的数据,memcached性能高于redis
集群模式:memcached没有原生的集群模式,需要依靠客户端来实现往集群分片中写入数据,但是redis目前是原生支持cluster模式。
线程模型
redis是基于reactor模式开发了网络事件处理器,也叫文件事件处理器。
这个文件事件处理器是单线程的,所以redis也被叫做单线程的模型。
原理是通过采取IO多路复用机制同时监听几个socket,根据socket的时间来选择对应的事件处理器。
socket有accept,read,write,close等事件
通过上面的形式实现了高性能的通信模型【想到啥了,没错就是NIO】
这个文件事件处理器是单线程的,所以redis也被叫做单线程的模型。
原理是通过采取IO多路复用机制同时监听几个socket,根据socket的时间来选择对应的事件处理器。
socket有accept,read,write,close等事件
通过上面的形式实现了高性能的通信模型【想到啥了,没错就是NIO】
为啥这么快
1)纯内存操作
2)核心的nio的io多路复用
3)单线程反而避免了多线程的频繁上下文切换
2)核心的nio的io多路复用
3)单线程反而避免了多线程的频繁上下文切换
常见问题
过期策略
定期删除
redis默认每隔100ms就随机抽取一些设置了过期时间的key,检查是否过期,过期则删除。
定期删除是随机抽取一部分并不是全部,所以可能会导致很多过期key到了时间没有被删除掉。
定期删除是随机抽取一部分并不是全部,所以可能会导致很多过期key到了时间没有被删除掉。
惰性删除
当你去get一个key的时候,redis会检查一下这个key是否过期了,如果
过期了,那么就删除,这就是惰性删除。
过期了,那么就删除,这就是惰性删除。
内存淘汰机制
noeviction
当内存不足以容纳新数据,新写入数据报错【这种一般没有人用】
allkeys-lru
当内存不足以容纳新的数据,移除最近最少使用的key【最常用】
allkeys-random
内存不足。随机溢出某个key
volatile-lru
当内存不足,在设置了过期时间的key中移除,最近最少使用的key
volatile-random
内存不足,在设置了过期时间的key中随机移除一个key
volatile-ttl
内存不足,在设置过期时间的key中,有更早过期时间的key被移除
LRU算法
基于linkedhashmap实现最简单的lru【核心是他的removeEldestEntry】
高并发
redis的高并发的实现:【本质就是读写分离】
首先先理解一个常识,单机的redis能够承载的qps是上万到几万不等,如果qps在10万+,那单机的redis肯定是会崩的。
所以处理处理高并发说白了就是分流,redis采取主从的模式,对于落到redis上的操作我们区分为读和写。正常情况下,读操作的数量都是大于写的,所以我们把所有的读操作落在slave上,所有的写操作落在master上,然后master把数据同步到所有的slave上。
首先先理解一个常识,单机的redis能够承载的qps是上万到几万不等,如果qps在10万+,那单机的redis肯定是会崩的。
所以处理处理高并发说白了就是分流,redis采取主从的模式,对于落到redis上的操作我们区分为读和写。正常情况下,读操作的数量都是大于写的,所以我们把所有的读操作落在slave上,所有的写操作落在master上,然后master把数据同步到所有的slave上。
redis主从复制的原理
开始full resynchronization的时候,master会启动一个后台线程,开始生成一份RDB快照文件,同时还会将从客户端收到的所有写命令缓存在内存中。RDB文件生成完毕之后,master会将这个RDB发送给slave,slave会先写入本地磁盘,然后再从本地磁盘加载到内存中。然后master会将内存中缓存的写命令发送给slave,slave也会同步这些数据。
持久化机制
RDB
AOF
数据一致性怎么保证
先删缓存,在更新数据库,可能会脏读
先更新,成功之后删除缓存
更新缓存,然后通过异步调度来批量更新数据库,性能好但是无法保证强一致性
缓存雪崩
缓存雪崩是指在我们设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。
原有的过期时间加一个随机值,这样重复率就少了
原有的过期时间加一个随机值,这样重复率就少了
缓存穿透
缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。
解决方案:布隆过滤器或者对空进行缓存,过期时间设置5分钟
解决方案:布隆过滤器或者对空进行缓存,过期时间设置5分钟
缓存击穿
对于一些设置了过期时间的key,如果这些key可能会在某些时间点被超高并发地访问,是一种非常“热点”的数据。这个时候,需要考虑一个问题:缓存被“击穿”的问题,这个和缓存雪崩的区别在于这里针对某一key缓存,前者则是很多key。
缓存在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。
1)采取限流组件,然后异步的吧一些即将过期的热点数据再重新构建
缓存在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。
1)采取限流组件,然后异步的吧一些即将过期的热点数据再重新构建
0 条评论
下一页