Redis简介
Redis 是一个将数据放置在内存中的数据库,这一点和其他很多数据的数据库不同。因为这个不同,所以Redis 有这和其他数据不能比的读写优势。其读取数据能够达到10多万次每秒,写数据也能够在八九万次每秒。由于这个特性,把他用来作为热点数据的缓存使用成为了应对高并发的一大利器。
Redis数据结构:是一种典型的基于K-V(键值对)的数据结构来存储数据。其能够存储的数据类型: String,List,Hash,Set,Zset(有序Set,可以用来排名使用,主要是很好的利用的set中数据不能够重复的特 性)
补:Set数据不能过重复的特征的原因:这里简单说下,主要是(set这里是讲hashSet)因为其实用hashMap(K- V)中的K存储值,V默认为PENRENT。而因为重复的k都会覆盖。所有实现的Set的不能够重复的特性。
Redis持久化:redis 作为数据库,其还是要有数据的特征之一啥,能够持久化数据。而Redis 提供了两种持久化数据的方式:
一种Redis Data Base(RDB) ,其能够实现在把redis内存中的数据,在特定的时间(这个方式持久化数据不是 实 时保存 在磁盘)保存在一个叫dump.rdb的文件中,因此,这种方式持久化redis的数据,能够减小redis的 压力,但是不 能 够保证本地磁盘数据的失效性,在redis出现故障之后,可能会出现数据丢失的情况。
一种是aof(append on file) ,这种模式的保存数据的就是在redis执行每一 个数据操作的时候,都会向磁盘 写数据。其生成的文件是多个的。其会增减redis的压力,但是能够保证数据的完
Redis的过期策略/删除机制:redis 作为内存数据,其实是在高并发的情况下,是很容易出现内存溢出的情况的,为了避免内存溢 出的情况,redis采取两种方式来保证内存的不出问题。
一种就是就是过期策略,其分为定时过期:是指 在每一个redis数据在存储的时候,都设置了一个失 效时间,当到了失效时间的时候,这个数据就会失效,但是这样做,会在一定程度上增减redis的压 力,影响其数据读写;
定期过期:就是指redis在固定的 时间去查找exprise的字典,把其中部分失效的 数据删除,这样可 以 在 一定缓解redis执行的效率问题。
惰性过期:是指在redis操作数据的时候,在查看该数据是否过期。而通常我们就采用定期+惰性的策 略
虽然过期策略会在一定程度上避免内存溢出的情况,但是这种策略是不能够完全避免内存溢出情况
出现的,所以为了在redis的内存用完的时候,避免redis内存溢出导致问题。redis还提供了一种方式
来处理问题
删除机制:其实redis的数据删除机制就分为两个大类。一个是在设定了失效时间的数据中进行:随 机、使用最少、全部删除。一个是就在redis的数据中:随机,使用最少,不删除。而为了是redis 中的 热点性保持较好,两种方式相结合,并且都选中使用最少的数据进行删除。
前面,我们提到了,redis一般作为数据缓存来使用,这样可以让许多热点的查询操作直接使用缓存中的数据,这是是能够避免大量的对本地数据库的操作,从而避免数据库因连接操作过多。从而出现效率降低或者宕机的情况。但是随之出现了,我们如何保证redis缓存中的数据与本地数据库的数据的一致性问题。而且作为缓存,我们还要面对缓存击穿,穿透,雪崩的问题。
缓存与本地数据库一致的问题:为甚出不一致呀,其实就程序对本地库数据进行了改,删的操作之后,没有及时的对缓存中的数据进行处理,导致的数据不一致。
具体流程如下:其中,是否异步设置缓存的数据,看具体情况。删除缓存中的数据,在进行更新,删除的本地操作的时候,一定要执行。
击穿:其实就是数据库在查询数据的时候,在缓存中没有查询到,需要到本地数据库中查询。其实这个问题,我们如果数据库的
的查询情况十分多的话,在数据进行更新、新增的时候,就必须要把数据设置进redis,这样可以一定程度上避免击穿事件 概率的出现。而且对于那些经常查询的,但是数据更新不平凡的数据,可以设置为不失效,只是在相关数据进行本地增,
删,改的时候,在更新缓存中的数据。这样也能够减少击穿事件的发生。但是不能够完全避免。毕竟redis中缓存的数据 大多数只 是本地数据库的部分数据。
穿透:穿透其实就是数据在缓存中和数据库中都没有查询到相关的数据。针对这种情况。其实是有一个经典的处理方式:布隆过 滤器。其主要是用来判断一个值是否存在。适合用在黑名单,uri去重的场景中等场景中。其核心思想是将一个对象经过 hash值的计算所得出的值。在其映射的向量值的地方该为1 。其就表明这点地方有值。而布隆过滤器就是一个装满了二进 制的数组。而且,因为hash计算的时候有hash冲撞的可能。这也就导致了布隆过滤器有一定的误判率。而我们只有通过 增加hash的计算方式来尽量减少误判率。但是计算方式的增加。有会加大内存,降低效率。所以要根据场景要求的误判率
以及数据的数量。通过公式来计算得出合适的hash计算方式的条数。如图中:每个对象在布隆过滤器中都要经历过三次 hash计算。而x通过三次之后,存储中布隆中了。而y发现第一,第二,都和x的第一,第二的hash相同(极端考虑哈)。
如果第三次相同,其实在布隆里面就会认为x,y 其实是一个对象。但是现实不是的,这就是因为hash冲撞导致的布隆误判
的发生。
所以通过布隆,我们可以对不合法的请求进行过滤。避免非法的请求导致的缓存穿透的情况发生。
Redis 集群模式: 哨兵模式、主从模式 ,Redis 的订阅/发表功能,Redis 分布式锁等。之后会补上的。