发表于: 2020-07-12 22:58:16

1 1183


今天完成的事:


深度思考


1.为什么要使用memcache?memcache有什么作用?  

memcache一般的使用目的是,通过缓存数据库查询的结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。 它是一个基于内存的“键值对”存储,用于存储数据库调用、API调用或页面引用结果的直接数据,如字符串、对象等。


2.后台只允许有列表页和详情页,列表页分为搜索区和列表区和操作区,原因是什么?有没有其他设计方式,相比之下各自的好处是什么?


3.什么叫集群?缓存应该在什么情况下使用集群?有哪些实现集群的方案?  

集群主要的使用场景是为了分担请求的压力,也就是在几个服务器上部署相同的应用程序,来分担客户端请求。

缓存集群主要是用来抗高并发的,一般在需要承载大量读请求时会用到。

集群分类

1、负载均衡集群(Load balancing cluters)

2、高可用集群(High-availablility clusters)

3、高性能计算集群(High-performance clusters)

4、网格计算集群(Grid computing)


4.什么是压测,为什么要进行压力测试?JMETER工具的使用  

压力测试是通过不断向被测系统施加“压力”,测试系统在压力情况下的性能表现,考察当前软硬件环境下系统所能承受的最大负荷并帮助找出系统瓶颈所在,也就是我们可以模拟巨大的工作负荷以查看应用程序在峰值使用情况下如何执行操作。

压力测试考察当前软硬件环境下系统所能承受的最大负荷并帮助找出系统瓶颈所在。压测都是为了系统在线上的处理能力和稳定性维持在一个标准范围内,做到心中有数。

使用压力测试,您有希望找到很多种用其他测试方法更难发现的错误。有两种错误类型是:内存泄漏,并发与同步。

有效的压力测试系统将应用以下这些关键条件:重复,并发,量级,随机变化。

JMeter怎么使用
测试计划(test plan)的各个部分:

Test Plan:所有测试内容都包含在Test Plan 下。

Jmeter的元素:

Thread Group;Controllers;Samplers;Logic Controllers;

Test Fragments;Listeners;Timers;Assertions;Configuration Elements;

Pre-Processor Elements;Post-Processor Elements;

5.Memcache和Redis可否做集群?什么样的情况下应该做集群? 

可以做集群,集群主要的使用场景是为了分担请求的压力,也就是在几个服务器上部署相同的应用程序,来分担客户端请求。


6.什么是脏数据,缓存中是否可能产生脏数据,如果出现脏数据该怎么处理?  

脏数据在临时更新(脏读)中产生。事务A更新了某个数据项X,但是由于某种原因,事务A出现了问题,于是要把A回滚。

但是在回滚之前,另一个事务B读取了数据项X的值(A更新后),A回滚了事务,数据项恢复了原值。事务B读取的就是数据项X的就是一个“临时”的值,就是脏数据。

简单讲,脏数据:从目标中取出的数据已经过期、错误或者没有意义,这种数据就叫做脏数据。

数据库中的并发事务处理问题:

脏读:在并发访问的情况下,不同的事务对相同的数据进行操作,在事务A修改数据还未提交的时候,事务B对该数据进行读取,读出了事物A修改过后的数据,但是事物A最终没有提交,这种情况就是数据库中的脏读情况

更新丢失:对于同一行数据不同事务进行更新,结果覆盖

幻读:事务A前后两次读取,后一次读取的数据变多了,事物B在两次读取中间已经进行数据插入

不可重复读:事务A读取了事务B修改前后的两次数据,不符合隔离型

隔离等级:可以解决上述问题,mysql默认可重复读的隔离等级,只会存在读取的数据和数据库不一致的问题


mybatis的一级二级缓存是存在产生脏数据的,所以推荐使用第三方缓存memcached和redis


redis中怎么避免脏读

读写部分:

if(redis存在数据){

    读取redis数据

}else{

    数据库读取,同时存redis+设置超时时间


更新部分:

if(数据库update){

    更新redis+设置超时时间


7.插入,更新和查询数据的时候,读写缓存和DB的顺序应该是怎么样的?  

插入更新时,先更新DB再读写缓存;查询数据时,先读缓存再读DB。


8.JVM缓存和Memcache这种缓存的区别在哪里?是否可以不使用Memcache,只用虚拟机内存做缓存?

ehcache这种jvm的缓存和memcache这种io级别的缓存还是有明显差别的,以下区别决定了他们会在不同的场景下使用

优点: 没有IO开销会有更高的效率,使用起来也更加灵活。

缺点: 但是公用jvm内存也会对应用本身有影响,另外多个应用共享就比较困难了。(ehcache有一个不使用jvm内存的方案)

本地缓存相对于分布式缓存的好处是,由于数据不需要跨网络传输,故性能更好,但是由于占用了应用进程的内存空间,如 Java 进程的 JVM 内存空间,故不能进行大数据量的数据存储。

本地缓存一般适合于缓存只读数据,如统计类数据。或者每个部署节点独立的数据,如长连接服务中,每个部署节点由于都是维护了不同的连接,每个连接的数据都是独立的,并且随着连接的断开而删除。如果数据在集群的不同部署节点需要共享和保持一致,则需要使用分布式缓存来统一存储,实现应用集群的所有应用进程都在该统一的分布式缓存中进行数据存取即可。



9.缓存应该在Service里,还是应该存放在Controller里,为什么?  

放在Controller中:

好处:可以单个Controller进行控制,每个controller中有各自对数据的键,以及缓存时间等。

不好处:每个controller需要写一份几乎一模一样的代码,很繁琐。即使你写一个公共的方法,那也要在各个地方写上这个公共方法,属于重复工作了。

放在Model中:

好处:统一管理,复用性高,controller层不需要理会数据是从缓存中获取还是从mysql中获取,controller完全解放出来了。

不好处:没法对单个controller进行控制了,controller失去了对缓存的控制权。

观点:

我强烈建议放在Model中,因为一般的web是不会controller对缓存这层做直接控制的。


10.什么叫穿透DB?什么情况下会发生,穿透DB后会发生什么事情?

这个前面有写过

11.什么叫命中率?正常来讲,命中率应该控制在多少? 

命中率=从缓存中读bai取数据的次数/所有访问数据次du数(磁盘读取次zhi数+缓存读取次数)

命中率应该控制再:安装cpu的标准(1+80%)*(1+80%)以上吧。

12.什么样的数据适合存在缓存中?缓存的淘汰算法有哪些?  

把数据放入缓存,有三个标准:

1.数据量不大

2.访问频率高

3.数据更改频率低

常见类型包括LFU、LRU、ARC、FIFO、MRU。


13.什么叫一致性哈希,通常用来解决什么问题? 

一致性哈希分区

一致性哈希的目的就是为了在节点数目发生改变时尽可能少的迁移数据,将所有的存储节点排列在收尾相接的Hash环上,每个key在计算Hash 后会顺时针找到临接的存储节点存放。而当有节点加入或退 时,仅影响该节点在Hash环上顺时针相邻的后续节点。

在解决数据分布的问题上,若采用简单的哈希取模方式,由于模是与缓存服务器数据量绑定的,当对缓存服务器进行增减时,模也要变化,这会导致以前的数据全部失效;若采用一致性哈希算法,由于模固定,所以对服务器进行增减时不会导致全部数据失效,受影响的部分只是一小部分。


14.缓存的失效策略有哪几种,分别适合什么场景? 

常见的几种缓存失效策略:

FIFO ,first in first out ,最先进入缓存的数据在缓存空间不够情况下(超出最大元素限制时)会被首先清理出去

LFU , Less Frequently Used ,一直以来最少被使用的元素会被被清理掉。这就要求缓存的元素有一个hit 属性,在缓存空间不够得情况下,hit 值最小的将会被清出缓存。

LRU ,Least Recently Used ,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存

15.Memcache和Redis的区别是什么?

前面有写


16.怎么预估自己系统可承载的日活数? 

通过压测的TPS和QPS来计算


17.什么是JMeter?Jmeter是否可以在多台机器上分布式部署?为什么要分布式部署? 

Apache JMeter 是Apache 组织开发的基于 Java 的压力测试工具

对于并发量很大的需求,如上万并发量,受到CPU和内存的限制,单机模拟场景是实现不了的,为了让JMeter提供更大的负载能力,须使用它的分布式机制,即多台机器同时产生负载的功能。


18.什么是TPS,什么是每秒并发数,什么是90%Line?分别应该到达多少算符合系统上线的要求?

吞吐量(TPS):

吞吐量是指系统在单位时间内处理请求的数量;也就是事务数/秒。它是软件测试结果的测量单位。

90%line就是按顺序排列的一组数据中居于90%位置的数。如果把中位数叫做50%分位数的话,90%line就是90%分位数。

90%line、90%pct、90%百分位这三个词含义相同。

没啥人用的服务 tps 20,返回有300ms就行了

十万到百万级的服务,响应能达到tps50 /200ms就可以了

后台服务,能达到tps 20 / 200ms即可(通常后台同时使用也没多少人)

秒杀类的短时间高并发……TPS100或200 在 100ms内响应 应该也能撑一段时间(具体情况还是要看业务量)



明天计划的事:准备任务七

遇到的困难:

收获:






返回列表 返回列表
评论

    分享到