drf——Request源码分析、序列化组件、序列化类的使用(字段类和参数)、反序列化校验和保存

1.Request类源码分析

# APIView+Response写个接口

# 总结:
	1.新的request有个data属性,以后只要是在请求body体中的数据,无论什么编码格式,无论什么请求方式
    2.取文件还是从:request.FILES
    3.取其他属性,跟之前完全一样 request.method ....
    	原理:新的request重写了__getattr__,通过反射获取老的request中的属性
    4.request.GET 现在可以使用request.query_params
    	@property
        def query_params(self):
            return self._request.GET
			
# 源码中找出来 
	老的request在新的request._request
    照常理来讲,如果取method,应该request._request.method,但是我现在可以request.method
        
# 补充
魔法方法之__getattr__,对象.属性 当属性不存在是,会触发类中__getattr__的执行
# get请求能不能在body体中带数据
	能!

2.序列化组件介绍

1. 序列化,序列化器会把模型对象(queryset,单个对象)转换成字典,经过response以后变成json字符串
2. 反序列化,把客户端发送过来的数据,经过request.data以后变成字典,序列化器可以把字典转成模型
3. 反序列化,完成数据校验功能

3.序列化类的基本使用

# 1 创建book表模型
# 2 写查询所有图书的接口:APIVie+序列化类+Response

3.1查询所有和查询单条

views.py中

class BookView(APIView):
    def get(self,request):
        book_list = Book.objects.all()
        # 使用序列化类,完成序列化 两个很重要参数:instance:(实例,对象) data:数据
        # 如果是多条many=True 如果是queryset对象 就要写
        # 如果是单个对象many=False 或者可以不写 默认是False
        serializer = BookSerializer(instance=book_list,many=True)
        # serializer.data 把queryset对象转成列表套字典 ReturnList
        return Response({'code':100,'msg':'成功','data':serializer.data})

class BookDetailView(APIView):
    def get(self,request,pk):
        book = Book.objects.get(pk=pk)
        serializer = BookSerializer(instance=book,many=False)
        return Response({'code':100,'msg':'成功','data':serializer.data})

urls.py中

urlpatterns = [
    path('books/', views.BookView.as_view()),
    path('books/<int:pk>/', views.BookDetailView.as_view()),
]

序列化类

from rest_framework import serializers

class BookSerializer(serializers.Serializer):
    # 要序列化的字段
    id = serializers.IntegerField()
    name = serializers.CharField()
    price = serializers.IntegerField()

总结

# 序列化类的使用
1.写一个类 继承serializers.Serializer
2.在类中写字段,要序列化的字段
3.在视图类中使用:(多条,单条)
    serializer = BookSerializer(instance=book_list, many=True)
    serializer = BookSerializer(instance=book)

4.常用字段类和参数(了解)

4.1常用字段类

字段 字段构造方式
BooleanField BooleanField()
NullBooleanField NullBooleanField()
CharField CharField(max_length=None, min_length=None, allow_blank=False, trim_whitespace=True)
EmailField EmailField(max_length=None, min_length=None, allow_blank=False)
RegexField RegexField(regex, max_length=None, min_length=None, allow_blank=False)
SlugField SlugField(maxlength=50, min_length=None, allow_blank=False) 正则字段,验证正则模式 [a-zA-Z0-9-]+
URLField URLField(max_length=200, min_length=None, allow_blank=False)
UUIDField UUIDField(format=’hex_verbose’) format: 1) 'hex_verbose'"5ce0e9a5-5ffa-654b-cee0-1238041fb31a" 2) 'hex'"5ce0e9a55ffa654bcee01238041fb31a" 3)'int' - 如: "123456789012312313134124512351145145114" 4)'urn' 如: "urn:uuid:5ce0e9a5-5ffa-654b-cee0-1238041fb31a"
IPAddressField IPAddressField(protocol=’both’, unpack_ipv4=False, **options)
IntegerField IntegerField(max_value=None, min_value=None)
FloatField FloatField(max_value=None, min_value=None)
DecimalField DecimalField(max_digits, decimal_places, coerce_to_string=None, max_value=None, min_value=None) max_digits: 最多位数 decimal_palces: 小数点位置
DateTimeField DateTimeField(format=api_settings.DATETIME_FORMAT, input_formats=None)
DateField DateField(format=api_settings.DATE_FORMAT, input_formats=None)
TimeField TimeField(format=api_settings.TIME_FORMAT, input_formats=None)
DurationField DurationField()
ChoiceField ChoiceField(choices) choices与Django的用法相同
MultipleChoiceField MultipleChoiceField(choices)
FileField FileField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)
ImageField ImageField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)
ListField ListField(child=, min_length=None, max_length=None)
DictField DictField(child=)
# IntegerField      CharField   DateTimeField  DecimalField

# ListField和DictField---》比较重要,但是后面以案例形式讲

4.2字段参数(校验数据来用的)

选项参数:

参数名称 作用
max_length 最大长度
min_lenght 最小长度
allow_blank 是否允许为空
trim_whitespace 是否截断空白字符
max_value 最小值
min_value 最大值

通用参数:

参数名称 说明
read_only 表明该字段仅用于序列化输出,默认False
write_only 表明该字段仅用于反序列化输入,默认False
required 表明该字段在反序列化时必须输入,默认True
default 反序列化时使用的默认值
allow_null 表明该字段是否允许传入None,默认False
validators 该字段使用的验证器
error_messages 包含错误编号与错误信息的字典
label 用于HTML展示API页面时,显示的字段名称
help_text 用于HTML展示API页面时,显示的字段帮助提示信息
# read_only   write_only   很重要,后面以案例讲

5.反序列化之校验

# 反序列化,有三层校验
	1.字段自己写的(写的字段参数:required max_length)
    2.局部钩子:写在序列化类中的方法,方法名必须是 validate_字段名
        def validate_name(self,name):
            if 'sb' in name:
                # 不合法 抛异常
                raise ValidationError('书名中不能包含sb')
            else:
                return name
     3.全局钩子:写在序列化类中的方法 方法名必须是 validate
        def validate(self,attrs):
            price = attrs.get('price')
            name = attrs.get('name')
            if name == price:
                raise VilidationError('价格不能等于书名')
            else:
                return attrs
    # 只有三层都通过 在视图类中:
    	ser.is_valid(): 才是True,才能保存

6.反序列化之保存

# 新增接口:
	序列化类的对象,实例化的时候:ser = BookSerializer(data=request.data)
    数据校验过后--->调用 序列化类.save() ---> 但是要在序列化类中重写 create方法
    	def create(self,validated_data):
            # validated_data校验过后的数据,字典
            book=Book.objects.create(**validated_data)
            return book
        
# 修改接口
	序列化类的对象 实例化的时候:ser = BookSerializer(instance=book,data=request.data)
    数据校验过后----》调用 序列化类.save()--->但是要在序列化类中重写  update方法
    	def update(self,book,validated_data):
            for item in validated_data: # {"name":"jinping","price":55}
                setattr(book,item,validated_data[item])
                # 等同于下面
                # setattr(book,'name','jinping')
                # setattr(book,'price',55)
                # 等同于
                # book.name = validated_data.get('name')
                # book.price = validated_data.get('price')
            book.save()
            # 一定不要忘了
            return book
        
# 研究了一个问题
	在视图类中,无论是保存还是修改,都是调用序列化类.save(),底层实现是根据instance做一个判断 看是否有instance参数传入

7.增删改查5个接口

表模型

点击查看代码
from django.db import models

class Book(models.Model):
    name = models.CharField(max_length=32)
    price = models.BigIntegerField()

路由

点击查看代码
urlpatterns = [
    path('books/', views.BookView.as_view()),
    path('books/<int:pk>/', views.BookDetailView.as_view()),
]

视图

点击查看代码
from .models import Book
from .serialiazer import BookSerialiazer

class BookView(APIView):
    # 查所有
    def get(self,request):
        book_list = Book.objects.all()
        # 使用序列化类,完成序列化 两个很重要的参数:instance(实例,对象) data:数据
        # 如果是多条数据 many=True 如果是queryset对象就要写
        # 如果是单个对象 many=False,默认是False
        serializer = BookSerializer(instance=book_list,many=True)
        # serializer.data # 把queryset对象,转成列表套字典 ReturnList
        return Response({'code':100,'msg':'成功','data':serializer.data})
    
    # 新增
    def post(self,request):
        # 前端会传入数据到request.data ---> 把这个数据保存到数据库中
        # 借助于序列化类 完成校验和反序列化
        # data前端传入的数据 {"name":"三国演义","price":88}
        ser  = BookSerializer(data=request.data)
        # 校验数据
        if ser.is_valid():  # 三层:字段自己的校验-->局部钩子校验-->全局钩子校验
            # 校验通过 保存
            print(ser.validated_data)  # validated_data:校验过后的数据
            # 如果没有save,如何保存,自己做
            # Book.objects.create(**validated_data)
            ser.save()  # 会保存,但是会报错 因为它不知道你要保存到哪个表中
            return Response({'code': 100, 'msg': '新增成功'})
        else:
            print(ser.errors)  # 校验失败的错误
            return Response({'code': 101, 'msg': '新增失败', 'errors': ser.errors})
        
class BookDetailView(APIView):
    # 查找单条数据
    def get(self,request,pk):
        book = Book.objects.all().get(pk=pk)
        serializer = BookSerializer(instance=book)
        return Response({'code': 100, 'msg': '成功', 'data': serializer.data})
    
    def put(self,request,pk):
        # 修改单条数据
        book = Book.objects.get(pk=pk)
        ser = BookSerializer(instance=book,data=request.data)
        if ser.is_valid():
            ser.save()  # 也会报错 重写update
            return Response({'code': 100, 'msg': '修改成功'})
        else:
            return Response({'code': 101, 'msg': '修改失败', 'errors': ser.errors})

序列化类

点击查看代码
# from rest_framework.serializers import Serializer
from rest_framework import serializers

from rest_framework.exceptions import ValidationError
from .models import Book

class BookSerializer(serializers.Serializer):
    # 要序列化的字段
    id = serializer.IntegerField(required=False)  # 前端传入数据,可以不填这个字段
    name = serializers.CharField(allow_blank=True,required=False,max_length=8,min_length=3,error_messages={'max_length':'太长了'})  # allow_blank:这个字段传了,value值可以为空
    price = serializers.IntegerField(max_value=100, min_value=10,error_messages={'max_value': '必须小于100'})
    
'''局部钩子:给某个字段做个校验'''
# 书名中不能包含sb
# validate_字段名
def validate_name(self,name):
    if 'sb' in name:
        # 不合法,抛异常
        raise ValidationError('书名中不能包含sb')
    else:
        return name
  
def validate_price(self,item):
    if item == 88:
        raise ValidationError('价格不能等于88')
    else:
        return item
    
'''全局钩子'''
# 价格和书名不能一样  validate
def validate(self,attrs):
    price = attrs.get('price')
    name = attrs.get('name')
    if name == price:
        raise ValidationError('价格不能等于书名')
    else:
        return attrs
    
def create(self,validated_data):
    # validated_data校验过后的数据 字典
    book = Book.objects.create(**validated_data)
    return book

def update(self,instance,validated_data):
    # instance ---> 要修改的对象
    # validated_data ---> 前端传入 并且校验过后的数据
    for key in validated_data:
        setattr(instance,item,validated_data[key])
        """
        等同于下面
        setattr(instance,'name','jinping')
        setattr(instance,'price',55)
        等同于下面
        instance.name = validated_data.get('name')
        instance.price = validated_data.get('price')
        """
    instance.save() # 一定不要忘记save()
    return instance    
本文转载于网络 如有侵权请联系删除

相关文章

  • 中断操作:AbortController学习笔记

    前端面试一般喜欢问:请手写一个带取消功能的延迟函数,axios取消功能的原理是什么?如何中断请求fetch的原理分析和应用?在看来《使用AbortController终止fetch请求》,觉得写的非常详细,于是提炼下笔记: AbortController背景介绍在现在的浏览器中,有两种主要的方法发送请求:XMLHttpRequest和fetch。XMLHttpRequest这个接口在浏览器中存在很长一段时间了,fetch则是ES2015引入的特性。XMLHttpRequest可以在请求中途终止(abortable)。举个例子let xhr = new XMLHttpRequest(); xhr.method = 'GET'; xhr.url = 'https://slowmo.glitch.me/5000'; xhr.open(method, url, true); xhr.send(); // Abort the request at a later stage abortButton.addEventListener('click

  • MySQL 8.0 如何创建一张规范的表

    这一节内容,基于MySQL8.0版本,聊一下如何创建一张规范的表。首先贴出一张相对规范的表结构:CREATETABLEstudent_info( `id`INTNOTNULLAUTO_INCREMENTCOMMENT'主键', `stu_name`VARCHAR(10)NOTNULLDEFAULT''COMMENT'姓名', `stu_class`VARCHAR(10)NOTNULLDEFAULT''COMMENT'班级', `stu_num`INTNOTNULLDEFAULT'0'COMMENT'学号', `stu_score`SMALLINTUNSIGNEDNOTNULLDEFAULT'0'COMMENT'总分', `tuition`DECIMAL(5,2)NOTNULLDEFAULT'0'COMMENT'学费', `phone_number`VARCHAR(20)

  • C++ OpenCV4.5版本SIFT特征检测及匹配

    学更好的别人,做更好的自己。——《微卡智享》本文长度为2739字,预计阅读6分钟前言关于SIFT的特征点检测在《C++OpenCV特征提取之SIFT特征检测》有介绍过,在OpenCV4.5版本中SIFT做是算法优化,也移到主仓库中了,并且有朋友也留言问了4.5版本下的DEMO。所以这篇就做一下OpenCV4.5版本的SIFT特征点检测及匹配。 实现效果两张原图 匹配的效果代码实现微卡智享#实现流程1定义检测的特征点个数,用SIFT进行特征检测2对检测完的两个图做特征向量的提取3使用BFMatch进行匹配,筛选出好的结果4画出匹配的特征点01SIFT特征检测以前版本中使用SIFT需要引入xfeatures2d.hpp,而现在就不用了。 旧版本 新版本 02特征向量的提取接下来就是计算特征点描述符,特征向量的提取特征向量提取 03使用BFMatch匹配提取完特征向量后,对两个特征向量进行匹配,然后通过匹配的结果计算出向量的最大和最小距离。 特征匹配及计算最大最小距离04筛选好的匹配结果最后就是根据最大最小的距离,从匹配的点中筛选出好的结果,再展示出来。 筛选结果绘制图像完整代码#inclu

  • 网页视频会议背景实时替换。Google Meet背后的技术揭秘

    一种新的浏览器内ML解决方案,用于模糊和替换GoogleMeet中的背景。效果出色毫无PS痕迹,且在低端设备上实现了实时性能和低功耗。作者:TingboHouandTylerMullen(GoogleResearch)编译:McGL视频会议在人们的工作和个人生活中变得越来越重要。通过增强隐私或有趣的视觉功能来改善体验,可以帮助我们将注意力集中在会议本身上。作为这个目标的一部分,我们最近发布了在GoogleMeet中模糊和替换背景的方法,它使用机器学习来更好地突出参与者,而不管他们周围的环境如何。其他的解决方案需要安装额外的软件,而Meet的功能则是基于使用MediaPipe构建的尖端webML技术,这些技术可以直接在你的浏览器中工作,而不需要额外的步骤。开发这些特性的一个关键目标是在几乎所有的现代设备上提供实时的、浏览器内的性能,我们通过结合高效的设备内ML模型、基于WebGL的渲染以及基于XNNPACK和TFLite的网页ML推理来实现这一目标。背景模糊和背景替换,由MediaPipe网页提供支持我们的网页机器学习方案概述Meet的新功能是通过MediaPipe开发的,MediaPi

  • 系统脚本执行类命令一览

    [TOC]CScript命令描述:cscript(即cscript.exe)一般位于C:/Windows/System32文件夹中,有些时候我们可能需要在Windows中执行脚本文件通常具有以下扩展名之一:.wsf、.vbs、.js; 当然,一般情况下,双击这些脚本文件并不会直接执行,而仅仅只是以关联的文本编辑器打开该脚本文件如果我们想要在Windows上执行这些脚本文件,我们可以使用Windows自带的cscript命令行工具csript.exe基础语法: CScriptscriptname.extension[option...][arguments...] #选项: //B        批模式:不显示脚本错误及提示信息 //D        启用ActiveDebugging //E:engine 使用执行脚本的引擎 //H:CScript将默认的脚本宿主改为CScript.exe //H:WScript将默认的脚本宿主改为WScript.exe(默认) //I        交互模式(默认,与//B相对) //Job:xxxx 执行一个WSF工作 //Logo     显示徽

  • 【项目实战】自监控-08-DataFrame行列操作(下篇)

    系统:Windows7 语言版本:Anaconda3-4.3.0.1-Windows-x86_64 编辑器:pycharm-community-2016.3.2这个系列主要是实际在做项目的一个笔记自监控项目,主要是对采集的质量监控数据做的一个实时预警今天继续讲讲如何从DataFrame获取需要到的行或者列主要涉及:ix,at,iat,get_value今日歌曲:Part1:构建一个DataFrame一个DataFrame可以看成一个二维表格,不过这个二维表格有行标题也有列标题,而且每类标题可能不止一级示例中由一个字典构建一个DataFrame通过index参数制定行名称importpandasaspddict1={"a":[1,3,5,6],"b":[11,12,15,16], "c":[22,27,29,30],"d":[82,87,89,80]}df=pd.DataFrame(dict1,index=["x","y","z","q&q

  • Java|怎样快速搭建一个spring boot项目

    当我在网站搭建学习到一定阶段的时候,我们就会学习到springboot框架,我们怎么利用IDEA快速搭建一个springboot项目呢?前期准备springboot环境准备我们在springboot项目的搭建时,我们一定要提前配置好环境变量,我们第一步就是安装JDK,建议大家安装1.8及以上版本,大家也可以根据自己的操作系统配置合适的安装包。 1.新建变量名:JAVA_HOME变量值:jdk安装路径,如:D:\ProgramFiles\Java\jdk-122.新建变量名:CLASSPATH变量值:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar3.编辑变量名:Path变量值:在原有的值后面加上:;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin4、打开命令提示符输入java,javac,java-version命令如出现以下字样则JDK安装成功。2.2安装IntelliJIDEA在IntelliJIDEA官网就可以免费下载该软件,百度激活码对软件进行激活。安装软件我就不再多说2.3安装ApacheMavenApacheMav

  • vCenter 通过模板部署虚拟机

    部署vSphere的目的就是在上面运行虚拟机,从而实现服务器虚拟化,然而一台一台的新建虚拟机明显非常麻烦,所以需要通过克隆更加便捷的部署虚拟机,也可以达到一定备份的效果,副本虚拟机具有原始虚拟机相同的虚拟硬件、已安装的软件及其他属性。 VCenter支持两种类型的克隆:完整克隆和链接克隆。 1、完整克隆是和原始虚拟机完全独立的一个备份,他不和原始虚拟机共享任何资源,可以脱离原始虚拟机单独使用。 2、链接克隆需要和原始虚拟机共享同一虚拟磁盘文件,不能脱离原始虚拟机独立运行。但是采用共享磁盘文件能大大缩短创建克隆虚拟机的时间,同时还可以节约宝贵的物理磁盘空间。通过链接克隆可以轻松地为不同的任务创建一个独立的虚拟机。 案例环境: 克隆虚拟机需要存储在外部共享存储设备中,所以需要将虚拟机转到共享设备,可以参考之前写过的一篇文章: https://blog.51cto.com/14227204/2419879 参照文章做到迁移之前即可。 前面一点是说的有点啰嗦无用,屏幕前的阅读者不想看的话可以直接翻到下面看模板部署。 首先,将虚拟机文件转入外部共享设备中: 转移完成后开始克隆: 这里我克隆

  • Groovy-15.DSLS

    “命令链”功能:允许在顶层语句的方法调用的参数周围省略括号。也就是在参数周围不需要括号,也不需要链接调用之间的点号。 DSL(DomainSpecificLanguages领域定义语言)以简化代码,Groovy中的DSL:classEmailDsl{ StringtoText StringfromText Stringbody /** *ThismethodacceptsaclosurewhichisessentiallytheDSL.Delegatethe *closuremethodsto *theDSLclasssothecallscanbeprocessed */ defstaticmake(closure){ EmailDslemailDsl=newEmailDsl() //anymethodcalledinclosurewillbedelegatedtotheEmailDslclass closure.delegate=emailDsl closure() } /** *Storetheparameterasavariableanduseitlatertooutput

  • Swift实践:使用CoreData完成一个通讯录存储

    CoreData作为Apple的亲儿子,依然在App需要存储结构化数据上发挥着重要的作用。CoreData已经超过十年了,而且亲爹还在积极的维护着它。image.png在Monster、Indeed这些海外主流招聘网站看一下iOS的职位,基本上都会大大写着要求会熟练使用CoreData。然而这么一个成熟,被实践检验过的代码库反而在国内使用并不是特别多。FMDB、Realm等等在被广泛使用。经常在面试的时候问iOSer是不是了解数据库,回答都是了解。再一细问,很多人也都是只使用到了FMDB,对于CoreData却是了解甚少。后来想了想,可能是因为CoreData的入门成本有点高,而且相关的中文资料比较少的缘故吧。为了写这个系列,还专门买来了objc.io的CoreData这本书。读完之后受益匪浅。这个系列要写多少篇还没有想好,大概也还是会从基本到高级的一个过渡。第一篇通过一个通讯录实现数据库的读取。第二篇会存储更多类型的数据。最终实现结果:CoreDataDemo.gif1.CoreData架构一个基本的CoreData栈由四个主要部分组成:托管对象(NSManagedObject),托

  • 金融界福利来袭:《数据驱动金融升级,商业价值落地探寻调研报告》正式对外发布

    数据猿导读6月29日,由数据猿主办的「数据猿•超声波」之金融科技­商业价值探索高峰论坛在上海龙之梦万丽酒店隆重举办。峰会现场,由慧辰资讯、数据猿及DataPipeline联合编纂的《数据驱动金融升级,商业价值落地探寻调研报告》正式对外发布,以推进金融科技领域的发展与创新。作者|郭建秋6月29日,由数据猿主办的「数据猿·超声波」之金融科技­商业价值探索高峰论坛在上海龙之梦万丽酒店隆重举办。峰会现场,由慧辰资讯、数据猿及DataPipeline联合编纂的《数据驱动金融升级,商业价值落地探寻调研报告》正式对外发布,以推进金融科技领域的发展与创新。HCR慧辰资讯TMT互联网研究部总经理刘赞峰会现场,HCR慧辰资讯TMT互联网研究部总经理刘赞对该报告作了详细解读。以下为报告内容摘要:近年来,随着大数据的飞速发展,数据驱动逐渐成为行业发展的核心竞争力。从报告中为我们呈现的“大数据发展阶段”图中可以看到,随着数据量的累积,以互联网、金融、电信等为代表的可自行产生大数据具有先天优势的行业率先进入大数据2.0阶段。其中金融大数据由于在数据资源及计算能力方面具备的优势条件,发展更为迅速。以银行为代表的金融

  • 洞察|2017年大数据领域的十大趋势

    “大数据”不再只是一个流行词。弗雷斯特研究公司的研究人员发现,“2016年,近40%的公司在实施大数据技术,并且扩大了采用力度。另有30%的公司计划在未来12个月内采用大数据技术。”类似的,NewVantagePartners的《2016年大数据高管调查》发现,如今62.5%的公司在生产环境中至少有一个大数据项目,只有5.4%的企业组织没有计划或开展大数据项目。研究人员表示,采用大数据技术的势头不太可能很快就减慢。IDC主管分析和信息管理的集团副总裁丹·维塞特(DanVesset)说:“出现的大量数据、新一代技术,以及数据驱动型决策的文化转变,这些因素继续促使市场需要大数据和分析技术及服务。预计该市场会以11.7%的复合年增长率继续增长,一直持续到2020年。”虽然大数据市场在增长,但企业组织将如何使用大数据仍不大明朗。新的大数据技术在进入市场,而一些旧技术的使用也在继续增长。本文介绍了在2017年及之后可能左右大数据市场格局的十大趋势。1开源ApacheHadoop和Spark等其他开源应用软件已逐渐主导大数据领域,这个趋势看起来可能会保持下去。一项调查发现,到今年年底,近60%的企

  • 通过硬件计数器,将性能提升3倍之旅

    通过硬件计数器,将性能提升3倍之旅翻译自:Seeingthroughhardwarecounters:ajourneytothreefoldperformanceincrease本文通过对CPU层面的代码挖掘,发现JVM存在的问题,并通过对JVM打补丁的方式解决了大实例下性能不足的问题。在前面的文章中,我们概述了可观测性的三大领域:整体范围,微服务和实例。我们描述了洞察每个领域所使用的工具和技术。然而,还有一类问题需要深入到CPU微体系架构中。本文我们将描述一个此类问题,并使用工具来解决该问题。问题概述问题起始于一个常规迁移。在Netflix,我们会定期对负载进行重新评估来优化可用容量的利用率。我们计划将一个Java微服务(暂且称之为GS2)迁移到一个更大的AWS实例上,规格从m5.4xl(16vCPU)变为m5.12xl(48vCPU)。GS2是计算密集型的,因此CPU就成为了受限资源。虽然我们知道,随着vCPU数量的增长,吞吐量几乎不可能实现线性增长,但可以近线性增长。在大型实例上进行整合可以分摊后台任务产生的开销,为请求留出更多的资源,并可以抵消亚线性缩放。由于12xl实例的vC

  • 实现mypwd

    20175212童皓桢实现mypwd 题目要求 1学习pwd命令 2研究pwd实现需要的系统调用(man-k;grep),写出伪代码 3实现mypwd 4测试mypwd 1.学习pwd命令 Linuxpwd命令用于显示工作目录。 执行pwd指令可立刻得知您目前所在的工作目录的绝对路径名称。 以下是使用man命令查看相关信息 2.研究pwd实现需要的系统调用(man-k;grep),写出伪代码 输入man-kdirectory|grep2,找到相关命令getcwd() 输入mangetcwd查看其信息 伪代码: 调用函数getcwd() if(返回的指针==NULL) 调用函数出错,发出错误报告 else 打印结果 复制 3.实现mypwd #include<stdio.h> #include<unistd.h> intmain(void) { charbuff[256]; getcwd(buff,sizeof(buff)); printf("当前路径为:%s\n",buff); return0; } 复制 4.测试mypwd

  • 2019.7.9 校内测试题 数学问题

     题目   数学问题(math.cpp,1s,128MB) 【问题描述】:   在一个渺无人烟的荒岛上待了xx年之后,小Y基本上啥都不会了。所以当小Z告诉他任何一个大于等于4的偶数都能表示成两个质数的和这个事实的时候,小Y根本不相信!小Y现在想找出一些反例,你能帮助他吗 【输入文件】:    输入文件math.in中仅包含一个整数n。 【输出文件】:   输出文件为math.out。如果n不能表示成两个质数的和,则输出“NOWAY!”; 否则输出一种方案,如果有多种可行方案,输出两个质数差最大的那一种。 【输入输出样例】:   样例1:     math.in       10     math.out       10=3+7   样例2:     math.in       11     math.out       NOWAY! 【数据规模】:   100%的数据中,3≤n≤1,000,000。     考试得分:  100     主要算法 :  质数(欧拉素数筛)     应试策略:   欧拉

  • 「NOI.AC」Leaves 线段树合并

    题目描述 现在有一棵二叉树,所有非叶子节点都有两个孩子。在每个叶子节点上有一个权值(有\(n\)个叶子节点,满足这些权值为\(1\dotsn\)的一个排列)。可以任意交换每个非叶子节点的左右孩子。要求进行一系列交换,使得最终所有叶子节点的权值按照遍历序写出来,逆序对个数最少。 输入 第一行\(n\)表示叶子结点个数 接下来每行一个数\(x\)。如果\(x\)为\(0\),表示这个节点为非叶子节点,递归地向下读入其左孩子和右孩子的信息。如果\(x\)不为\(0\),表示这个节点是叶子节点,权值为\(x\)。 输出 输出一行,表示最少逆序对个数。 样例输入 3 0 0 3 1 2 复制 样例输出 1 复制 数据范围 对于前\(10\%\)的数据,\(n\leq20\) 对于前\(30\%\)的数据,\(n\leq2000\) 对于\(100\%\)的数据,\(n\leq200000\) 题解 线段树合并对我来说还是一个新的算法呢\(Ou\O\)。 首先进行简单分析,发现某一个非叶子节点是否交换无法影响到父亲及以上的节点产生的逆序对,只需要计算出每一个非叶子节点子树内交换与否产生的最小逆序对

  • Oracle笔记

    内容整理在GitHub,地址https://github.com/Muscleape/TestDemoProjects 1、Oracle的JDBC连接方式:oci和thin 相同点: Oracle提供,Java访问Oracle数据库的方式; 驱动类别不同(SUN定义的四种JDBC驱动程序标准),但是在功能上没有差异; 不同点: thin(forthinclient) 一种瘦客户端连接方式,即不需要安装Oracle客户端,要求classpath中包含jdbc驱动的jar包 纯粹用Java写的Oracle数据库访问接口; 纯Java实现tcp/ip的c/s通讯; 是四类驱动; oci(OracleCallInterface) 一种胖客户端连接方式,即需要安装Oracle客户端(Oracle10.1.0开始单独提供OCIInstantClient,不用完整安装Client); 通过nativejavamethod调用clibrary(OCI,Oraclecallinterface)访问服务端; 是二类驱动; 2、Oracle中thin有3中连接方式 Oracle

  • ✍61 OneDrive链接无法访问解决

    OneDrive链接无法打开解决 进入C:\Windows\System32\drivers\etc目录 修改hosts文件,某位添加两行DNS配置 13.107.42.13onedrive.live.com 13.107.42.12skyapi.onedrive.live.com 复制 打开CMD窗口刷新DNS ipconfig/flushdns 复制

  • R 语言解压目录下的所有gz文件

      setwd("GSE29431_RAW")#进入目录复制 fileNames<-list.files()#获取目录下的所有文件sapply(fileNames,gunzip)#进行解压操作,fileNames是一个向量,gunzip是解压缩的函数,sapply()会依次将fileNames中的元素应用gunzip函数复制

  • kubernetes ingress 在物理机上的nodePort和hostNetwork两种部署方式解析及比较

    ingresscontroller在物理机上的两种部署方式 ingresscontroller(ingress-nginx)负责k8s中的7层负载均衡。其在物理机中有多种部署方式。本文中主要选择了nodePort和hostNetwork两种部署方式进行介绍。主要原因是这两种部署方式不需要借助于其他组件,直接使用的是k8s的基础组件和使用方式,较为容易理解和排障。 注:本文中的kube-proxy使用的是iptables 本文使用的ingress-nginx的commit版本是51ad0bc54b1475384b67bee9e8a8e41e26b18bc4。该版本的部署方式是在NGINX:0.24.1版本后重构了deploy文件夹中的ingress-nginx的部署相关文件。采用了kustomize进行部署配置。因此推荐使用kubectl1.14以上的版本。且特别注意,下面的命令都是使用了kubectlapply-k的方式运行,而不是-f参数。 deploy各个文件夹走读 ingress-nginx项目deploy文件夹下有多个文件夹,为不同的环境提供支持。这里我们主要介绍的是与在物

  • 小程序前端

    wx.getSystemInfo({success:function(res){//获取可使用窗口宽度letclientHeight=res.windowHeight;//获取可使用窗口高度letclientWidth=res.windowWidth;//算出比例letratio=750/clientWidth;//算出高度(单位rpx)letheight=clientHeight*ratio;//设置高度that.setData({height:height});}});

相关推荐

推荐阅读