前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >谈谈个人网站的建立(八)—— 缓存的使用

谈谈个人网站的建立(八)—— 缓存的使用

作者头像
Zephery
发布于 2018-03-12 09:10:33
发布于 2018-03-12 09:10:33
1.6K00
代码可运行
举报
文章被收录于专栏:ZepheryZephery
运行总次数:0
代码可运行

一、概述

1.1 缓存介绍

系统的性能指标一般包括响应时间、延迟时间、吞吐量,并发用户数和资源利用率等。在应用运行过程中,我们有可能在一次数据库会话中,执行多次查询条件完全相同的SQL,MyBatis提供了一级缓存的方案优化这部分场景,如果是相同的SQL语句,会优先命中一级缓存,避免直接对数据库进行查询,提高性能。

缓存常用语:

数据不一致性、缓存更新机制、缓存可用性、缓存服务降级、缓存预热、缓存穿透

可查看Redis实战(一) 使用缓存合理性

1.2 本站缓存架构

从没有使用缓存,到使用mybatis缓存,然后使用了ehcache,再然后是mybatis+redis缓存。

步骤:

(1)用户发送一个请求到nginx,nginx对请求进行分发。

(2)请求进入controller,service,service中查询缓存,如果命中,则直接返回结果,否则去调用mybatis。

(3)mybatis的缓存调用步骤:二级缓存->一级缓存->直接查询数据库。

(4)查询数据库的时候,mysql作了主主备份。

二、Mybatis缓存

2.1 mybatis一级缓存

Mybatis的一级缓存是指Session回话级别的缓存,也称作本地缓存。一级缓存的作用域是一个SqlSession。Mybatis默认开启一级缓存。在同一个SqlSession中,执行相同的查询SQL,第一次会去查询数据库,并写到缓存中;第二次直接从缓存中取。当执行SQL时两次查询中间发生了增删改操作,则SqlSession的缓存清空。Mybatis 默认支持一级缓存,不需要在配置文件中配置。

我们来查看一下源码的类图,具体的源码分析简单概括一下:SqlSession实际上是使用PerpetualCache来维护的,PerpetualCache中定义了一个HashMap<k,v>来进行缓存。

(1)当会话开始时,会创建一个新的SqlSession对象,SqlSession对象中会有一个新的Executor对象,Executor对象中持有一个新的PerpetualCache对象;

(2)对于某个查询,根据statementId,params,rowBounds来构建一个key值,根据这个key值去缓存Cache中取出对应的key值存储的缓存结果。如果命中,则返回结果,如果没有命中,则去数据库中查询,再将结果存储到cache中,最后返回结果。如果执行增删改,则执行flushCacheIfRequired方法刷新缓存。

(3)当会话结束时,SqlSession对象及其内部的Executor对象还有PerpetualCache对象也一并释放掉。

2.2 mybatis二级缓存

Mybatis的二级缓存是指mapper映射文件,为Application应用级别的缓存,生命周期长。二级缓存的作用域是同一个namespace下的mapper映射文件内容,多个SqlSession共享。Mybatis需要手动设置启动二级缓存。在同一个namespace下的mapper文件中,执行相同的查询SQL。实现二级缓存,关键是要对Executor对象做文章,Mybatis给Executor对象加上了一个CachingExecutor,使用了设计模式中的装饰者模式,

2.2.1 MyBatis二级缓存的划分

MyBatis并不是简单地对整个Application就只有一个Cache缓存对象,它将缓存划分的更细,即是Mapper级别的,即每一个Mapper都可以拥有一个Cache对象,具体如下:

a.为每一个Mapper分配一个Cache缓存对象(使用<cache>节点配置);

b.多个Mapper共用一个Cache缓存对象(使用<cache-ref>节点配置);

2.2.2 二级缓存的开启

在mybatis的配置文件中添加:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<settings>
   <!--开启二级缓存-->
    <setting name="cacheEnabled" value="true"/>
</settings>

然后再需要开启二级缓存的mapper.xml中添加(本站使用了LRU算法,时间为120000毫秒):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    <cache eviction="LRU"
           type="org.apache.ibatis.cache.impl.PerpetualCache"
           flushInterval="120000"
           size="1024"
           readOnly="true"/>

2.2.3 使用第三方支持的二级缓存的实现

MyBatis对二级缓存的设计非常灵活,它自己内部实现了一系列的Cache缓存实现类,并提供了各种缓存刷新策略如LRU,FIFO等等;另外,MyBatis还允许用户自定义Cache接口实现,用户是需要实现org.apache.ibatis.cache.Cache接口,然后将Cache实现类配置在<cache type="">节点的type属性上即可;除此之外,MyBatis还支持跟第三方内存缓存库如Memecached、Redis的集成,总之,使用MyBatis的二级缓存有三个选择:

  1. MyBatis自身提供的缓存实现;
  2. 用户自定义的Cache接口实现;
  3. 跟第三方内存缓存库的集成;undefined具体的实现,可参照:SpringMVC + MyBatis + Mysql + Redis(作为二级缓存) 配置

MyBatis中一级缓存和二级缓存的组织如下图所示(图片来自深入理解mybatis原理):

2.3 Mybatis在分布式环境下脏读问题

(1)如果是一级缓存,在多个SqlSession或者分布式的环境下,数据库的写操作会引起脏数据,多数情况可以通过设置缓存级别为Statement来解决。

(2)如果是二级缓存,虽然粒度比一级缓存更细,但是在进行多表查询时,依旧可能会出现脏数据。

(3)Mybatis的缓存默认是本地的,分布式环境下出现脏读问题是不可避免的,虽然可以通过实现Mybatis的Cache接口,但还不如直接使用集中式缓存如Redis、Memcached好。

下面将介绍使用Redis集中式缓存在个人网站的应用。

三、Redis缓存

Redis运行于独立的进程,通过网络协议和应用交互,将数据保存在内存中,并提供多种手段持久化内存的数据。同时具备服务器的水平拆分、复制等分布式特性,使得其成为缓存服务器的主流。为了与Spring更好的结合使用,我们使用的是Spring-Data-Redis。此处省略安装过程和Redis的命令讲解。

3.1 Spring Cache

Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如EHCache 或者 OSCache),而是一个对缓存使用的抽象,通过在既有代码中添加少量它定义的各种 annotation,即能够达到缓存方法的返回对象的效果。Spring 的缓存技术还具备相当的灵活性,不仅能够使用 SpEL(Spring Expression Language)来定义缓存的 key 和各种 condition,还提供开箱即用的缓存临时存储方案,也支持和主流的专业缓存例如 EHCache 集成。

下面是Spring Cache常用的注解:

(1)@Cacheable

@Cacheable 的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存

属性

介绍

例子

value

缓存的名称,必选

@Cacheable(value=”mycache”) 或者@Cacheable(value={”cache1”,”cache2”}

key

缓存的key,可选,需要按照SpEL表达式填写

@Cacheable(value=”testcache”,key=”#userName”)

condition

缓存的条件,可以为空,使用 SpEL 编写,只有为 true 才进行缓存

@Cacheable(value=”testcache”,key=”#userName”)

(2)@CachePut

@CachePut 的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存,和 @Cacheable 不同的是,它每次都会触发真实方法的调用

属性

介绍

例子

value

缓存的名称,必选

@Cacheable(value=”mycache”) 或者@Cacheable(value={”cache1”,”cache2”}

key

缓存的key,可选,需要按照SpEL表达式填写

@Cacheable(value=”testcache”,key=”#userName”)

condition

缓存的条件,可以为空,使用 SpEL 编写,只有为 true 才进行缓存

@Cacheable(value=”testcache”,key=”#userName”)

(3)@CacheEvict

@CachEvict 的作用 主要针对方法配置,能够根据一定的条件对缓存进行清空

属性

介绍

例子

value

缓存的名称,必选

@Cacheable(value=”mycache”) 或者@Cacheable(value={”cache1”,”cache2”}

key

缓存的key,可选,需要按照SpEL表达式填写

@Cacheable(value=”testcache”,key=”#userName”)

condition

缓存的条件,可以为空,使用 SpEL 编写,只有为 true 才进行缓存

@Cacheable(value=”testcache”,key=”#userName”)

allEntries

是否清空所有缓存内容,默认为false

@CachEvict(value=”testcache”,allEntries=true)

beforeInvocation

是否在方法执行前就清空,缺省为 false

@CachEvict(value=”testcache”,beforeInvocation=true)

但是有个问题:

Spring官方认为:缓存过期时间由各个产商决定,所以并不提供缓存过期时间的注解。所以,如果想实现各个元素过期时间不同,就需要自己重写一下Spring cache。

3.2 引入包

一般是Spring常用的包+Spring data redis的包,记得注意去掉所有冲突的包,之前才过坑,Spring-data-MongoDB已经有SpEL的库了,和自己新引进去的冲突,搞得我以为自己是配置配错了,真是个坑,注意,开发过程中一定要去除掉所有冲突的包!!!

3.3 ApplicationContext.xml

需要启用缓存的注解开关,并配置好Redis。序列化方式也要带上,否则会碰到幽灵bug。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    <!-- 启用缓存注解开关,此处可自定义keyGenerator -->
    <cache:annotation-driven/>
    <bean id="jedisConnectionFactory"
          class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <property name="hostName" value="${host}"/>
        <property name="port" value="${port}"/>
        <property name="password" value="${password}"/>
        <property name="database" value="${redis.default.db}"/>
        <property name="timeout" value="${timeout}"/>
        <property name="poolConfig" ref="jedisPoolConfig"/>
        <property name="usePool" value="true"/>
    </bean>
    <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
        <property name="connectionFactory" ref="jedisConnectionFactory"/>
        <!-- 序列化方式 建议key/hashKey采用StringRedisSerializer。 -->
        <property name="keySerializer">
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
        </property>
        <property name="hashKeySerializer">
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
        </property>
        <property name="valueSerializer">
            <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
        </property>
        <property name="hashValueSerializer">
            <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
        </property>
    </bean>
    <bean id="cacheManager" class="org.springframework.data.redis.cache.RedisCacheManager">
        <constructor-arg name="redisOperations" ref="redisTemplate" />
        <!--统一过期时间-->
        <property name="defaultExpiration" value="${redis.defaultExpiration}"/>
    </bean>

3.5 自定义KeyGenerator

在分布式系统中,很容易存在不同类相同名字的方法,如A.getAll(),B.getAll(),默认的key(getAll)都是一样的,会很容易产生问题,所以,需要自定义key来实现分布式环境下的不同。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Component("customKeyGenerator")
public class CustomKeyGenerator implements KeyGenerator {
    @Override
    public Object generate(Object o, Method method, Object... objects) {
        StringBuilder sb = new StringBuilder();
        sb.append(o.getClass().getName());
        sb.append(".");
        sb.append(method.getName());
        for (Object obj : objects) {
            sb.append(obj.toString());
        }
        return sb.toString();
    }
}

之后,存储的key就变为:com.myblog.service.impl.BlogServiceImpl.getBanner。

3.4 添加注解

在所需要的方法上添加注解,比如,首页中的那几张幻灯片,每次进入首页都需要查询数据库,这里,我们直接放入缓存里,减少数据库的压力,还有就是那些热门文章,访问量比较大的,也放进数据库里。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    @Override
    @Cacheable(value = "getBanner", keyGenerator = "customKeyGenerator")
    public List<Blog> getBanner() {
        return blogMapper.getBanner();
    }
    @Override
    @Cacheable(value = "getBlogDetail", key = "''blogid''.concat(#blogid)")
    public Blog getBlogDetail(Integer blogid) {
        Blog blog = blogMapper.selectByPrimaryKey(blogid);
        if (blog == null) {
            return null;
        }
        Category category = categoryMapper.selectByPrimaryKey(blog.getCategoryid());
        blog.setCategory(category);
        List<Tag> tags = tagMapper.getTagByBlogId(blog.getBlogid());
        blog.setTags(tags.size() > 0 ? tags : null);
        asyncService.updatebloghits(blogid);//异步更新阅读次数
        logger.info("没有走缓存");
        return blog;
    }

3.5 测试

我们调用一个getBlogDetail(获取博客详情)100次来对比一下时间。连接的数据库在深圳,本人在广州,还是有那么一丢丢的网路延时的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class SpringTest {
    @Test
    public void init() {
        ApplicationContext ctx = new FileSystemXmlApplicationContext("classpath:spring-test.xml");
        IBlogService blogService = (IBlogService) ctx.getBean("blogService");
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 100; i++) {
            blogService.getBlogDetail(615);
        }
        System.out.println(System.currentTimeMillis() - startTime);
    }
}

为了做一下对比,我们同时使用mybatis自身缓存来进行测试。

3.6 实验结果

统计出结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
没有使用任何缓存(mybatis一级缓存没有关闭):18305
使用远程Redis缓存:12727
使用Mybatis缓存:6649
使用本地Redis缓存:5818

由结果看出,缓存的使用大大较少了获取数据的时间。

部署进个人博客之后,redis已经缓存的数据:

3.7 分页的数据怎么办

个人网站中共有两个栏目,一个是技术杂谈,另一个是生活笔记,每点击一次栏目的时候,会根据页数从数据库中查询数据,百度了下,大概有三种方法:

(1)以页码作为Key,然后缓存整个页面。

(2)分条存取,只从数据库中获取分页的文章ID序列,然后从service(缓存策略在service中实现)中获取。

第一种,由于使用了第三方的插件PageHelper,分页获取的话会比较麻烦,同时整页缓存对内存压力也蛮大的,毕竟服务器只有2g。第二条实现方式简单,缺陷是依旧需要查询数据库,想了想还是放弃了。缓存的初衷是对请求频繁又不易变的数据,实际使用中很少会反复的请求同一页的数据(查询条件也相同),当然对数据中某些字段做缓存还是有必要的。

四、如何解决脏读?

对于文章来说,内容是不经常更新的,没有涉及到缓存一致性,但是对于文章的阅读量,用户每点击一次,就应该更新浏览量的。对于文章的缓存,常规的设计是将文章存储进数据库中,然后读取的时候放入缓存中,然后将浏览量以文章ID+浏览量的结构实时的存入redis服务器中。本站当初设计不合理,直接将浏览量作为一个字段,用户每点击一次的时候就异步更新浏览量,但是此处没有更新缓存,如果手动更新缓存的话,基本上每点击一次都得执行更新操作,同样也不合理。所以,目前本站,你们在页面上看到的浏览量和数据库中的浏览量并不是一致的。有兴趣的可以点击我的网站玩玩~~

五、题外话

兄弟姐妹们啊,个人网站只是个小项目,纯属为了学习而用的,文章可以看看,但是,就不要抓取了吧。。。。一个小时抓取6万次宝宝心脏真的受不了,虽然服务器一切都还稳定==

个人网站http://www.wenzhihuai.com

个人网站源码,希望能给个starhttps://github.com/Zephery/newblog

参考:

1.《深入理解mybatis原理》 MyBatis的一级缓存实现详解

2.《深入理解mybatis原理》 MyBatis的二级缓存的设计原理

3.聊聊Mybatis缓存机制

4.Spring思维导图

5.SpringMVC + MyBatis + Mysql + Redis(作为二级缓存) 配置

6.《深入分布式缓存:从原理到实践》

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-01-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Linux NC命令
NC ncat的使用教程 ---- 安装ncat yum install nmap-ncat -y //centos sudo apt-get -y install netcat-traditional //ubuntu ---- 监听入站连接 服务器端开启入站监听 nc -l 8080 客户端连接服务端 nc ip 8080 连接上后可以互相通讯类似这样 image.png 利用NC扫描端口 利用nc扫描目标 1-100内的端口情况 nc -z -v -n -w 2 ip 1-100 image
院长技术
2021/02/19
8.8K1
Linux NC命令
用户必会的 20 个 Linux 基础命令
在黝黑的终端窗口中输入命令,这样的方式对某些人群来说可能好像过时了,但对许多专业计算机人员来说,这几乎是计算机完成能够执行的所有任务的最有效、最简便和最清晰的方式。如今,一些项目将开源命令引入了 macOS 和 Windows 等非开放平台,因此终端命令不仅仅是针对 Linux 和 BSD 用户,更是与每个人都息息相关。你可能会惊讶地发现,在一台普通的 POSIX 计算机上安装了数千个命令,当然,其中很多命令并不是真的有用,至少不是直接或经常性被使用。而其中的一部分命令虽然不是有效终端必须使用的命令,但相比其他命令而言使用频率较高,值得大家学习一下。
用户1685462
2021/09/10
4080
技术|十个鲜为人知的Linux命令-Part 5
在前四篇“鲜为人知的Linux命令”系列文章受到高度赞赏之后,我们将为广大读者呈上此系列的最后一篇文章,虽然是最后一篇,但是其重要性毫不逊于前几篇。
用户8710643
2021/07/12
4520
前端自动化测试实践05—cypress-e2e入门
在 jest 单元测试中使用快照、API-mock 和 DOM 样式状态断言已经能够实现基础的 UI 测试,但是单元测试属于白盒测试,更关注数据的流动,而端到端测试(End To End Test)属于黑盒测试,更关注操作结果的展示,因此测试效果自然不同。端到端测试更贴近真实用户操作,页面运行在真实的浏览器环境中,因此端到端测试是从用户角度出发的测试。
CS逍遥剑仙
2019/11/04
4.4K0
常用命令(ubuntu)
1.打开终端的方法 Ubuntu 中按左侧栏的第一个“面板主页(Dash 主页)”(可以按win键调出),在里面输入terminal可以打开终端,另外打开终端的快捷键是Ctrl+Alt+T 2.修改用户密码 在terminal中输入passwd,回车,再输入新密码,回车,再次输入新密码,回车,搞定。注意Linux中输入密码的时候不会用*号显示出来,所以注意不要输错了。 3.进入root(超级管理员)权限的方法 1)如果是rethat系统,启动后直接就会进入root超级管理员,如果当然用户不是root,在终端
猿人谷
2018/01/17
2.5K0
Linux 命令(138)—— nc 命令
nc(netcat)是一个短小精悍、功能实用、简单可靠的网络工具,主要有如下作用: (1)端口侦听,nc 可以作为 server 以 TCP 或 UDP 方式侦听指定端口; (2)端口扫描,nc 可以作为 client 发起 TCP 或 UDP 请求; (3)机器之间传输文件; (4)机器之间网络测速。
恋喵大鲤鱼
2020/09/01
6.7K0
《最新出炉》系列初窥篇-Python+Playwright自动化测试-38-如何截图-下篇
这个系列的文章也讲解和分享了差不多三分之一吧,突然有小伙伴或者童鞋们问道playwright有没有截图的方法。答案当然是:肯定有的。宏哥回过头来看看确实这个非常基础的知识点还没有讲解和分享。那么在这个契机下就把它插队分享和讲解一下。Playwright提供了一个截屏的API:page.screenshot。使用该API,只需要指定截图的图片的保存路径及文件名即可。如果仅指定文件名,默认保存在当前目录。
北京-宏哥
2024/04/19
4880
python 实现 跳一跳游戏 代码解析
这个代码实现的是 手动点击起点 和 终点 ,程序自动判断距离、触屏时间 完成跳跃
全栈程序员站长
2022/09/07
1.3K0
python 实现 跳一跳游戏 代码解析
2024全网最全面及最新且最为详细的网络安全技巧 八之 内存取证流量分析[含CTF真题流量详细分析](1)———— 作者:LJS
该文件的密码和administrator的密码相同,接下来我们寻找flag.ccx文件
盛透侧视攻城狮
2024/10/22
3660
2024全网最全面及最新且最为详细的网络安全技巧 八之 内存取证流量分析[含CTF真题流量详细分析](1)———— 作者:LJS
[Linux]常用命令、组合命令以及输入输出重定向
删除非空目录,还有一种更为简单的方法:把-R(或recursive)和-f(或--force)选项结合起来使用。-r选项告诉rm命令进入到它发现的每个子目录中去删除文件,而-f选项只是告诉rm命令完成任务但不要因为些细节问题(比如文件夹非空)而烦扰用户。
祥知道
2020/03/10
1.8K0
windows电脑平时遇到的问题
禁用后立即关机(不能重启,亲测无效!),再开机,即可得到解决。或者禁用后在启用,稍等一会便会出现。
用户6841540
2024/07/29
1500
chrome浏览器 必知必会的小技巧
这篇文章主要介绍的就是一些chrome浏览器的小技巧,很简单,希望对大家有所帮助。 这其中的一些小技巧在低版本中是没有的,所以建议大家用最新版的,目前最新版是62,版本很重要,如果发现有些技巧不起作用,请先查看浏览器的版本。
FEWY
2019/05/27
9710
『C』ubuntu命令大合集
查看软件xxx安装内容dpkg -L xxx查找软件库中的软件apt-cache search 正则… 查看软件xxx安装内容 dpkg -L xxx 查找软件库中的软件 apt-cache search 正则表达式 查找软件库中的软件 aptitude search 软件包 查找文件属于哪个包 dpkg -S filename 查找文件属于哪个包 apt-file search filename 查询软件xxx依赖哪些包 apt-cache depends xxx 查询软件xxx被哪些包依赖 apt-cache rdepends xxx 增加一个光盘源 sudo apt-cdrom add 系统升级
白凡
2018/08/07
7380
《手把手教你》系列技巧篇(六十)-java+ selenium自动化测试 - 截图三剑客 -中篇(详细教程)
  前面我们介绍了Selenium中TakeScreenshot类来截图,得到的图片是浏览器窗口内的截图。有时候,只截浏览器窗口内的图是不够的,而且TakeScreenshot截图只针对浏览器的web事件,假如你在运行脚本过程,windows上有一个其他软件弹出了一个购物的弹窗页面,这个时候就会干扰你截图。所以,有时候我们需要整个屏幕截图,这个时候我们就需要用到Robot这个类。原理大概是,从电脑屏幕左上角画一个长方形,一直画到屏幕右下角,然后得到File对象,在把这个File是用png还是jpg保存,复制到一个具体路径,这个就是截图的整个流程。
北京-宏哥
2022/02/11
8190
《手把手教你》系列技巧篇(六十)-java+ selenium自动化测试 - 截图三剑客 -中篇(详细教程)
ubuntu快捷键设置大全 [转]
转自:http://xiongyongyuan1234.blog.163.com/blog/static/5566116820103845725657/
forrestlin
2022/04/02
2.2K0
11+ chrome高级调试技巧,学会效率直接提升666%
chrome浏览器作为前端童鞋的老婆,相信你一定不陌生。调页面、写BUG、画样式、看php片少了它整个世界都不香了。
前端胖头鱼
2022/07/25
1K0
11+ chrome高级调试技巧,学会效率直接提升666%
nc命令用法举例
nc是netcat的简写,有着网络界的瑞士军刀美誉。因为它短小精悍、功能实用,被设计为一个简单、可靠的网络工具
用户5807183
2019/08/23
13.7K0
ubuntu经常使用的命令摘要
1.df命令 # df -ha 显示所有文件和分区的使用 # df -h /dev/sda1 显示sda1磁盘使用率 # df -T 显示文件系统名称属于每个分区。区的格式类型(比方ext3) 注:h參数表示转换为M。G等人们经常使用的磁盘空间单位显示 2.du命令 # du -h src 显示src文件夹中各个文件(或者文件)所占用的磁盘空间 # du -hs /usr 显示usr文件夹中全部文件的总大小 # du -h test.c 显示test.c文件所占用的磁盘空间 3.dd命令 dd 是 Linux/UNIX 下的一个很实用的命令,作用是用指定大小的块拷贝一个文件,并在拷贝的同一时候进行指定的转换。 # dd if=/dev/hdb | gzip > /root/image.gz 备份/dev/hdb全盘数据。并利用gzip工具进行压缩。保存到指定路径 注:“|”表示管道命令,是指“|”的左边执行结果是其右边的输入条件或者范围。如:history | grep date指从history这条命令执行的结果中显示包括有“date”的命令 # gzip -dc /root/image.gz | dd of=/dev/hdb 将压缩的备份文件恢复到指定盘 # dd if=/dev/fd0 of=disk.img bs=4M 备份软盘。读和写的块大小为4M 4.# uname -a 查看Ubuntu的版本号 5.cat命令 # cat -n test.c 显示整个test.c的内容,并对内容按行编号 6.lsmod命令 # lsmod 显示全部内核载入的模块 # lsmod | grep mptspi 显示内核载入的全部包括mtpspi的模块 7.# lsusb 查看USB设备 8.# cat /proc/cpuinfo 查看cpu的状态 9.# lshw 查看硬件信息 10.# fdisk -l 查看磁盘的信息 # fdisk /dev/sda 对磁盘sda(注意不是sda1,sda1是sda的一个分区)进行操作,包含新建分区。删除分区等,后面的操作按提示选项进行。 11.# free -m 查看当前内存使用情况 12.# ps -A 查看当前系统有哪些进程 13.# kill 进程号 中止一个进程 14.# kill -9 进程号 强制中止一个进程。kill 进程号不成功时能够使用 15.# top 查看当前进程的实时状况 # top -p 786 显示进程号为786的进程的实时执行状况 16.ifconfig命令 # ifconfig 显示网卡相关的信息 # ifconfig eth0 up 打开eth0网卡 # ifconfig eth0 down 关闭eth0网卡 # infonfig eth0 192.168.1.1 设置eth0的IP地址为192.168.1.1 17.启动停止服务命令 # /etc/init.d/服务名 restart/stop/start 重新启动/停止/启动一个服务 18.# whereis 文件名称 高速查找一个文件 19.# find 文件夹 -name 文件名称 在文件夹中查找某个文件名称的文件 find -name ‘*fb*’ 在当前文件夹下查找文件名称中包括”fb”字样的文件 find /usr -name ‘*fb*’ 在/usr文件夹下查找文件名称中包括”fb”字样的文件 20.# tail -n 6 文件名称 假设值的前面有 +(加号)。从文件开头指定的单元数開始将文件写到标准输出。假设值的前面有 -(减号)。则从文件末尾指定的单元数開始将文件写到标准输出。假设值前面没有 +(加号)或 -(减号)。那么从文件末尾指定的单元号開始读取文件。 # tail -n 6 文件名称 == # tail -n -6 文件名称 21.grep命令 # grep ‘test’ d* 显示全部以d开头的文件里包括test的行。
全栈程序员站长
2022/07/06
1.1K0
学好Mac常用命令,助力iOS开发
在iOS开发的过程中,更多地注重iOS开发的效率,熟练使用Mac终端操作的常用命令,可以让你更好的游刃于iOS繁重的开发中。本文着重介绍常用的Mac终端基本指令和快捷键,更加适合一些IOS新手学习和了解。
Jacklin999
2018/09/12
7060
学好Mac常用命令,助力iOS开发
Win11快捷键
尽管Windows 10中支持的几乎所有快捷键在 Windows 11 中都保持不变,但微软古老操作系统的新版本也带来了许多新的快捷组合键。以下是Windows 11键盘快捷键列表,可帮助你快速导航桌面、命令提示符、文件资源管理器、辅助功能等。
用户8711264
2023/03/13
2K0
推荐阅读
相关推荐
Linux NC命令
更多 >
LV.0
这个人很懒,什么都没有留下~
目录
  • 一、概述
    • 1.1 缓存介绍
    • 1.2 本站缓存架构
  • 二、Mybatis缓存
    • 2.1 mybatis一级缓存
    • 2.2 mybatis二级缓存
      • 2.2.1 MyBatis二级缓存的划分
      • 2.2.2 二级缓存的开启
      • 2.2.3 使用第三方支持的二级缓存的实现
    • 2.3 Mybatis在分布式环境下脏读问题
  • 三、Redis缓存
    • 3.1 Spring Cache
    • 3.2 引入包
    • 3.3 ApplicationContext.xml
    • 3.5 自定义KeyGenerator
    • 3.4 添加注解
    • 3.5 测试
    • 3.6 实验结果
    • 3.7 分页的数据怎么办
  • 四、如何解决脏读?
  • 五、题外话
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档