缓存是什么?常用的缓存工具?手写一个LRU算法?使用缓存有哪些常见隐患?

本文介绍了缓存的基本概念,强调了其提升读写性能的作用,特别是读性能的提升。讨论了常用的缓存工具,如Redis和Memcached,并在Java开发中提到了Guava LocalCache和Ehcache。此外,文章手写了基于LinkedHashMap实现的LRU算法,并列举了使用缓存时可能遇到的6大问题,包括写入时机、并发控制、失效策略、一致性、穿透和击穿问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    目录

    1、缓存是什么?为啥要用缓存?

    2、常用的缓存工具

    3.  手写一个LRU算法

    4.  使用缓存有哪些常见隐患?

大家好,我是四九城最豪横的小耳朵。

在这里插入图片描述

今天咱们来用大白话聊聊缓存常见的几个面试题。

1、 缓存是什么?为啥要用缓存?

缓存,就是数据交换的缓冲区,目的是,把读写速度慢的介质的数据保存在读写速度快的介质中,从而提高读写速度,减少时间消耗。

对于CPU 高速缓存 ,高速缓存的读写速度远高于内存。CPU 读数据时,如果在高速缓存中找到所需数据,就不需要读内存; CPU 写数据时,先写到高速缓存,再回写到内存。

对于磁盘缓存,其实就把常用的磁盘数据保存在内存中,内存读写速度也是远高于磁盘的。读数据时从内存读取。写数据时,可先写到内存,定时或定量回写到磁盘,或者是同步回写。这样可以提高磁盘IO的吞吐量。

如上我们可以得出结论,使用缓存的目的,就是提升读写性能。而实际业务场景下,更多的是为了提升读性能,带来更好的性能,更高的并发量

2、 常用的缓存工具

日常业务中,我们使用比较多的数据库是 MySQL ,缓存是 Redis 。我们将 MySQL 的热点数据,缓存到 Redis 中,提升读取性能,也减小 MySQL 的读取压力。例如说:

微博的热点事件排行榜,读取的频率特别高,且要实时更新阅读量,使用 Redis 记录排行榜,可以提升性能和并发。

商品信息,数据更新的频率不高,但是读取的频率很高,特别是热门商品。

在 Java 后端开发中,常见的缓存工具和框架列举如下:

本地缓存:Guava LocalCache、Ehcache。Ehcache 的功能更加丰富。

分布式缓存:Redis、Memcached。Redis 最为主流和常用。

3、 手写一个LRU算法

缓存算法,比较常见的是三种:

LRU(least recently used ,最近最少使用)

LFU(Least Frequently used ,最不经常使用)

FIFO(first in first out ,先进先出)

手写 LRU 代码的实现有多种方式。其中最简单的是基于 LinkedHashMap 来实现,原理就是把最近最少访问的数据放到map的尾部,方便删除,那么最近最常访问的就会按顺序排在最前面。其实现代码如下:

class LRUCache<K, V> extends LinkedHashMap<K, V> {

private final int CACHE_SIZE;

/**

 * 传递进来最多能缓存多少数据

 *

 * @param cacheSize 缓存大小

 */

public LRUCache(int cacheSize) {

    // true 表示让 LinkedHashMap 按照访问顺序来进行排序,最近访问的放在头部,最老访问的放在尾部。

    super((int) Math.ceil(cacheSize / 0.75) + 1, 0.75f, true);

    CACHE_SIZE = cacheSize;

}

@Override

protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {

    // 当 map 中的数据量大于指定的缓存个数的时候,就自动删除最老的数据。

    return size() > CACHE_SIZE;

}

}

4、使用缓存有哪些常见隐患?

常见的问题有以下6种:

缓存何时写入?并且写时如何避免并发重复写入?

缓存如何失效?

缓存和 DB 的一致性如何保证?

如何避免缓存穿透的问题?

如何避免缓存击穿的问题?

如果避免缓存雪崩的问题?

                         End

作者简介:豪横的小耳朵,一个豪横的程序员。想和大家一起在技术的世界里豪横,用技术的眼光去看待世界。欢迎扫描下方二维码,持续关注,一大波原创系列文章正在路上。

在这里插入图片描述

扫码关注后回复“666”,可免费获取下图所示的java高级工程师学习资料一份。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

### 回答1: CentOS 7启动httpd服务失败可能有多种原因,以下是一些常见的解决方法: 1. 检查httpd配置文件是否正确:可以使用命令`httpd -t`检查httpd配置文件是否正确,如果有错误,需要修改配置文件。 2. 检查端口是否被占用:可以使用命令`netstat -tlnp`查看端口是否被占用,如果被占用需要释放端口或修改httpd配置文件中的端口号。 3. 检查httpd服务是否安装:可以使用命令`rpm -qa | grep httpd`查看httpd服务是否安装,如果没有安装需要先安装httpd服务。 4. 检查httpd服务是否启动:可以使用命令`systemctl status httpd`查看httpd服务是否启动,如果没有启动需要使用命令`systemctl start httpd`启动httpd服务。 5. 检查SELinux是否开启:如果SELinux开启,可能会导致httpd服务启动失败,需要使用命令`setenforce 0`关闭SELinux,或者修改SELinux策略。 以上是一些常见的解决方法,如果以上方法都无法解决问题,可以查看httpd服务日志文件,找到具体的错误信息,然后根据错误信息进行解决。 ### 回答2: CentOS 7上的httpd服务启动失败可能有多种原因。以下列出了一些常见问题和解决方法: 1. 端口被占用 当httpd试图占用已被其他程序占用的端口时会启动失败。此时可以通过使用`netstat -tunlp`命令检查端口占用情况,然后杀死占用该端口的进程及时释放端口。或者修改httpd的配置文件,将端口修改为未被占用的端口。 2. 配置文件错误 有时httpd服务的配置文件中可能出现错误,例如语法错误或路径错误等等。在启动httpd服务之前,可以使用`apachectl configtest`命令进行检查,如果输出“Syntax OK”,则表示配置文件没有错误。如果出现错误,则需要根据错误提示进行相应修改。 3. 依赖关系问题 如果httpd依赖的其他程序或库缺失,也会导致启动失败。可以通过使用`systemctl status httpd.service`命令来查看httpd服务状态,如果输出“Failed to start”或“Loaded: failed”,则需要检查依赖关系是否完整。 4. SELinux问题 当SELinux启用时,有时会导致httpd服务启动失败。在这种情况下,可以在SELinux上禁用httpd服务,或者修改httpd配置文件解决SELinux相关的问题。 5. 用户权限问题 httpd服务启动可能需要特定的用户权限。如果使用的用户权限不够,则无法启动。可以尝试使用root用户启动httpd服务,或者根据需要修改相应的用户权限。 ### 回答3: CentOS 7中的Apache HTTP服务器(httpd)是一个常见的Web服务器,如果遇到httpd服务启动失败的情况,可能会影响服务器正常的工作和对外服务的稳定性。本文将提供一些可能会导致httpd服务启动失败的原因,并给出相应的解决方法。 1. 端口被占用 如果端口被其他进程占用,httpd服务就无法启动。可以通过 netstat -tulpn 命令查看端口占用情况,并杀死占用该端口的进程。如果端口被 httpd 服务自身占用,可以通过 systemctl restart httpd 命令重启 httpd 服务;如果是其他进程占用了端口,可以通过 kill 命令杀死该进程或更改 httpd.conf 文件配置,将 httpd 服务的端口改为其他空闲端口,重新启动。 2. 配置文件错误 httpd 服务的配置文件通常是 /etc/httpd/conf/httpd.conf,如果其中存在语法错误、权限问题或者其它配置错误,可能会导致 httpd 服务启动出错。可以通过将 httpd.conf 文件备份后删掉,重新执行 yum install httpd 命令安装 httpd 服务,然后手动修改 httpd.conf 文件,逐个检查每个配置项是否正确,确认无误后重启 httpd 服务。 3. SELinux 问题 SELinux 是 CentOS 7中提供的一种安全模块,它可以对系统文件和应用程序进行安全管控。如果 SELinux 配置不正确,可能会阻止 httpd 服务正常启动。可以通过修改 /etc/selinux/config 文件中 SELINUX=disabled 来暂时关闭 SELinux,然后重新启动 httpd 服务;或者一个更优的方式是,根据日志确定问题原因,使用命令 semanage 或者 setsebool 等工具将相关目录或者配置加入到 SELinux 许可列表中,重新启动 httpd 服务,以恢复服务正常工作。 4. 防火墙问题 如果你的 CentOs 7 服务器启用了防火墙,有可能会导致 httpd 服务启动失败。可以通过检查防火墙相关配置来确定问题原因,解决方案是修改防火墙规则,将端口 80 或者 443 等 httpd 服务需要的端口放行,重新启动 httpd 服务。 总之,当遇到 httpd 服务启动失败时,不要慌张,可以先通过日志或者执行命令查看错误信息,找到错误原因,然后根据错误原因一步一步解决问题。在解决问题过程中注意备份原始配置文件,以免造成不必要的损失。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值