缓存中间件面试(redis、memcached、mongodb)

前言

Github:https://github.com/yihonglei/nosql-middle

一 项目中缓存如何使用的,为什么要使用缓存,可能会出现哪些不良问题?

1、项目中如何使用缓存?

项目中如何使用的,需要结合你实际项目的应用场景阐述下,实际项目中如果有用缓存的地方,可以多关注下怎么用的,

用来做啥了,主要解决什么问题,有没有什么问题。

2、为什么要使用缓存?

为什么要用缓存,用哪种缓存中间件,这个应该也是我们在使用前要思考的,而不是追风。使用缓存一般解决两个问题,

高性能和高并发。

高性能

比如app某个页面的数据不怎么变,但是闲着无事老是有人刷页面玩,每次都查库可能要500ms,用户刷两回就放弃了,

实在是太慢了。这个时候,可以根据业务情况,这些数据加到缓存,2ms就查询出来,性能提高了250倍。

高并发

mysql关系型数据库单机QPS到2000就很难承受,系统在赶上高峰期的时候,如果瞬间过来一万流量,哪你的数据库可能就

各种超时了。对于这些流量,可以先放到缓存,从缓存逐步处理,缓存是走内存的,内存天然就支撑高并发。

3、缓存存在哪些不良问题?

缓存与数据库不一致问题:

用缓存一般都会出现数据不一致问题,比较经典的解决方案就是读的时候,先读缓存,缓存没有的话,就读数据库,

然后取出数据后放入缓存,同时返回响应。更新的时候,先更新数据库,然后再删除缓存。

缓存雪崩,缓存穿透,缓存击穿问题:

缓存雪崩,比如A系统高峰期的时候QPS达到5000,如果缓存挂掉了,所有请求访问都打到了MySql,MySql扛不住就挂掉了。

如果用的Redis,有以下预防方案:

事前:保证redis的高可用,主从+哨兵,redis cluster,避免全盘崩溃。
事中:本地 ehcache 缓存 + hystrix 限流&降级,避免 MySQL 被打死。
事后:redis 持久化,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。

缓存穿透,如果别黑客攻击,大量请求调用系统,都是缓存没有的key,请求都会打到数据库,

可以在没有从数据库查到的情况下,给key设置一个默认值以及适当的超时时间,避免用同样的key一直访问,

一直访问数据库。

缓存击穿,缓存击穿一般是系统设置key放了一定过期时间,如果都赶上所有key同时过期了,所有请求都会打到数据库。

一般预防方案需要根据业务情况而定:

如果数据几乎不变动,可以设置为永久数据;

如果数据变动不是很频繁,比如用Redis做分布式锁,拿不到锁的等着,拿到的执行,完事后释放锁,让其他线程获取锁。

如果变动比较频繁,以适当的定时任务或定时脚本刷新缓存,避免过期后缓存击穿情况。

二 Redis数据类型和使用场景?

Redis采用key-value键值对方式进行存储。

1、String

String可以是字符串、整数或浮点数。

常用命令:https://blog.csdn.net/yhl_jxy/article/details/61194024

2、Hash

Redis 的Hash(散列)是一个可以存储多个键值对之间的映射。与String类型一样,

散列存储的值既可以是字符串又可以是数字值,并且用户也可以对散列的数字值进行

自增或自减操作。Hash最适合做的就是存储对象,占用更少的内存空间,并且更方便

整个对象的存取。

常用命令:https://blog.csdn.net/yhl_jxy/article/details/61429638

3、set(无序集合)

Set是String类型的无序集合。set是通过hash table实现的。

常用命令:https://blog.csdn.net/yhl_jxy/article/details/67692894

4、sorted set(有序集合)

sorted set是set的一个升级版本,主要是在set的基础上增加了顺序属性。

常用命令:https://blog.csdn.net/yhl_jxy/article/details/68146099

5、List

List是一个链表结构,主要功能有push,pop等,push,pop可以操作链表,

可以在链表的头部,尾部添加删除元素,可以实现list作为栈或队列的操作。

常用命令:https://blog.csdn.net/yhl_jxy/article/details/66475963

三 Redis有哪些持久化方式?

缓存数据都是存在内存中,如果没有持久化,服务重启或挂掉,数据将丢失。

Redis持久化(rdb、aof、混合):https://blog.csdn.net/yhl_jxy/article/details/91879874

rdb:rdb是redis内存数据的一个二进制快照文件,定期备份数据到dump.rdb文件,可以设置频率。

这种方式的优点就是通过一个线程定期刷数据,保证redis的高性能,重启恢复也比较快,缺点就是如果设置5s备份一次,

如果还没到下一个5s Redis崩盘了,还没备份的这几秒数据将会丢失。

aof:aof是一种通过备份Redis写操作命令实现的备份,优点就是数据一般不会丢,缺点就是重启恢复太慢了,

备份文件的所有写命令。

Redis 4.X混合持久化:rdb和aof各有千秋,混合持久化是备份数据将两种结合在一起,旧数据以二进制存储,

最新数据以写命令存储,这样在恢复的时候dump恢复很快,只需要执行少量的写命令即可,恢复快而几乎不丢数据。

持续更新完善中......

发布了502 篇原创文章 · 获赞 358 · 访问量 118万+

猜你喜欢

转载自blog.csdn.net/yhl_jxy/article/details/105379126