Redis的原理(一)

简介: Redis的原理(一)

一、Redis简介

REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

二、redis有什么缺点

(一)缓存和数据库双写一致性问题:

比如在操作的过程中,向数据库和缓存中都插入,这时有可能导致数据不一致的问题,有可能缓存里面 有了,但是数据库中还没有。这里可以用弱一致性处理,可以做预热处理,也就是先把数据库的数据预热到缓存里去。

(二)缓存雪崩问题:

这里 的缓存雪崩和雪崩效应不一样,雪崩效应:如下图:可能服务与服务之间出现网络失联,或者网络抖动,由于服务一直连源不断的有请求过来。但是没有去直接给个返回已经失联了,然后其中一个服务会请求挤压,最终导致另一个服务的效率越来越低。

缓存雪崩:缓存中的key出现大面积的失效。而导致所有的请求去请求数据库做处理,从而导致数据库宕机。

解决方案:

a、给缓存的失效时间,加上一个随机值,避免集体失效,这样就不会导致大面积的失效。

随机数作为失效时间。

b、使用互斥锁,但是该方案吞吐量明显下降了。

c、双缓存:二级缓存。我们有两个缓存,缓存A和缓存B。缓存A的失效时间为20分钟,缓存B不设失效时间。自己做缓存预热操作。然后细分以下几个小点

I 从缓存A读数据,有则直接返回

II A没有数据,直接从B读数据,直接返回,并且异步启动一个更新线程。然后把从B中读的数据更新到A中去。

III 更新线程同时更新缓存A和缓存B。

(三)缓存击穿问题:

①、是有黑客惯用的手段,比如现在发送一个请求,比如请求到nginx服务器,然后反向代理到web服务器,在缓存中专门制造不存在的数据进行请求,不会在缓存中去找了,然后请求到数据库db,比如10万个请求直接,到DB,这时数据库就崩溃,称之为缓存击穿。

②、在缓存中存的少量数据的缓存时间失效了,就是key所对应的时间已经过期了。过期之后请求在缓存中找不到数据了,然后请求到数据库db,比如10万个请求直接到DB,这时数据库就崩溃,称之为缓存击穿。

解决办法:

a、利用互斥锁,缓存失效的时候,先去获得锁,得到锁了,再去请求数据库。没得到锁,则休眠一段时间重试

b、采用异步更新策略,无论key是否取到值,都直接返回。value值中维护一个缓存失效时间,缓存如果过期,异步起一个线程去读数据库,更新缓存。需要做缓存预热(项目启动前,先加载缓存)操作。

c、提供一个能迅速判断请求是否有效的拦截机制,比如,利用布隆过滤器,内部维护一系列合法有效的key。迅速判断出,请求所携带的Key是否合法有效。如果不合法,则直接返回。就是白名单和黑名单的方式来做,不常见的ip地址纳入到黑名单里面去,现在谷歌工具集中已经有布隆过滤器了,由32位的位变量,矢量的方式来做的。这个布隆过滤器在大数据里面用的也很多。

(四)缓存的并发:竞争问题

相关文章
|
10小时前
|
缓存 NoSQL Linux
redis的原理(三)
redis的原理(三)
redis的原理(三)
|
1月前
|
缓存 NoSQL Redis
说说你对redis的理解2
说说你对redis的理解2
32 6
|
3月前
|
缓存 NoSQL 关系型数据库
记一次redis使用问题
记一次redis使用问题
21 0
|
4月前
|
存储 NoSQL 关系型数据库
Redis基础1
Redis基础
30 0
|
4月前
|
存储 NoSQL Java
Redis基础2
Redis基础
26 0
|
NoSQL Redis
|
存储 缓存 NoSQL
|
存储 消息中间件 NoSQL
什么是Redis?
redis是一个高性能的key-value数据库。
70 0
|
NoSQL Java Redis
Redis4
Redis4
40 0
|
存储 消息中间件 缓存
了解redis
了解redis
67 0