字节跳动Java金三银四解析:java什么培训机构靠谱

正文
在实际的工作项目中, 缓存成为高并发、高性能架构的关键组件 ,那么Redis为什么可以作为缓存使用呢?首先可以作为缓存的两个主要特征:
由于Redis 天然就具有这两个特征,Redis基于内存操作的,且其具有完善的数据淘汰机制,十分适合作为缓存组件 。
其中,基于内存操作,容量可以为32-96GB,且操作时间平均为100ns,操作效率高 。而且数据淘汰机制众多,在Redis 4.0 后就有8种了促使Redis作为缓存可以适用很多场景 。
那Redis缓存为什么需要数据淘汰机制呢?有哪8种数据淘汰机制呢?
数据淘汰机制
Redis缓存基于内存实现的,则其缓存其容量是有限的,当出现缓存被写满的情况,那么这时Redis该如何处理呢?
Redis对于缓存被写满的情况,Redis就需要缓存数据淘汰机制,通过一定淘汰规则将一些数据刷选出来删除,让缓存服务可再使用 。那么Redis使用哪些淘汰策略进行刷选删除数据?
在Redis 4.0 之后,Redis 缓存淘汰策略6+2种,包括分成三大类:
在设置过期时间的键值对中,
在所有的键值对中,
Note: LRU( 最近最少使用,LeastUsed)算法, LRU维护一个双向链表 ,链表的头和尾分别表示 MRU 端和 LRU 端,分别代表最近最常使用的数据和最近最不常用的数据 。
LRU 算法在实际实现时,需要用链表管理所有的缓存数据,这会带来额外的空间开销 。而且,当有数据被访问时,需要在链表上把该数据移动到 MRU 端,如果有大量数据被访问,就会带来很多链表移动操作,会很耗时,进而会降低 Redis 缓存性能 。
其中,LRU和LFU 基于Redis的对象结构的lru和属性实现的:
typedef struct redisObject {unsigned type:4;unsigned encoding:4;// 对象最后一次被访问的时间unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or* LFU data (least significant 8 bits frequency// 引用计数* and most significant 16 bits access time). */int refcount;void *ptr;} robj;
Redis的LRU会使用的lru记录最近一次被访问的时间,随机选取参数- 配置的数量作为候选集合,在其中选择 lru 属性值最小的数据淘汰出去 。
在实际项目中,那么该如何选择数据淘汰机制呢?

字节跳动Java金三银四解析:java什么培训机构靠谱

文章插图
在理解了Redis缓存淘汰机制后,来看看Redis作为缓存其有多少种模式呢?
Redis缓存模式
Redis缓存模式基于是否接收写请求,可以分成只读缓存和读写缓存:
只读缓存:只处理读操作,所有的更新操作都在数据库中,这样数据不会有丢失的风险 。
读写缓存,读写操作都在缓存中执行,出现宕机故障,会导致数据丢失 。缓存回写数据到数据库有分成两种同步和异步:
异步:有数据丢失风险,其侧重于提供低延迟访问
Cache Aside模式
查询数据先从缓存读取数据,如果缓存中不存在,则再到数据库中读取数据,获取到数据之后更新到缓存Cache中,但更新数据操作,会先去更新数据库种的数据,然后将缓存种的数据失效 。
而且Cache Aside模式会存在并发风险:执行读操作未命中缓存,然后查询数据库中取数据,数据已经查询到还没放入缓存,同时一个更新写操作让缓存失效,然后读操作再把查询到数据加载缓存,导致缓存的脏数据 。
Read/Write-模式
查询数据和更新数据都直接访问缓存服务,缓存服务同步方式地将数据更新到数据库 。出现脏数据的概率较低,但是就强依赖缓存,对缓存服务的稳定性有较大要求,但同步更新会导致其性能不好 。
【字节跳动Java金三银四解析:java什么培训机构靠谱】