【面试】ASP.NET Core+Redis+Mysql面试题&答案

文章目录

.NET Core

1.如何在ASP.NET Core中激活Session功能
  写的好啊,Inb哥,我是废物

2.什么是中间件
  中间件是介于应用系统和系统软件之间的一类软件,它使用系统软件所提供的基础服务(功能),衔接网络上应用系统的各个部分或不同的应用,能够达到资源共享、功能共享的目的。目前,它并没有很严格的定义,但是普遍接受IDC的定义:中间件是一种独立的系统软件服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源,中间件位于客户机服务器的操作系统之上,管理计算资源和网络通信。从这个意义上可以用一个等式来表示中间件:中间件=平台+通信,这也就限定了只有用于分布式系统中才能叫中间件,同时也把它与支撑软件和实用软件区分开来。

3.Applicationbuilder的Use和Run方法有什么区别
  这两个方法都在start up class的configure方法里面调用。都是用来向应用请求管道里面添加中间件的。Use方法可以调用下一个中间件的添加,而run不会,run是终结式的。要配置多个中间件,请使用Use

public void Configure(IApplicationBuilder app, IHostingEnvironment env){
   app.Use(async (context, next) =>{
      await context.Response.WriteAsync("1st MW!");
      await next();
   });
   app.Run(async (context) =>{
      await context.Response.WriteAsync("2nd MW");
   });
}

4.如何使taghelper在元素这一层上失效
  使用叹号。Tag helper用来在服务器端使用Razor视图引擎创建html元素的。

5.何为ASP.NET Core
  ASP.NET Core 是一个由微软创建的,用于构建 web 应用、API、微服务 的开源且跨平台的 web 框架。

6.ASP.NET Core中AOP的支持有哪些
  通过Filter来支持;分别有IResourceFilter AuthorizeFilter ActionFilter ExceptionFilter ResultFilter,Filter也被称为拦截器!

7.ASP.NET Core Filter的注册方式有哪些
  方法注册:只对方法生效;控制器注册:对控制器中的所有方法生效;全局注册:对整个项目生效;

8.ASP.NET Core Filter 如何支持依赖注入
  写的好啊,Inb哥,我是废物

9.ASP.NET Core如何读取配置文件的内容
  写的好啊,Inb哥,我是废物

10 .ASP.NET Core有哪些好的功能
  包括但不限于:
  第一是依赖注入。
  第二是日志系统架构。
  第三是引入了一个跨平台的网络服务器,kestrel。可以没有iis, apache和nginx就可以单独运行。
  第四是可以使用命令行创建应用。
  第五是使用APP settings json file来配置工程。
  第六是使用start up来注册服务。
  第七是更好的支持异步编程。
  第八是支持web socket和signal IR。
  第九是对于跨网站的请求的预防和保护机制。

11 .ASP.NET Core和ASP.NET比有那些更好的地方
  第一是跨平台,它可以运行在三大操作系统上面,windows, Linux和MAC。
  第二是对架构本身安装没有依赖,因为所有的依赖都跟程序本身在一起。
  第三是ASP.NET Core处理请求的效率更高,能够处理更多的请求。
  第四是ASP.NET Core有更多的安装配置方法。

12 .什么是mata packages
  Meta packages是指包含所有ASP dot net code依赖的一个包。叫做Microsoft.AspNetCore

13 .ASP.NET Core能够跟ASP.NET 4.x架构一起工作吗
  可以。ASP.NET Core应用可以跟标准的dot net 库一起工作。

14 .什么是ASP.NET Core的startup类
  写的好啊,Inb哥,我是废物

15 .startup类的configservice方法有什么作用
  在这个方法里我们可以添加一些service进入依赖注入容器。

16 .startup类的configure方法有什么作用
  这个方法来定义整个应用如何响应HTTP请求。它有几个比较重要的参数,applicationbuilder,Hosting environment, logfactory, 在这里我们可以配置一些中间件用来处理路径,验证和session等等。

17 .ASP.NET Core管道里的map拓展有什么作用
  可以针对不同的路径添加不同的中间件。

18 .ASP.NET Core里面的路径是如何处理的
  路径处理是用来为进入的请求寻找处理函数的机制。所有的路径在函数运行开始时进行注册。主要有两种路径处理方式, 常规路径处理和属性路径处理。常规路径处理就是用MapRoute的方式设定调用路径,属性路径处理是指在调用函数的上方设定一个路径属性。

19 .ASP.NET Core工程里有多少个工程文件
  launchsetting,appsettings,Program, Startup

20 .什么是ASP .NET Core 里面的 taghelper
  写的好啊,Inb哥,我是废物

21 .说说.NET5中_ViewImports文件的作用
  在.NET5中可以支持组件化编程,定义的各种组件,在项目中使用的时候,需要在_ViewImports文件中引入进来。

22 .什么是Razor页面
  是dot net core中支持ASP网页表格的一种开发模型。@page 作为页面的起始标志。

23 .说说.NET5中_ViewStart文件的作用
  在控制器在返回视图的时候,开始替换视图引擎的时候,从_ViewStart.cshtml 开始,来初始化展示的视图界面;

24 .如何在Razor页面中实现数据模型绑定
  使用bindproperty属性。

25 .如何在 Controller 中注入 service
  在configservices方法中配置这个service。在controller的构造函数中,添加这个依赖注入。

26 .描述一下依赖注入后的服务生命周期
  在dot net core中,我们不需要关心如何释放这些服务, 因为系统会帮我们释放掉。有三种服务的生命周期。
  单实例服务, 通过add singleton方法来添加。在注册时即创建服务, 在随后的请求中都使用这一个服务。
  短暂服务, 通过add transient方法来添加。是一种轻量级的服务,用于无状态服务的操作。
  作用域服务,一个新的请求会创建一个服务实例。使用add scoped方法来添加。

27 .说说ASP.NET Core内置容器的特点
  ASP.NET Core内置容器IServiceCollection,只支持构造函数注入;支持三种声明周期:单例、瞬时、Scoped三种声明周期管理;

28 .ASP.NET Core中如何读取静态文件
  写的好啊,Inb哥,我是废物

29 .ASP.NET Core项目如何设置IP地址和端口号
  可以使用Properties文件夹下的launchSettings配置文件来配置不同的启动方式的时候,分别配置IP和端口号。

30 .ASP.NET Core项目中,wwwroot文件夹内包含什么内容
  包含了css、js、js库、字体文件

31 .谈谈对ASP.NET Core kestrel的理解
  Kestrel 是一个跨平台的适用于 ASP.NET Core 的 Web 服务器。 Kestrel 是 Web 服务器,默认包括在 ASP.NET Core 项目模板中。

  Kestrel 支持以下方案:
  HTTPS
  28
  用于启用 WebSocket 的不透明升级
  用于获得 Nginx 高性能的 Unix 套接字
  HTTP/2(除 macOS† 以外)
  macOS 的未来版本将支持 †HTTP/2。

  .NET Core 支持的所有平台和版本均支持 Kestrel。

32 .谈谈对Autofac的理解
  Autofac是一个IOC容器,支持三种类型的DI依赖注入,配置文件配置映射关系,支持AOP扩展定制;

  在ASP.NET Core的使用步骤如下:

  1.Nuget引入Autofac程序集
  2.在Program类中的CreateHostBuilder方法中,通过.UseServiceProviderFactory(new AutofacServiceProviderFactory())替换容器工厂,把容器替换到框架中;
  3.在Startup中增加ConfigureContainer方法,用来配置映射关系

public void ConfigureContainer(ContainerBuilder builder)
        {
            
        }
//使用了Autofac以后,在IServiceCollection中注入的服务,也能生效;因为Autofac是先接受了所有的来自于IServiceCollection的服务映射后,再去读取ConfigureContainer方法中配置的映射;

  4.就可以在控制器中配置构造函数注入了

33 .ASP.NET Core 如何支持 Log4Net扩展
  1.nuget引入log4net程序集;Microsoft.Extensions.Logging.Log4Net.AspNetCore程序集合
  2.增加配置文件,配置文件内容如下

<?xml version="1.0" encoding="utf-8"?>
<log4net>
	<!-- Define some output appenders -->
	<appender name="rollingAppender" type="log4net.Appender.RollingFileAppender">
		<file value="..\log\Customlog.txt" />
		<!--追加日志内容-->
		<appendToFile value="true" />

		<!--防止多线程时不能写Log,官方说线程非安全-->
		<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />

		<!--可以为:Once|Size|Date|Composite-->
		<!--Composite为Size和Date的组合-->
		<rollingStyle value="Composite" />

		<!--当备份文件时,为文件名加的后缀-->
		<datePattern value="yyyyMMdd.TXT" />

		<!--日志最大个数,都是最新的-->
		<!--rollingStyle节点为Size时,只能有value个日志-->
		<!--rollingStyle节点为Composite时,每天有value个日志-->
		<maxSizeRollBackups value="20" />

		<!--可用的单位:KB|MB|GB-->
		<maximumFileSize value="3MB" />

		<!--置为true,当前最新日志文件名永远为file节中的名字-->
		<staticLogFileName value="true" />

		<!--输出级别在INFO和ERROR之间的日志-->
		<filter type="log4net.Filter.LevelRangeFilter">
			<param name="LevelMin" value="ALL" />
			<param name="LevelMax" value="FATAL" />
		</filter>
		<layout type="log4net.Layout.PatternLayout">
			<conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/>
		</layout>
	</appender>
	<root>
		<priority value="ALL"/>
		<level value="ALL"/>
		<appender-ref ref="rollingAppender" />
	</root>
</log4net>


  3.使用Log4net配置

public static IHostBuilder CreateHostBuilder(string[] args)
		{  
			return Host.CreateDefaultBuilder(args) //创建默认主机的建造者;
			.ConfigureLogging(loggbuild =>
			{
				loggbuild = loggbuild.AddLog4Net("CfgFile/log4net.Config");
			})   ///配置logging(指定使用Log4net)
			.ConfigureWebHostDefaults(webBuilder =>   
			 {
				 webBuilder.UseStartup<Startup>(); //如何配置? 配置全交给Startup来完成; 
			 }).UseServiceProviderFactory(new AutofacServiceProviderFactory());
		}

  4.就可以支持注入了,可以在控制器中使用了

34 .说说脚本启动ASP.NET Core Web项目
  第一种:定位到Web项目的编译地址下,就是bin文件夹下的.NET5文件夹,然后在当前文件夹下打开命令提示窗口;dotnet dll文件 —urls=http://ip地址:端口号 回车即可;

  第二种:定位到Web项目的根目录下,然后在当前文件夹下打开命令提示窗口;dotnet run —urls=http://ip地址:端口号 回车即可;

推按第二种,第二种方式,在启动的时候,会自动编译项目,然后启动dll文件;

35 .说说 Core WebApi 的 Swagger
  写的好啊,Inb哥,我是废物

36 .说说Core WebApi特性路由
  在Core WebApi中,每一个Api必须指定特性路由,即在Api或者控制器上标记特性Route(“api/[Controller]/Api”);访问Api,就按照这个格式访问;

37 .说说RESTful杲什么
  写的好啊,Inb哥,我是废物

38 .说说脚本在请求Web CoreApi的时候,为什么会发生跨域
  跨域问题:本质是浏览器的行为,浏览器有一个同源策略,同源策略:协议、IP地址相同就认为是同源;否则就非同源;同源策略限定脚本请求只能请求同源的服务器返回的内容才给正常的使用;否则就会报跨域问题;其实我们在请求Core WebApi的时候,浏览器直接访问Api没有问题,如果是脚本请求,就会出现跨域问题;

39 .如何解决跨域问题
  写的好啊,Inb哥,我是废物

40 .说说你了解到的鉴权授权技术
  1.传统的授权技术:通过Session、Cookie完成授权;实现特点: 让无状态的http请求,变的有状态,让第一次请求和第二次请求之间产生联系,第一次请求进入服务器,在服务器写入一组session,然后返回sessionId给客户端存在Cookie,第二次请求,从cookie中渠道SessionId,传递给服务器,服务器鉴别SessionId,如果是上一次来的SessionId,就认为之前来请求过;就认为有权限;

  2.流行鉴权授权方式:Token授权,在Core WebApi中主要就是JWT和IdentityServer4;都是独立的授权中心,授权后办法token,然后客户端带着token去请求Api,Api方验证Token,验证通过就有权限,验证不通过就没有权限;

41 .说说你对gRPC的了解
  写的好啊,Inb哥,我是废物

42 .gRPC有几种模式
  1,简单模式:简单模式只是使用参数和返回值作为服务器与客户端传递数据的方式,最简单。
  2,客户端流模式:即从客户端往服务器端发送数据使用的是流,即服务器端的参数为流类型,然而在服务器相应后返还数据给客户端,使用的也是流的send方法。一般在服务器端的代码,需要先recv再send,而客户端与此相反。但是在后面的双向模式中可以使用go的协程协作。
  3,服务器端流模式:即服务器端返回结果的时候使用的是流模式,即传入的数据是通过参数形式传入的。但是在往客户端发送数据时使用send方法,与客户端返回数据的方式大同小异。
  4,双向模式:客户端如果不适用协程,那么发送必须在接收之前。如果使用协程,发送与接收并没有先后顺序。为了保证协程的同步,可以使用互斥量进行约束。

43 .说说如何使用C#实现简单模式gRPC
  分为客户端和服务端;

  服务端:
  1.通过vs新建一个gRPC服务,会内置一proto文件;内容如下,可以理解成是一个模板,通过这个模板可以生成对应的类文件。

syntax = "proto3"; //规范---标准---工具生成C#

option csharp_namespace = "Zhaoxi.gRPCDemo.DefaultServer";

package greet;

// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply);
}

// The request message containing the user's name.
message HelloRequest {
string name = 1;
}

// The response message containing the greetings.
message HelloReply {
string message = 1;
}

  2.需要让这个文件生效,就必须要在项目文件中配置使用这个文件;GrpcServices=“Server”,这是服务端的配置;

  <protobuf include="protos\custommath.proto" grpcservices="server" >     <protobuf include="protos\greet.proto" grpcservices="server" >   </protobuf include="protos\greet.proto" grpcservices="server" ></protobuf include="protos\custommath.proto" grpcservices="server" >

  3.编译,就可以通过这个模板生成一些类,包含这些类的方法;

  客户端:
  1.Vs新建一个控制台,作为客户端
  2.把服务端的那个proto文件,连同文件一起Copy到客户端来。
  3.配置客户端的项目文件,如下。请注意 GrpcServices=“Client”

  <ItemGroup>
    <Protobuf Include="Protos\greet.proto" GrpcServices="Client" />
    <Protobuf Include="Protos\CustomMath.proto" GrpcServices="Client" />
  </ItemGroup>

  4.编译后,编写调用gRPC的方法如下:

private static async Task TestHello()
{
    using (var channel = GrpcChannel.ForAddress("https://localhost:5001"))
    {
      var client = new Greeter.GreeterClient(channel);
      var reply = await client.SayHelloAsync(new HelloRequest { Name = "朝夕教育" });
      Console.WriteLine("Greeter 服务返回数据: " + reply.Message); 
    }
}

44 .说说gRPC的拦截器有哪些
  分为客户端拦截器,和服务端连接器,是AOP的编程思想的体现。
  分别有:
  BlockingUnaryCall:拦截阻塞调用
  AsyncUnaryCall: 拦截异步调用
  AsyncServerStreamingCall 拦截异步服务端流调用
  AsyncClientStreamingCall 拦截异步客户端流调用
  AsyncDuplexStreamingCall 拦截异步双向流调用
  UnaryServerHandler 用于拦截和传入普通调用服务器端处理程序
  ClientStreamingServerHandler 用户拦截客户端流调用的服务端处理程序
  ServerStreamingServerHandler 用于拦截服务端流调用的服务器端处理程序
  DuplexStreamingServerHandler 用于拦截双向流调用的服务器端处理程序

45 .gPRC作为一种被调用的服务,有什么保护安全的措施吗
  有的,可以使用JWT,无论是对称可逆加密还是非对称可逆加密,都是可以支持的;

46 .请问对EFCore有了解吗
  Entity Framework Core是适用于.NET的新式物件资料库对应程式。其支援LINQ查询、变更追踪、更新以及结构描述移转。EF Core透过[资料库提供者外挂程式模型]来搭配使用SQL Server/SQL Azure、SQLite、Azure Cosmos DB、MySQL、PostgreSQL及更多资料库。

47 .说说EFCore查询的性能调优小技巧
  如果说查询出来的数据,只是做展示,不做增删改查,可以在查询的时候,增加AsNoTracking()方法,可以提高性能,可以避免在内存中存在副本;建议在查询的时候,多使用Find()方法,会有限走内存缓存,如果内存已经存在,就不会去数据库中去操查询数据;

48 .EFCore如何通过数据生成实体和DbContext
  1.Nuget引入 如下程序集

Install-Package Microsoft.EntityFrameworkCore
Install-Package Microsoft.EntityFrameworkCore.SqlServer  
Install-Package Microsoft.EntityFrameworkCore.Tools

  2.在Vs中打开工具–nuget包管理器–程序包管理器控制台:命令执行:Scaffold-DbContext “Data Source=DESKTOP-63QE7M1;Initial Catalog=ZhaoxiEduDataBase;User ID=sa;Password=sa123” Microsoft.EntityFrameworkCore.SqlServer -OutputDir Entity -Force -Context ZhaoxiDbContext -ContextDir /
  注:命令参数应用如下:

命令参数:
-OutputDir *** 实体文件所存放的文件目录
-ContextDir *** DbContext文件存放的目录
-Context *** DbContext文件名
-Schemas *** 需要生成实体数据的数据表所在的模式
-Tables *** 需要生成实体数据的数据表的集合
-DataAnnotations
-UseDatabaseNames 直接使用数据库中的表名和列名(某些版本不支持)
-Force 强制执行,重写已经存在的实体文件

49 .说说对SaveChanges的理解
  SaveChanges是以Context为维度的一次提交,对于数据库操作的一切动作,只要是在同一个Context实例,所有的操作,在调用SaveChanges方法后,统一体现到数据库中去;

51 .说说对EFCore中Entitystate的理解
  因为EFCore对于数据库的所有操作都是通过上下文DbContext来完成的,且是通过SaveChanges方法统一落实到数据库中去的;EntityState是EFCore 在对数据库操作增删改的时候,记录当前被操作的数据对象和Context的关系,针对与不同的操作,对应的一个状态信息,一共五种状态;一共五种:

  Detached = 0, 当前对象和context没有任何关系,没有被上下文跟踪
  Unchanged=1, 当前对象被context跟踪,数据没有做任何修改
  Deleted=2, 当前对象被context跟踪,且标记是数据删除,调用SaveChanges后将会从数据中删除;
  Modified=3, 当前对象被context跟踪,且有属性数据被修改过,调用SaveChanges后将会从数据中修改;
  Added=4 当前对象被context跟踪,且数据并没有存在数据库中,调用SaveChanges后将会新增到数据库中去;

52 .说说什么是导航属性和引用属性
  实体框架 中的导航属性提供了一种在两个实体类型之间导航关联的方法。导航属性在概念模型中由 NavigationProperty 元素 (CSDL) 定义。针对对象参与到其中的每个关系,各对象均可以具有导航属性。使用导航属性,您可以在两个方向上导航和管理关系,如果重数为一或者零或一,则返回 EntityReference,或者如果重数为多个,则返回 EntityCollection。也可以选择单向导航,这种情况下可以删除导航属性。

Redis

1、什么是Redis?简述它的优缺点
  Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。
  因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能。比方说用他的List来做FIFO双向链表,实现一个轻量级的高性 能消息队列服务,用他的Set可以做高性能的tag系统等等。另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一 个功能加强版的memcached来用。
  Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。

2、Redis相比memcached有哪些优势
  1.Memcached就支持单一的字符串而Redis支持的数据类型更加丰富
  2.Redis速度更快
  3.Redis支持其数据可持久化

3、Redis支持哪几种数据类型
  Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

4、Redis主要消耗什么物理资源
  内存,因为redis的数据都是存储在内存当中。内存数据库相比一般的关系型数据库,读取速度要更快,但是消耗的内存资源会更多。

5、Redis的全称是什么
  Remote Dictionary Server (远程字典服务)

6、Redis有哪几种数据淘汰策略
  redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。redis 提供 6种数据淘汰策略:
  volatile-lru:从设置了过期时间的数据集中,选择最近最久未使用的数据释放;
  allkeys-lru:从数据集中(包括设置过期时间以及未设置过期时间的数据集中),选择最近最久未使用的数据释放;
  volatile-random:从设置了过期时间的数据集中,随机选择一个数据进行释放;
  allkeys-random:从数据集中(包括了设置过期时间以及未设置过期时间)随机选择一个数据进行入释放;
  volatile-ttl:从设置了过期时间的数据集中,选择马上就要过期的数据进行释放操作;
  noeviction:不删除任意数据(但redis还会根据引用计数器进行释放),这时如果内存不够时,会直接返回错误。

7、Redis官方为什么不提供Windows版本
  redis 官网无法下载window版本的。只有linux版本。 window只有在github下载低版本的(window版本的redis是民间大神修改过的)因为:
  redis 是单线程高性能的。
  所以redis需要单线程轮询。
  操作系统机制的轮询是不太一样的。
  简而言之 linxu轮询用epoll,
  window 用selector
  但是性能上来说 epoll是高于selector 的。
  所以redis推荐使用linux版本。

8、Redis一个字符串类型的值能存储最大容量是多少
  512M

9、为什么Redis需要把所有数据放到内存中
  Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以Redis具有快速和数据持久化的特性。如果不将数据放到内存中,磁盘的I/O速度会严重影响redis的性能。在内存越来越便宜的今天,redis将会越来越受欢迎。如果设置了最大使用的内存,则数据已有记录数达到内存限值后将不能继续插入新值。

10、Redis集群方案应该怎么做,都有哪些方案
  1.codis
  目前用的最多的集群方案,基本和twemproxy-致的效果,但它支持在节点数量改变情况下,旧节点数据可恢复到新hash节点。
  2.redis
  cluster3.0自带的集群,特点在于他的分布式算法不是一致性hash,而是hash槽的概念,以及自身支持节点设置从节点。具体看官方文档介绍。
  3.在业务代码层实现
  起几个毫无关联的redis实例,在代码层,对key进行hash计算,然后去对应的redis实例操作数据。这种方式对hash层代码要求比较高,考虑部分包括,节点失效后的替代算法方案,数据震荡后的自动脚本恢复,实例的监控,等等。

11、Redis集群方案什么情况下会导致整个集群不可用
  有 A,B,C 三个节点的集群,在没有复制模型的情况下,如果节点 B 失败了,那么整个集群就会以为缺少 5501-11000 这个范围的槽而不可用。

12、 MySQL里有2000W数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据
  思路:首先计算出20w数据所需的内存空间,设置最大内存,然后选择合适的内存淘汰策略。

13、Redis有哪些适合的场景
  1、会话缓存(Session Cache)
  最常用的一种使用Redis的情景是会话缓存(session cache)。用Redis缓存会话比其他存储(如Memcached)的优势在于:Redis提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失,大部分人都会不高兴的,现在,他们还会这样吗?幸运的是,随着 Redis 这些年的改进,很容易找到怎么恰当的使用Redis来缓存会话的文档。甚至广为人知的商业平台Magento也提供Redis的插件。
  2、全页缓存(FPC)
  除基本的会话token之外,Redis还提供很简便的FPC平台。回到一致性问题,即使重启了Redis实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似PHP本地FPC。再次以Magento为例,Magento提供一个插件来使用Redis作为全页缓存后端。此外,对WordPress的用户来说,Pantheon有一个非常好的插件 wp-redis,这个插件能帮助你以最快速度加载你曾浏览过的页面。
  3、队列
  Reids在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消息队列平台来使用。Redis作为队列使用的操作,就类似于本地程序语言(如Python)对 list 的 push/pop 操作。如果你快速的在Google中搜索“Redis queues”,你马上就能找到大量的开源项目,这些项目的目的就是利用Redis创建非常好的后端工具,以满足各种队列需求。例如,Celery有一个后台就是使用Redis作为broker,你可以从这里去查看。
  4,排行榜/计数器
  Redis在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合(Sorted Set)也使得我们在执行这些操作的时候变的非常简单,Redis只是正好提供了这两种数据结构。所以,我们要从排序集合中获取到排名最靠前的10个用户–我们称之为“userscores”,我们只需要像下面一样执行即可:当然,这是假定你是根据你用户的分数做递增的排序。如果你想返回用户及用户的分数,你需要这样执行:ZRANGE userscores 0 10 WITHSCORES Agora Games就是一个很好的例子,用Ruby实现的,它的排行榜就是使用Redis来存储数据的,你可以在这里看到。
  5、发布/订阅
  最后(但肯定不是最不重要的)是Redis的发布/订阅功能。发布/订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用Redis的发布/订阅功能来建立聊天系统!

14、Redis支持的Java客户端都有哪些,官方推荐用哪个
  Redisson、Jedis、lettuce等等,官方推荐使用Redisson。

15、Redis和Redisson有什么关系
  Redisson是一个高级的分布式协调Redis客服端,能帮助用户在分布式环境中轻松实现一些Java的对 象 (Bloom filter, BitSet, Set, SetMultimap, ScoredSortedSet, SortedSet, Map, ConcurrentMap, List, ListMultimap, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, ReadWriteLock, AtomicLong, CountDownLatch, Publish / Subscribe, HyperLogLog)。

16、Jedis与Redisson对比有什么优缺点
  Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持;
Redisson实现了分布式和可扩展的Java数据结构,和Jedis相比,功能较为简单,不支持字符串操作, 不支持排序、事务、管道、分区等Redis特性。Redisson的宗旨是促进使用者对Redis的关注分离,从 而让使用者能够将精力更集中地放在处理业务逻辑上。

17、Redis如何设置密码及验证密码
  设置密码:config set requirepass 123456
  授权密码:auth 123456

18、说说Redis哈希槽的概念
  edis 集群没有使用一致性 hash,而是引入了哈希槽的概念,Redis 集群有16384 个哈希槽,每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽,集群的每个节点负责一部分 hash 槽。

19、Redis集群的主从复制模型是怎样的
  为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型, 每个节点都会有N-1个复制品.

20、Redis集群会有写操作丢失吗,为什么
  Redis 并不能保证数据的强一致性,这意味这在实际中集群在特定的条件下可能会丢失写操作。以下情况可能导致写操作丢失:

  • 过期 key 被清理
  • 最大内存不足,导致 Redis 自动清理部分 key 以节省空间
  • 主库故障后自动重启,从库自动同步
  • 单独的主备方案,网络不稳定触发哨兵的自动切换主从节点,切换期间会有数据丢失

21、Redis集群之间是如何复制的
  异步复制

22、Redis集群最大节点个数是多少
  16384 个。原因如下:
  Redis 集群有 16384 个哈希槽,每个 key 通过 CRC16 算法计算的结果,对 16384 取模后放到对应的编号在 0-16383 之间的哈希槽,集群的每个节点负责一部分哈希槽

23、Redis集群如何选择数据库
  Redis 集群目前无法做数据库选择,默认在 0 数据库。

24、怎么测试Redis的连通性
  使用 ping 指令,如:

redis-cli -h host -p port -a password
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>

25、Redis中的管道有什么用
  一次请求/响应服务器能实现处理新的请求即使旧的请求还未被响应,这样就可以将多个命令发送到服务 器,而不用等待回复,最后在一个步骤中读取该答复。
这就是管道(pipelining),是一种几十年来广泛使用的技术。例如许多POP3协议已经实现支持这个功 能,大大加快了从服务器下载新邮件的过程。

26、怎么理解Redis事务
  1)事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
  2)事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。

27、Redis事务相关的命令有哪几个
  MULTI、EXEC、DISCARD、WATCH

28、Redis key的过期时间和永久有效分别怎么设置
  EXPIRE 和 PERSIST 命令。

29、Redis如何做内存优化
  1、缩减键值对象
  缩减键(key)和值(value)的长度,

  • key长度:如在设计键时,在完整描述业务情况下,键值越短越好。
  • value长度:值对象缩减比较复杂,常见需求是把业务对象序列化成二进制数组放入Redis。首先应该在业务上精简业务对象,去掉不必要的属性避免存储无效数据。其次在序列化工具选择上,应该选择更高效的序列化工具来降低字节数组大小。以JAVA为例,内置的序列化方式无论从速度还是压缩比都不尽如人意,这时可以选择更高效的序列化工具,如:
    protostuff,kryo等,下图是JAVA常见序列化工具空间压缩对比。

  2、共享对象池
  对象共享池指Redis内部维护[0-9999]的整数对象池。创建大量的整数类型redisObject存在内存开销,每个redisObject内部结构至少占16字节,甚至超过了整数自身空间消耗。所以Redis内存维护一个[0-9999]的整数对象池,用于节约内存。 除了整数值对象,其他类型如list,hash,set,zset内部元素也可以使用整数对象池。因此开发中在满足需求的前提下,尽量使用整数对象以节省内存。
  3、字符串优化
  4、编码优化
  5、控制key的数量

30、Redis回收进程如何工作的
  一个客户端运行了新的命令,添加了新的数据。Redi 检查内存使用情况,如 果大于 maxmemory 的限制, 则根据设定好的策略进行回收。一个新的命令被执 行,等等。所以我们不断地穿越内存限制的边界,通过不断达到边界然后不断地回收回到边界以下。如果一个命令的结果导致大量内存被使用(例如很大的集合 的交集保存到一个新的键),不用多久内存限制就会被这个内存使用量超越。

31、Redis常见的性能问题都有哪些,如何解决

  • Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照。
  • Master
    AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF文件过大会影响Master重启的恢复速度。Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化,如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。
  • Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象。
  • Redis主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内

32、Memcache与Redis的区别都有哪些
  写的好啊,Inb哥,我是废物

33、Redis的持久化是什么
  写的好啊,Inb哥,我是废物

34、RDB的优缺点
  RDB优势:
  1). 一旦采用该方式,那么你的整个Redis数据库将只包含一个文件,这对于文件备份而言是非常完美的。比如,你可能打算每个小时归档一次最近24小时的数据,同时还要每天归档一次最近30天的数据。通过这样的备份策略,一旦系统出现灾难性故障,我们可以非常容易的进行恢复。
  2). 对于灾难恢复而言,RDB是非常不错的选择。因为我们可以非常轻松的将一个单独的文件压缩后再转移到其它存储介质上。
  3). 性能最大化。对于Redis的服务进程而言,在开始持久化时,它唯一需要做的只是fork出子进程,之后再由子进程完成这些持久化的工作,这样就可以极大的避免服务进程执行IO操作了。
  4). 相比于AOF机制,如果数据集很大,RDB的启动效率会更高。
  RDB劣势:
  1). 如果你想保证数据的高可用性,即最大限度的避免数据丢失,那么RDB将不是一个很好的选择。因为系统一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将丢失。
  2). 由于RDB是通过fork子进程来协助完成数据持久化工作的,因此,如果当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟。

35、AOF的优缺点
  AOF优势:
  1). 该机制可以带来更高的数据安全性,即数据持久性。Redis中提供了3中同步策略,即每秒同步、每修改同步和不同步。事实上,每秒同步也是异步完成的,其效率也是非常高的,所差的是一旦系统出现宕机现象,那么这一秒钟之内修改的数据将会丢失。而每修改同步,我们可以将其视为同步持久化,即每次发生的数据变化都会被立即记录到磁盘中。可以预见,这种方式在效率上是最低的。至于无同步,无需多言,我想大家都能正确的理解它。
  2). 由于该机制对日志文件的写入操作采用的是append模式,因此在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容。然而如果我们本次操作只是写入了一半数据就出现了系统崩溃问题,不用担心,在Redis下一次启动之前,我们可以通过redis-check-aof工具来帮助我们解决数据一致性的问题。
  3). 如果日志过大,Redis可以自动启用rewrite机制。即Redis以append模式不断的将修改数据写入到老的磁盘文件中,同时Redis还会创建一个新的文件用于记录此期间有哪些修改命令被执行。因此在进行rewrite切换时可以更好的保证数据安全性。
  4). AOF包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作。事实上,我们也可以通过该文件完成数据的重建。
  AOF劣势:
  1). 对于相同数量的数据集而言,AOF文件通常要大于RDB文件。RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
  2). 根据同步策略的不同,AOF在运行效率上往往会慢于RDB。总之,每秒同步策略的效率是比较高的,同步禁用策略的效率和RDB一样高效。

  二者选择的标准,就是看系统是愿意牺牲一些性能,换取更高的缓存一致性(aof),还是愿意写操作频繁的时候,不启用备份来换取更高的性能,待手动运行save的时候,再做备份(rdb)。rdb这个就更有些 eventually consistent的意思了。

36、简单说说缓存雪崩及解决方法
  缓存雪崩我们可以简单的理解为:由于原有缓存失效,新缓存未到期间
(例如:我们设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期),所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列连锁反应,造成整个系统崩溃。)

  解决办法:
  大多数系统设计者考虑用加锁( 最多的解决方案)或者队列的方式保证来保证不会有大量的线程对数据库一次性进行读写,从而避免失效时大量的并发请求落到底层存储系统上。还有一个简单方案就时讲缓存失效时间分散开。

37、缓存穿透怎么导致的
  缓存穿透又称缓存击穿,是指在高并发场景下缓存中(包括本地缓存和Redis缓存)的某一个Key被高并发的访问没有命中,此时回去数据库中访问数据,导致数据库并发的执行大量查询操作,对DB造成巨大的压力。

  解决方法:
  1:对缓存失效的Key加分布式锁,当一个Key在本地缓存以及Redis缓存中未查询到数据,此时对Key加分布式锁访问db,如果取到数据就反写到缓存中,避免大量请求进入DB;如果取不到数据则缓存一个空对象,这样可以保证db不会被大量请求直接挂掉,从而引起缓存颠簸,更甚者缓存雪崩效应。
  2:在本地缓存一个set集合,存储对应数据为空的key的集合,在请求前做拦截,此种方式牵涉到数据变更还要校验set集合的问题,一般适用于数据更新比较少的场景。
  3:使用布隆过滤器

38、遇到缓存一致性问题,你怎么解决的
  由于缓存和数据库不属于同一个数据源,本质上非原子操作,所以是无法保证强一致性的,只能去实现最终一致性。

  解决方案:

  • 延时双删:先更新数据库同时删除缓存,等2秒后再删除一次缓存,等到读的时候在回写到缓存。
  • 利用工具(canal)将数据库的binlog日志采集发送到MQ中,然后通过ACK机制确认处理删除缓存

39、为什么要用Redis而不用map/guava做缓存
  缓存分为本地缓存和分布式缓存。以java为例,使用自带的map或者guava实现的是本地缓存,最主要的特点是轻量以及快速,生命周期随着jvm的销毁而结束,并且在多实例的情况下,每个实例都需要各自保存一份缓存,缓存不具有一致性。
   使用redis或memcached之类的称为分布式缓存,在多实例的情况下,各实例共用一份缓存数据,缓存具有一致性。缺点是需要保持redis或memcached服务的高可用,整个程序架构上较为复杂。
  Redis 可以用几十 G 内存来做缓存,Map 不行,一般 JVM 也就分几个 G 数据就够大了;Redis 的缓存可以持久化,Map 是内存对象,程序一重启数据就没了;Redis 可以实现分布式的缓存,Map 只能存在创建它的程序里;Redis 可以处理每秒百万级的并发,是专业的缓存服务,Map 只是一个普通的对象;Redis 缓存有过期机制,Map 本身无此功能;Redis 有丰富的 API,Map 就简单太多了;redis可单独部署,多个项目之间可以空想,本地内存无法共享;redis有专门的管理工具可以查看缓存数据;

40、如何选择合适的持久化方式
  一般来说, 如果想达到足以媲美PostgreSQL的数据安全性, 你应该同时使用两种持久化功能。
如果你非常关心你的数据, 但仍然可以承受数分钟以内的数据丢失,那么你可以只使用RDB持久化。

  有很多用户都只使用AOF持久化,但并不推荐这种方式:因为定时生成RDB快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比AOF恢复的速度要快,除此之外, 使用RDB还可以避免AOF程序的bug。

41、Redis持久化数据和缓存怎么做扩容
  1、如果Redis被当做缓存使用,使用一致性哈希实现动态扩容缩容。
  2、如果Redis被当做一个持久化存储使用,必须使用固定的keys-to-nodes映射关系,节点的数量一旦确定不能变化。否则的话(即Redis节点需要动态变化的情况),必须使用可以在运行时进行数据再平衡的一套系统,而当前只有Redis集群可以做到这样。

42、简单描述下Redis线程模型
  Redis基于Reactor模式开发了网络事件处理器,这个处理器被称为文件事件处理器(file event handler)。它的组成结构为4部分:多个套接字、IO多路复用程序、文件事件分派器、事件处理器。因为文件事件分派器队列的消费是单线程的,所以Redis才叫单线程模型。

  • 文件事件处理器使用 I/O 多路复用(multiplexing)程序来同时监听多个套接字,
    并根据套接字目前执行的任务来为套接字关联不同的事件处理器。
  • 当被监听的套接字准备好执行连接应答(accept)、读取(read)、写入(write)、关闭(close)等操作时,
    与操作相对应的文件事件就会产生, 这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件。

  虽然文件事件处理器以单线程方式运行, 但通过使用 I/O 多路复用程序来监听多个套接字, 文件事件处理器既实现了高性能的网络通信模型, 又可以很好地与 redis 服务器中其他同样以单线程方式运行的模块进行对接, 这保持了 Redis 内部单线程设计的简单性。

43、Redis事务其他实现方式
  1、基于Lua脚本,Redis可以保证脚本内的命令一次性、按顺序地执行,
其同时也不提供事务运行错误的回滚,执行过程中如果部分命令运行错误,剩下的命令还是会继续运行完
  2、基于中间标记变量,通过另外的标记变量来标识事务是否执行完成,读取数据时先读取该标记变量判断是否事务执行完成。但这样会需要额外写代码实现,比较繁

44、生产环境中的redis是怎么部署的
  redis cluster,10 台机器,5 台机器部署了 redis 主实例,另外 5 台机器部署了 redis 的从实例,每个主实例挂了一个从实例,5 个节点对外提供读写服务,每个节点的读写高峰qps可能可以达到每秒 5 万,5 台机器最多是 25 万读写请求/s。
  机器是什么配置?32G 内存+ 8 核 CPU + 1T 磁盘,但是分配给 redis 进程的是10g内存,一般线上生产环境,redis 的内存尽量不要超过 10g,超过 10g 可能会有问题。
  5 台机器对外提供读写,一共有 50g 内存。
  因为每个主实例都挂了一个从实例,所以是高可用的,任何一个主实例宕机,都会自动故障迁移,redis 从实例会自动变成主实例继续提供读写服务。
  你往内存里写的是什么数据?每条数据的大小是多少?商品数据,每条数据是 10kb。100 条数据是 1mb,10 万条数据是 1g。常驻内存的是 200 万条商品数据,占用内存是 20g,仅仅不到总内存的 50%。目前高峰期每秒就是 3500 左右的请求量。
  其实大型的公司,会有基础架构的 team 负责缓存集群的运维。

45、如何解决Redis的并发竞争Key问题
  写的好啊,Inb哥,我是废物

46、什么是 RedLock
  写的好啊,Inb哥,我是废物

47、什么时候需要缓存降级
  当访问量剧增、服务出现问题(如响应时间慢或不响应)或非核心服务影响到核心流程的性能时,仍然需要保证服务还是可用的,即使是有损服务。系统可以根据一些关键数据进行自动降级,也可以配置开关实现人工降级。
  降级的最终目的是保证核心服务可用,即使是有损的。而且有些服务是无法降级的(如加入购物车、结算)。
  以参考日志级别设置预案:
  (1)一般:比如有些服务偶尔因为网络抖动或者服务正在上线而超时,可以自动降级;
  (2)警告:有些服务在一段时间内成功率有波动(如在95~100%之间),可以自动降级或人工降级,并发送告警;
  (3)错误:比如可用率低于90%,或者数据库连接池被打爆了,或者访问量突然猛增到系统能承受的最大阀值,此时可以根据情况自动降级或者人工降级;
  (4)严重错误:比如因为特殊原因数据错误了,此时需要紧急人工降级。
  服务降级的目的,是为了防止Redis服务故障,导致数据库跟着一起发生雪崩问题。因此,对于不重要的缓存数据,可以采取服务降级策略,例如一个比较常见的做法就是,Redis出现问题,不去数据库查询,而是直接返回默认值给用户。

48、如何保证缓存与数据库双写时的数据一致性
  写的好啊,Inb哥,我是废物

Mysql

一、数据库知识(通用)篇
1 .说说主键、外键、超键、候选键
  超键(super key): 在关系中能唯一标识元组的属性集称为关系模式的超键
  候选键(candidate key): 不含有多余属性的超键称为候选键。也就是在候选键中,若再删除属性,就不是键了!
  主键(primary key): 用户选作元组标识的一个候选键程序主键
  外键(foreign key):如果关系模式R中属性K是其它模式的主键,那么k在模式R中称为外键。

2 .为什么用自增列作为主犍
  1、如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择主键作为聚集索引、如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作为主键索引、如果也没有这样的唯一索引,则InnoDB会选择内置6字节长的ROWID作为隐含的聚集索引(ROWID随着行记录的写入而主键递增,这个ROWID不像ORACLE的ROWID那样可引用,是隐含的)。
  2、数据记录本身被存于主索引(一颗B+Tree)的叶子节点上。这就要求同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录按主键顺序存放,因此每当有一条新的记录插入时,MySQL会根据其主键将其插入适当的节点和位置,如果页面达到装载因子(InnoDB默认为15/16),则开辟一个新的页(节点)
  3、如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页
  4、如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置,此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销,同时频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE来重建表并优化填充页面。

3 .触发器的作用是什么
  1、可在写入数据表前,强制检验或转换数据。
  2、触发器发生错误时,异动的结果会被撤销。
  3、部分数据库管理系统可以针对数据定义语言(DDL)使用触发器,称为DDL触发器。
  4、可依照特定的情况,替换异动的指令 (INSTEAD OF)。

4 .什么是存储过程,用什么来调用
  存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。
   调用: 1)可以用一个命令对象来调用存储过程(CALL)。 2)可以供外部程序调用,比如:java程序。

5 .说说存储过程的优缺点
  写的好啊,Inb哥,我是废物

6 .说说存储过程与函数的区别
  写的好啊,Inb哥,我是废物

7 .什么叫视图,游标是什么
  视图:是一种虚拟的表,具有和物理表相同的功能;可以对视图进行增,改,查,操作,视图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。
  游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。

8 .视图的优缺点有哪些
  写的好啊,Inb哥,我是废物

9 .说说drop, truncate, delete区别
  一、SQL中的语法
  1、drop table 表名称 eg: drop table dbo.Sys_Test
  2、truncate table 表名称 eg: truncate table dbo.Sys_Test
  3、delete from 表名称 where 列名称 = 值 eg: delete from dbo.Sys_Test where test=‘test’
  二、drop,truncate,delete区别
  1、drop (删除表):删除内容和定义,释放空间。简单来说就是把整个表去掉.以后要新增数据是不可能的,除非新增一个表。drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。
  2、truncate (清空表中的数据):删除内容、释放空间但不删除定义(保留表的数据结构)。与drop不同的是,只是清空表数据而已。注意:truncate 不能删除行数据,要删就要把表清空。
  3、delete (删除表中的数据):delete 语句用于删除表中的行。delete语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。 truncate与不带where的delete :只删除数据,而不删除表的结构(定义)
  4、truncate table 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用delete。 如果要删除表定义及其数据,请使用 drop table 语句。
  5、对于由foreign key约束引用的表,不能使用truncate table ,而应使用不带where子句的delete语句。由于truncate table 记录在日志中,所以它不能激活触发器。
  6、执行速度,一般来说: drop> truncate > delete。
  7、delete语句是数据库操作语言(dml),这个操作会放到 rollback segement 中,事务提交之后才生效;如果有相应的 trigger,执行的时候将被触发。truncate、drop 是数据库定义语言(ddl),操作立即生效,原数据不放到 rollback segment 中,不能回滚,操作不触发 trigger。

10 .什么是临时表,临时表什么时候删除
  写的好啊,Inb哥,我是废物

11 .说说关系型数据库和非关系型数据库库区别,优势比较
  写的好啊,Inb哥,我是废物

12 .什么是数据库范式,根据某个场景设计教据表
  写的好啊,Inb哥,我是废物

13 . 什么是内连接、外连接、交叉连接.笛卡尔枳等
  1、内连接(inner join):取得两张表中满足存在连接匹配关系的记录。

        完整语法:左表inner join  右表 on 匹配条件
        MySQL语法:左表 join  右表 on 匹配条件

  2、外连接(outer join):取得两张表中满足存在连接匹配关系的记录,以及某张表(或两张表)中不满足匹配关系的记录。具体又分为:左外链接、右外连接、全外链接。

      2.1、左外连(left outer join):除显示两表满足匹配关系的记录,还显示左边表不满足匹配关系的记录; 
        完整语法:左表left outer join  右表 on 匹配条件
        MySQL语法:左表 left outer join 右表 on 匹配条件
      2.2、右外连(right outer join):除显示两表满足匹配关系的记录,还显示右边表不满足匹配关系的记录; 
        完整语法:左表right outer join  右表 on 匹配条件
        MySQL语法:左表right outer join 右表 on 匹配条件
      2.3、全外连(full outer join):除显示两表满足匹配关系的记录,还显示左右表不满足匹配关系的记录; 
        完整语法:左表full  outer join  右表 on 匹配条件
        MySQL语法:MySQL不支持全外连语法,可以用一条左外语句union一条右外语句的到同样的效果。

  3、交叉连接(cross join):显示两张表所有记录一一对应,没有匹配关系进行筛选,也被称之为:笛卡尔积。

        完整语法:左表cross join  右表  
        MySQL语法: 左表join 右表 或 左表,右表

14 .varchar和char的使用场景
  写的好啊,Inb哥,我是废物

15 .SQL语言分类
  写的好啊,Inb哥,我是废物

16 .说说like、%、-的区别
  %百分号通配符:表示任何字符出现任意次数(可以是0次).
  _下划线通配符:表示只能匹配单个字符,不能多也不能少,就是一个字符.
  like操作符: LIKE作用是指示mysql后面的搜索模式是利用通配符而不是直接相等匹配进行比较.

17 .说说count(). count(1). count(column)的区别
  一、count(
)和count(1)的执行结果都是一样的,和count(column)的区别在于,count()和count(1)的统计结果中包括对null记录的统计,而count(column)不包括对null记录的统计
  二、如果你的表没有主键,那么count(1)的执行要比count(
)快些;
  三、如果你的表存在主键那么count(主键)是最快的;
  四、如果你的表只有一个字段,那么count(*)是最快的。

18 .什么是最左前缀原则
  写的好啊,Inb哥,我是废物

19 .什么是索引
  索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。

20 .索引的作用
  索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。

21 .索引的优缺点有哪些
  虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
建立索引会占用磁盘空间的索引文件。

22 .什么样的字段适合建索引
  1、表的主键、外键必须有索引;
  2、数据量超过300的表应该有索引;
  3、经常与其他表进行连接的表,在连接字段上应该建立索引;
  4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
  5、索引应该建在选择性高的字段上;
  6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
  7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
  A、正确选择复合索引中的主列字段,一般是选择性较好的字段;
  B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;
  C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;
  D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;
  E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
  8、频繁进行数据操作的表,不要建立太多的索引;
  9、删除无用的索引,避免对执行计划造成负面影响;

23 .说说MySQL B+tree索引和Hash索引的区别
  写的好啊,Inb哥,我是废物

24 .说说B+tree和Btree的区别
  写的好啊,Inb哥,我是废物

25 .为什B+tree比Btree更适合实际应用中操作系统的文件索引和数据库索引
  写的好啊,Inb哥,我是废物

26 .说说聚集索引和非聚集索引区别
  写的好啊,Inb哥,我是废物

数据库MySql基础篇
1 .函数的分类,经常使用的函数有哪些
  写的好啊,Inb哥,我是废物

2 .分组查询需要注意条件
  使用group by 关键字时,在select列表中可以指定的项目是有限制的,select语句中仅允许以下几项:
  1:被分组的列
  2:为每个分组返回一个值的表达式,
  例如用一个列明作为参数的聚合函数小僧再介绍一下几个常用的聚合函数
  1:sum 求和
  2:avg 求平均值
  3:max / min 求最大值 / 最小值
  4:count 表达式中非空值的出现次数

3 .limit使用方法
  一、select * from tablename order by orderfield desc/asc limit position, counter;
  position 指示从哪里开始查询,如果是0则是从头开始,counter 表示查询的个数
  二、取前15条记录:
  select * from tablename order by orderfield desc/asc limit 0,15
  三、表示从3行以后开始(不包括第3行),按照数据库顺序取10条数据,即检索得到4到13行的数据。
  select * from auth_permission limit 3,10;
  四、LIMIT n 等价于 LIMIT 0,n

4 .mysql常见数据类型
  MySQL支持所有标准SQL数值数据类型。这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。

5 .如何增加删除修改表结构
  1.修改表结构
  增加表字段:alter table Categories add column title varchar(255);
  删除表字段:alter table Categories drop column title;
  修改表字段:alter table Categories change title title_id int;
  2.增加主键/删除
  alter table Categories add primary key (id);增加主键
  alter table Categories change id id int(11) not null auto_increment;增加主键不为空,自增长属性
   主键删除前必须删除自增长才能删除成功
  alter table Posts change id id int;删除自增长
  alter table Posts drop primary key;删除主键
  3.增加外键,外键删除
  alter table Categories add constraint fk_flag foreign key(user_id) references Users(id);增加外键
  alter table Categories drop foreign key fk_flag;删除外键

6 .如何开启和关闭MySQ服务
  写的好啊,Inb哥,我是废物

7 .检测端口是否运行
  写的好啊,Inb哥,我是废物

8 .如何为MySQL设置密码或者修改密码
  写的好啊,Inb哥,我是废物

9 .如何登录MySQL数据库
  写的好啊,Inb哥,我是废物

10 .查看当前数据库的字符集
  一、查看MySQL数据库服务器和数据库MySQL字符集。
  mysql> show variables like ‘%char%’;
  二、查看MySQL数据表(table)的MySQL字符集。
  mysql> show table status from sqlstudy_db like ‘%countries%’;
  三、查看MySQL数据列(column)的MySQL字符集。
  mysql> show full columns from countries;

11 .如何查看当前数据库版本
  写的好啊,Inb哥,我是废物

12 .如何查看当前登录的用户
  mysql> select user();
  ±---------------+
  | user() |
  ±---------------+
  | root@localhost |
  ±---------------+
  1 row in set (0.01 sec)

  mysql> select database();
  ±-----------+
  | database() |
  ±-----------+
  | mysql |
  ±-----------+
  1 row in set (0.00 sec)

13 .查看T1数据库中有哪些表
  写的好啊,Inb哥,我是废物

14 .创建GBK字符集的数据库oldboy,并查看已建库完整语句
  mysql> create database oldboy character set gbk collate gbk_chinese_ci;
  mysql> show create database oldboy\G

15 .创建用户oldboy,使之可以管理数据库oldboy
  第一种方法:
  mysql> grant all on oldboy.* to oldboy@’localhost’ identified by ‘123456’;
  mysql> select user,host from mysql.user;
  第二种方法:
  mysql> grant all on oldboy.* to oldboy@’192.168.1.%/255.255.255.0’ identified by ‘123456’;
  mysql> select user,host from mysql.user;
  第三种方法:
  mysql> create user ‘abc’@’localhost’ identified by ‘123456’;
  mysql> grant all on oldboy.* to ‘abc’@’localhost’;

16 .查看创建的用户oldboy拥有哪些权限
  mysql> show grants for oldboy@‘localhost’;

17 .直看当前数据库里有哪些用户
  mysql> select user,host from mysql.user;

18 .如何进入oldboy数据库
  mysql> use oldboy();

19 .请写一个脚本:创建一innodb GBK表 test,字段id int(4)和name varchar(16)
  mysql> create table test (id int(4),name varchar(16)) engine=InnoDB default charset=gbk;

20 .查看建表结构及表结构的SQL语句
  mysql> desc test;
  mysql> show create table test\G

21 .请使用脚本查询一条数据:插入一条数据"1,oldboy"
  mysql> insert into test (id,name) values (1,‘oldboy’);

22 .再批量插入2行数据"2,老男孩’,“3,oldboyedu”
  mysql> insert into test (id,name) values (2,‘老男孩’),(3,‘oldboyedu’);

23 .查询名字为oldboy的记录
  mysql> select * from test where name=‘oldboy’;

24 .把数据id等于1的名字oldboy更改为oIdgirl
  mysql> update test set name=‘oldgirl’ where id=1;

25 .在字段name前插入age字段,类型为tinyint(2)
  mysql> alter table test add age tinyint(2) after id;

26 .不退出数据库,完成备份oldboy数据库
  mysql> system mysqldump -uroot -p123456 -B -x -F --events oldboy >/opt/bak.sql

27 .删除test表中的所有数据,并查看看
  mysql> delete from test;

三.数据库Mysql篇
1 .说一下MySQL的行锁和表锁
  MyISAM 只支持表锁,InnoDB 支持表锁和行锁,默认为行锁。 表级锁:开销小,加锁快,不会出现死锁。锁定粒度大,发生锁冲突的概率最高,并发量最低。 行级锁:开销大,加锁慢,会出现死锁。锁力度小,发生锁冲突的概率小,并发度最高。
2 .MySQL默认事务隔离级别是
  1、未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据
  2、提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)
  3、可重复读(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读,但是innoDB解决了幻读
  4、串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞

3 .Mysq数据库表类型有哪些
  写的好啊,Inb哥,我是废物

4 .MySQL怎么恢复半个月前的数据
  通过整库备份+binlog进行恢复. 前提是要有定期整库备份且保存了binlog日志.详见:写的好啊,Inb哥,我是废物

5 .一张自增表共有7条数据,删给了最后2条数据,重启MySQL数身库,又插入一条数据,此时id是几
  一般情况下,我们创建的表的类型是InnoDB,如果新增一条记录(不重启mysql的情况下),这条记录的id是8;但是如果重启(文中提到的)MySQL的话,这条记录的ID是6。因为InnoDB表只把自增主键的最大ID记录到内存中,所以重启数据库或者对表OPTIMIZE操作,都会使最大ID丢失。
  但是,如果我们使用表的类型是MylSAM,那么这条记录的ID就是8。因为MylSAM表会把自增主键的最大ID记录到数据文件里面,重启MYSQL后,自增主键的最大ID也不会丢失。
  注:如果在这7条记录里面删除的是中间的几个记录(比如删除的是3,4两条记录),重启MySQL数据库后,insert一条记录后,ID都是8。因为内存或者数据库文件存储都是自增主键最大ID

6 .MySQL的内连接.左连接、右连接有什么区别
  1.内连接,显示两个表中有联系的所有数据;
  2.左链接,以左表为参照,显示所有数据;
  3.右链接,以右表为参照显示数据;

7 .MySQL问题排查有哪些手段
  写的好啊,Inb哥,我是废物

8 .如何做MySQL的性能优化
  写的好啊,Inb哥,我是废物

9 .MySQL数据库作发布系统的存储,一曰五万条以上的增量,预计运维三年,怎么优化
  (1)设计良好的数据库结构,允许部分数据冗余,尽量避免join查询,提高效率。
  (2) 选择合适的表字段数据类型和存储引擎,适当的添加索引。
  (3) 做mysql主从复制读写分离。
  (4)对数据表进行分表,减少单表中的数据量提高查询速度。
  (5)添加缓存机制,比如redis,memcached等。
  (6)对不经常改动的页面,生成静态页面(比如做ob缓存)。
  (7)书写高效率的SQL。比如 SELECT * FROM TABEL 改为 SELECT field_1, field_2, field_3 FROM TABLE.

10 .MySQl由哪些部分组成,分别用来做什么
  1、Server
  2、连接器: 管理连接, 权限验证
  3、分析器: 词法分析, 语法分析
  4、优化器: 执行计划生成, 索引的选择
  5、执行器: 操作存储引擎, 返回执行结果
  6、存储引擎: 存储数据, 提供读写接口
在这里插入图片描述

11 .怎么验证MySQL的索引是否满足需求
  使用 explain 查看 SQL 是如何执行查询语句的,从而分析你的索引是否满足需求。 explain 语法:explain select * from table where type=1。

12 .请你介绍一下mysql的主从复制
  写的好啊,Inb哥,我是废物

13 .请你介绍一下mysql的MVCC机制
  MVCC是一种多版本并发控制机制,是MySQL的InnoDB存储引擎实现隔离级别的一种具体方式,用于实现提交读和可重复读这两种隔离级别。MVCC是通过保存数据在某个时间点的快照来实现该机制,其在每行记录后面保存两个隐藏的列,分别保存这个行的创建版本号和删除版本号,然后Innodb的MVCC使用到的快照存储在Undo日志中,该日志通过回滚指针把一个数据行所有快照连接起来。

14 .常用的Mysql复制架构有哪些
  写的好啊,Inb哥,我是废物

15 .Mysql的存储引擎,myisam和innodb的区别
  写的好啊,Inb哥,我是废物

16 .请问MySQ端口号是多少,如何修改这个端口号
  查看端口号:
  使用命令show global variables like ‘port’;查看端口号 ,mysql的默认端口是3306。(补充:sqlserver默认端口号为:1433;oracle默认端口号为:1521;DB2默认端口号为:5000;PostgreSQL默认端口号为:5432)
  修改端口号:
  修改端口号:编辑/etc/my.cnf文件,早期版本有可能是my.conf文件名,增加端口参数,并且设定端口,注意该端口未被使用,保存退出。

17 .Mysql如何为表字段添加索引
  1.添加PRIMARY KEY(主键索引):
  ALTER TABLE table_name ADD PRIMARY KEY ( column )
  2.添加UNIQUE(唯一索引) :
  ALTER TABLE table_name ADD UNIQUE ( column )
  3.添加INDEX(普通索引) :
  ALTER TABLE table_name ADD INDEX index_name ( column )
  4.添加FULLTEXT(全文索引) :
  ALTER TABLE table_name ADD FULLTEXT ( column)
  5.添加多列索引:
  ALTER TABLE table_name ADD INDEX index_name ( column1, column2, column3 )

18 .说说自己对子MySQL常见的两种存储引擎myisam和innodb的理解
  InnoDB 引擎:InnoDB 引擎提供了对数据库 acid 事务的支持,并且还提供了行级锁和外键的约束,它的设计的目标就是处理大数据容量的数据库系统。MySQL 运行的时候,InnoDB 会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎是不支持全文搜索,同时启动也比较的慢,它是不会保存表的行数的,所以当进行 select count() from table 指令的时候,需要进行扫描全表。由于锁的粒度小,写操作是不会锁定全表的,所以在并发度较高的场景下使用会提升效率的。

  MyIASM 引擎:MySQL 的默认引擎,但不提供事务的支持,也不支持行级锁和外键。因此当执行插入和更新语句时,即执行写操作的时候需要锁定这个表,所以会导致效率会降低。不过和 InnoDB 不同的是,MyIASM 引擎是保存了表的行数,于是当进行 select count() from table 语句时,可以直接的读取已经保存的值而不需要进行扫描全表。所以,如果表的读操作远远多于写操作时,并且不需要事务的支持的,可以将 MyIASM 作为数据库引擎的首选。

注:欢迎在评论区指正错误

  • 6
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

软泡芙

给爷鞠躬!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值