面试官求你不要问我Redis了!

感谢你的阅读,如果本文对你有帮助,请给博文来个一键三连!万分感谢!

目录

感谢你的阅读,如果本文对你有帮助,请给博文来个一键三连!万分感谢!

 

前言:

正文:

那么为什么要用缓存呢?或者为什么要用Redis呢?

 为什么要用Redis而不用map或者guava做缓存?

Redis和Memcached的区别?

Redis 内存淘汰机制?(MySQL里有2000w数据,Redis中只存 20w的数据,如何保证Redis中的数据都是热点数据?)

怎么保证 redis 挂掉之后再重启数据可以进行恢复?

小结:


前言:

简单来说Redis就是一个数据库,不过与传统的数据库不同的是Redis的数据是存在与内存中的,所以存写速度非常快,因此Redis被广泛应用于缓存方向。另外Redis也经常用来做分布式锁。Redis提供了多种数据类型来支持不同的业务场景需求。除此之外,Redis还支持事务、持久化、LUA脚本、LRU驱动事件、多种集群方案。

正文:

那么为什么要用缓存呢?或者为什么要用Redis呢?

原因主要有两点:

一、高性能

二、高并发

 为什么要用Redis而不用map或者guava做缓存?

缓存分为本地缓存和分布式缓存。

Java 为例,使用自带的 map 或者 guava 实现的是本地缓存,最主要的特点是轻量以及快速,生命周期随着 jvm 的销毁而结束,并且在多实例的情况下,每个实例都需要各自保存一份缓存,缓存不具有一致性。

使用 redis memcached 之类的称为分布式缓存,在多实例的情况下,各实例共用一份缓存数据,缓存具有一致性。缺点是需要保持 redis 或 memcached服务的高可用,整个程序架构上较为复杂。

Redis和Memcached的区别?

Redis 内存淘汰机制?(MySQL里有2000w数据,Redis中只存 20w的数据,如何保证Redis中的数据都是热点数据?)

Redis中有个设置时间过期的功能,即对存储在 redis 数据库中的值可以设置一个过期时间。作为一个缓存数据库,这是非常实用的。(定期删除、惰性删除)

但是仅仅通过设置过期时间还是存在问题的,例如定期删除漏掉很多过期的key,并且也没有及时的查,也就是没有走惰性删除,那么过期的key存在与内存中,就会导致Redis内存耗尽。

 Redis提供了6种数据淘汰策略:

1. volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰

2. volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰

3. volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

4. allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(这个是最常用的).

5. allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

6. no-eviction:禁止驱逐数据,也就是说当内存不足以容纳新写入数据时,新写入操作会报错。

(5.0增加了两种:volatile-lfu:从已设置过期时间的数据集挑选使用频率最低的数据淘汰;allkeys-lfu:从数据集中挑选使用频率最低的数据淘汰。)

怎么保证 redis 挂掉之后再重启数据可以进行恢复?

Redis不同于Memcached很重要的一点就是,Redis支持持久化,而且支持两种不同的持久化操作,而Memcached不支持持久化。

Redis的一种持久化方式叫快照(snapshotting,RDB,另一种方式是只追加文件(append-only fifile,AOF)

 1.快照(snapshotting)持久化(RDB

 快照持久化是Redis默认采用的持久化方式,在redis.conf配置文件中默认有此下配置:

save 900 1 //在900秒(15分钟)之后,如果至少有1个key发生变化,Redis就会自动触发BGSAVE命令 创建快照。
save 300 10 //在300秒(5分钟)之后,如果至少有10个key发生变化,Redis就会自动触发BGSAVE命令创 建快照。 
save 60 10000 //在60秒(1分钟)之后,如果至少有10000个key发生变化,Redis就会自动触发BGSAVE命令创 建快照。

2.AOFappend-only fifile)持久化  

与快照持久化相比,AOF持久化 的实时性更好,因此已成为主流的持久化方案。默认情况下Redis没有开启 AOF(append only fifile)方式的持久化,可以通过appendonly参数开启:  

appendonly yes

开启AOF持久化后每执行一条会更改Redis中的数据的命令,Redis就会将该命令写入硬盘中的AOF文件。AOF文件的 保存位置和RDB文件的位置相同,都是通过dir参数设置的,默认的文件名是appendonly.aof

Redis的配置文件中存在三种不同的 AOF 持久化方式,它们分别是:

appendfsync always //每次有数据修改发生时都会写入AOF文件,这样会严重降低Redis的速度 
appendfsync everysec //每秒钟同步一次,显示地将多个写命令同步到硬盘(建议)
appendfsync no //让操作系统决定何时进行同步

补充:Redis 4.0 对于持久化机制的优化

Redis 4.0 开始支持 RDB AOF 的混合持久化(默认关闭,可以通过配置项 aof-use-rdb-preamble 开启)。

如果把混合持久化打开,AOF 重写的时候就直接把 RDB 的内容写到 AOF 文件开头。这样做的好处是可以结合 RDB

AOF 的优点, 快速加载同时避免丢失过多的数据。当然缺点也是有的, AOF 里面的 RDB 部分是压缩格式不再是

AOF 格式,可读性较差。

小结:

后面会继续分享Redis的事务、缓存雪崩、缓存穿透、并发竞争key、双写时数据一致性等问题,欢迎继续关注!

猜你喜欢

转载自blog.csdn.net/l_mloveforever/article/details/111574049