月度归档: 2021 年 3 月

javascript中的Strict模式

javascript中的Strict模式

 

看动画学算法
以动画的方式,图文并茂讲解常用的算法和数据结构,包括各种排序算法、hash、栈、队列、链表、树、散列表、堆、图等,*对物有所值!
flydean程序那些事
¥39.90
订阅博主
文章目录
简介
使用Strict mode
strict mode的新特性
强制抛出异常
简化变量的使用
简化arguments
让javascript变得更加安全
保留关键字和function的位置
总结
简介
我们都知道javascript是一个弱类型语言,在ES5之前,javascript的程序编写具有很强的随意性,我可以称之为懒散模式(sloppy mode)。比如可以使用未定义的变量,可以给对象中的任意属性赋值并不会抛出异常等等。

在ES5中,引入了strict模式,我们可以称之为严格模式。相应的sloppy mode就可以被称为非严格模式。

严格模式并不是非严格模式的一个子集,相反的严格模式在语义上和非严格模式都发生了一定的变化,所以我们在使用过程中,一定要经过严格的测试。以保证在严格模式下程序的执行和非严格模式下的执行效果一致。

使用Strict mode
strict mode会改变javascript的一些表现,我们将会在下一节中进行详细的讲解。

这里先来看一下,怎么使用strict mode。

Strict mode主要用在一个完整的脚本或者function中,并不适用于block {}。 如果在block中使用strict mode是不会生效的。

除此之外,eval中的代码,Function代码,event handler属性和传递给WindowTimers.setTimeout()的string都可以看做是一个完整的脚本。我们可以在其中使用Strict mode。

如果是在script脚本中使用strict模式,可以直接在脚本的*上面加上”use strict”:

// 整个脚本的strict模式
‘use strict’;
var v = “Hi! I’m a strict mode script!”;
同样的我们也可以在function中使用strict模式:

function strict() {
// 函数的strict模式
‘use strict’;
function nested() { return ‘And so am I!’; }
return “Hi! I’m a strict mode function! ” + nested();
}
function notStrict() { return “I’m not strict.”; }

如果使用的是ES6中引入的modules,那么modules中默认就已经是strict模式了,我们不需要再额外的使用”use strict”:

function myModule() {
// 默认就是strict模式
}
export default myModule;
strict mode的新特性
strict mode在语法和运行时的表现上面和非严格模式都发生了一定的变化,接下来,我们一一来看。

强制抛出异常
在js中,有很多情况下本来可能是错误的操作,但是因为语言特性的原因,并没有抛出异常,从而导致*终运行结果并不是所期待的。

如果使用strict模式,则会直接抛出异常。

比如在strict模式中,不允许使用未定义的全局变量:

‘use strict’;

globalVar = 10; //ReferenceError: globalVar is not defined
这样实际上可以避免手误导致变量名字写错而导致的问题。

我再看一些其他的例子:

‘use strict’;

// 赋值给不可写的全局变量,
var undefined = 5; // throws a TypeError
var Infinity = 5; // throws a TypeError

// 赋值给不可写的属性
var obj1 = {};
Object.defineProperty(obj1, ‘x’, { value: 42, writable: false });
obj1.x = 9; // throws a TypeError

// 赋值给一个get方法
var obj2 = { get x() { return 17; } };
obj2.x = 5; // throws a TypeError

// 赋值给一个禁止扩展的对象
var fixed = {};
Object.preventExtensions(fixed);
fixed.newProp = ‘ohai’; // throws a TypeError

Strict模式可以限制删除不可删除的属性,比如构造函数的prototype:

‘use strict’;
delete Object.prototype; // throws a TypeError

禁止对象和函数参数中的重复属性:

‘use strict’;
var o = { p: 1, p: 2 }; // Duplicate declaration

function sum(a, a, c) { // Duplicate declaration
‘use strict’;
return a + a + c;
}
禁止设置基础类型的属性:

(function() {
‘use strict’;

false.true = ”; // TypeError
(14).sailing = ‘home’; // TypeError
‘with’.you = ‘far away’; // TypeError

})();

简化变量的使用
使用Strict模式可以简化变量的使用,让程序代码可读性更强。

首先,strict模式禁止使用with。

with很强大,我们可以通过将对象传递给with,从而影响变量查找的scope chain。也就是说当我们在with block中需要使用到某个属性的时候,除了在现有的scope chain中查找之外,还会在with传递的对象中查找。

with (expression)
statement

使用with通常是为了简化我们的代码,比如:

var a, x, y;
var r = 10;

with (Math) {
a = PI * r * r;
x = r * cos(PI);
y = r * sin(PI / 2);
}

上面的例子中,PI是Math对象中的变量,但是我们可以在with block中直接使用。有点像java中的import的感觉。

下面的例子将会展示with在使用中的问题:

function f(x, o) {
with (o) {
console.log(x);
}
}
们在with block中输出x变量,从代码可以看出f函数传入了一个x变量。但是如果with使用的对象中如果也存在x属性的话,就会出现意想不到的问题。

所以,在strict模式中,with是禁止使用的。

其次是对eval的改动。

传统模式中,eval中定义的变量,将会自动被加入到包含eval的scope中。我们看个例子:

var x = 17;
var evalX = eval(“var x = 42; x;”);
console.log(x);

因为eval中引入了新的变量x,这个x的值将会覆盖*开始定义的x=17. *后我们得到结果是42.

如果加入use strict,eval中的变量将不会被加入到现有的Scope范围中,我们将会得到结果17.

var x = 17;
var evalX = eval(“‘use strict’; var x = 42; x;”);
console.log(x);
这样做的好处是为了避免eval对现有程序逻辑的影响。

在strict模式下面,还不允许delete name:

‘use strict’;

var x;
delete x; // !!! syntax error

eval(‘var y; delete y;’); // !!! syntax error~~

简化arguments
在js中,arguments代表的是参数数组,首先在Strict模式下,arguments是不能作为变量名被赋值的:

‘use strict’;
arguments++;
var obj = { set p(arguments) { } };
try { } catch (arguments) { }
function arguments() { }
var f = new Function(‘arguments’, “‘use strict’; return 17;”);

上面执行都会报错。

另外,在普通模式下,arguments是和命名参数相绑定的,并且arguments[0]和arg同步变化,都表示的是*个参数。

但是如果在strict模式下,arguments表示的是真正传入的参数。

我们举个例子:

function f(a) {
a = 42;
return [a, arguments[0]];
}
var pair = f(17);
console.log(pair[0]); // 42
console.log(pair[1]); // 42

上面的例子中,arguments[0]是和命名参数a绑定的,不管f传入的是什么值,arguments[0]的值*后都是42.

如果换成strict模式:

function f(a) {
‘use strict’;
a = 42;
return [a, arguments[0]];
}
var pair = f(17);
console.log(pair[0]); // 42
console.log(pair[1]); // 17

这个模式下arguments[0]接收的是实际传入的参数,我们得到结果17.

在Strict模式下,arguments.callee是被禁用的。通常来说arguments.callee指向的是当前执行的函数,这会阻止虚拟机对内联的优化,所以在Strict模式下是禁止的。

让javascript变得更加安全
在普通模式下,如果我们在一个函数f()中调用this,那么this指向的是全局对象。在strict模式下,这个this的值是undefined。

如果我们是通过call或者apply来调用的话,如果传入的是primitive value(基础类型),在普通模式下this会自动指向其box类(基础类型对应的Object类型,比如Boolean,Number等等)。如果传入的是undefined和null,那么this指向的是global Object。

而在strict模式下,this指向的是传入的值,并不会做转换或变形。

下面的值都是true:

‘use strict’;
function fun() { return this; }
console.assert(fun() === undefined);
console.assert(fun.call(2) === 2);
console.assert(fun.apply(null) === null);
console.assert(fun.call(undefined) === undefined);
console.assert(fun.bind(true)() === true);

为什么会安全呢?这就意味着,在strict模式下,不能通过this来指向window对象,从而保证程序的安全性。

另外,在普通模式下,我们可以通过fun.caller或者fun.arguments来获取到函数的调用者和参数,这有可能会访问到一些private属性或者不安全的变量,从而造成安全问题。

在strict模式下,fun.caller或者fun.arguments是禁止的。

function restricted() {
‘use strict’;
restricted.caller; // throws a TypeError
restricted.arguments; // throws a TypeError
}
function privilegedInvoker() {
return restricted();
}
privilegedInvoker();

保留关键字和function的位置
为了保证JS标准的后续发展,在strict模式中,不允许使用关键字作为变量名,这些关键字包括implements, interface, let, package, private, protected, public, static 和 yield等。

function package(protected) { // !!!
‘use strict’;
var implements; // !!!

interface: // !!!
while (true) {
break interface; // !!!
}

function private() { } // !!!
}
function fun(static) { ‘use strict’; } // !!!

而对于function来说,在普通模式下,function是可以在任何位置的,在strict模式下,function的定义只能在脚本的顶层或者function内部定义:

‘use strict’;
if (true) {
function f() { } // !!! syntax error
f();
}

for (var i = 0; i < 5; i++) {
function f2() { } // !!! syntax error
f2();
}

function baz() { // kosher
function eit() { } // also kosher
}

总结
Strict模式为JS的后续发展和现有编程模式的规范都起到了非常重要的作用。但是如果我们在浏览器端使用的话,还是需要注意浏览器的兼容性,并做好严格的测试。

浅谈分布式数据库

一 分布式数据库出现的场景:

1.单表数据量爆炸,>1000w,>1亿,>10亿,各种数据操作(CRUD)效率很低 。 关系型数据库在大于一定数据量的情况下检索性能会急剧下降。在面对互联网海量数据情况时,所有数据都存于一张表,显然会轻易超过数据库表可承受的数据量阀值。这个单表可承受的数据量阀值,需根据数据库和并发量的差异,通过实际测试获得。

2.单机数据库的瓶颈问题,处理不了高强度io。现代企业程序的瓶颈问题是数据库的瓶颈问题,所以数据库只做存储用,不再使用触发器,事物;

3.为了方便扩展,动态增加数据库节点,保证扩展性好

4.不同业务对应不同业务数据库,即使某个数据库挂了,不影响其他数据库对应的服务使用,服务高可用。

5.数据备份,数据*重要。

 

二 一些基本概念

单库:单机数据库 所有表存在一个库里,

分片(sharding),分片解决扩展性问题,属于水平拆分,引入分片,就引入了数据路由和分区键的概念。分表解决的是数据量过大的问题,分库解决的是数据库性能瓶颈的问题。

分组(group),分组解决可用性问题,分组通常通过主从复制(replication)的方式实现

互联网公司数据库实际软件架构是(大数据量下):又分片,又分组

单纯的分表虽然可以解决数据量过大导致检索变慢的问题,但无法解决过多并发请求访问同一个库,导致数据库响应变慢的问题。所以通常水平拆分都至少要采用分库的方式,用于一并解决大数据量和高并发的问题。这也是部分开源的分片数据库中间件只支持分库的原因。

​ 但分表也有不可替代的适用场景。*常见的分表需求是事务问题。同在一个库则不需考虑分布式事务,善于使用同库不同表可有效避免分布式事务带来的麻烦。目前强一致性的分布式事务由于性能问题,导致使用起来并不一定比不分库分表快,分局也无需要,大所述只需要保证事物的*终一致性。分表的另一个存在的理由是,过多的数据库实例不利于运维管理。

 

如何实现分库分表(后面去研究一致性raft算法)

​ 1) dao层,首先通过分区键算出库名表名(如shardKey%shardNum 算出来表index如y,然后y/(shardNum/sourceNum)=x,y是表下标,x是库下标)。
​ 2) 把source从spring容器中拿出来,把表名当参数传进去,拼成分片后的sql。
​ 3) 思路大概是(select … from order where … -> 先拿到db_x的source 然后 select … from order_y where …)

%title插图%num

Cobar介绍

Cobar是阿里巴巴(B2B)部门开发的一种关系型数据的分布式处理系统,它可以在分布式的环境下看上去像传统数据库一样为您提供海量数据服务。那么具体说说我们为什么要用它,或说cobar–能干什么?以下是我们业务运行中会存在的一些问题:
1.随着业务的进行数据库的数据量和访问量的剧增,需要对数据进行水平拆分来降低单库的压力,而且需要高效且相对透明的来屏蔽掉水平拆分的细节。
2.为提高访问的可用性,数据源需要备份。
3.数据源可用性的检测和failover。
4.前台的高并发造成后台数据库连接数过多,降低了性能,怎么解决。
针对以上问题就有了cobar施展自己的空间了,cobar中间件以proxy的形式位于前台应用和实际数据库之间,对前台的开放的接口是mysql通信协议。将前台SQL语句变更并按照数据分布规则转发到合适的后台数据分库,再合并返回结果,模拟单库下的数据库行为。

 

 

网上找到的关于cobar的一些不完美的地方:

Cobar不支持将一张表,例如test表拆分成test_1, test_2, test_3…..放在同一个库中,必须将拆分后的表分别放入不同的库来实现分布式。
1) 不支持跨库情况下的join、分页、排序、子查询操作。
2) SET语句执行会被忽略,事务和字符集设置除外。
3) 分库情况下,insert语句必须包含拆分字段列名。
4) 分库情况下,update语句不能更新拆分字段的值。
5) 不支持SAVEPOINT操作。
6) 暂时只支持MySQL数据节点。
7) 使用JDBC时,不支持rewriteBatchedStatements=true参数设置(默认为false)。
8) 使用JDBC时,不支持useServerPrepStmts=true参数设置(默认为false)。
9) 使用JDBC时,BLOB, BINARY, VARBINARY字段不能使用setBlob()或setBinaryStream()方法设置参数。

 

快速检测服务器漏洞

Shodan是互联网上*可怕的搜索引擎

CNNMoney的一篇文章写道,虽然目前人们都认为谷歌是*强劲的搜索引擎,但Shodan才是互联网上*可怕的搜索引擎。

与谷歌不同的是,Shodan不是在网上搜索网址,而是直接进入互联网的背后通道。Shodan可以说是一款“黑暗”谷歌,一刻不停的在寻找着所有和互联网关联的服务器、摄像头、打印机、路由器等等。每个月Shodan都会在大约5亿个服务器上日夜不停地搜集信息。

本文以百度www.baidu.com为例检测百度服务器的漏洞。

地址:https://www.shodan.io/

搜索形式建议采用ip地址这种形式

首先需要获取到百度的ip地址

cmd->ping www.baidu.com
%title插图%num

发现我本机访问的百度服务器IP地址为:61.135.169.125

下来我们将在https://www.shodan.io/搜索这个地址

%title插图%num

下面我们看看搜索结果

%title插图%num

搜索另一个网站,也可以使用域名,比如我们搜索淘宝www.taobao.com

可以发现淘宝在地球上面是有2000多台服务器的

%title插图%num

我来搜索一下自己的网站www.jqqhappy.club

ip地址为:39.105.165.135

%title插图%num

Python中的模块

Python基础之:Python中的模块

 

看动画学算法
以动画的方式,图文并茂讲解常用的算法和数据结构,包括各种排序算法、hash、栈、队列、链表、树、散列表、堆、图等,*对物有所值!
flydean程序那些事
¥39.90
订阅博主
文章目录
简介
模块基础
执行模块
模块搜索路径
dir

包的相对路径
简介
Python的解释环境是很好用,但是如果我们需要编写一个大型的程序的时候,解释环境就完全不够用了。这个时候我们需要将python程序保存在一个文件里。通常这个文件是以.py结尾的。

对于大型的应用程序来说,一个文件可能是不够的,这个时候我们需要在文件中引用其他的文件,这样文件就叫做模块。

模块是一个包含Python定义和语句的文件。文件名就是模块名后跟文件后缀 .py 。在模块内部,模块名可以通过全局变量 __name__ 获得。

模块基础
还是之前的斐波拉赫数列的例子,我们在fibo.py文件中存放了函数的实现:

def fib(n): # write Fibonacci series up to n
a, b = 0, 1
while a < n:
print(a, end=’ ‘)
a, b = b, a+b
print()

编写完毕之后,我们可以在Python的解释环境中导入它:

>>> import fibo
1
然后直接使用即可:

>>> fibo.fib(1000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987

常用的函数,我们可以将其赋值给一个变量:

>>> fib = fibo.fib
>>> fib(1000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987

或者,我们在导入的时候,直接给这个模块起个名字:

>>> import fibo as fib
>>> fib.fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

或者导入模块中的函数:

>>> from fibo import fib as fibonacci
>>> fibonacci(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

每个模块都有它自己的私有符号表,该表用作模块中定义的所有函数的全局符号表。因此,模块的作者可以在模块内使用全局变量,而不必担心与用户的全局变量发生意外冲突。

执行模块
前面我们提到了可以使用import来导入一个模块,并且 __name__ 中保存的是模块的名字。

和java中的main方法一样,如果我们想要在模块中进行一些测试工作,有没有类似java中main方法的写法呢?

先看一个例子:

if __name__ == “__main__”:
import sys
fib(int(sys.argv[1]))

在模块中,我们需要进行一个判断 __name__ 是不是被赋值为 “__main__”。

我们这样来执行这个模块:

python fibo.py <arguments>

以脚本执行的情况下,模块的 __name__ 属性会被赋值为 __main__ , 这也是例子中为什么要这样写的原因。

看下执行效果:

$ python fibo.py 50
0 1 1 2 3 5 8 13 21 34

如果是以模块导入的话,那么将不会被执行:

>>> import fibo
>>>

模块搜索路径
使用import导入模块的时候,解释器首先会去找该名字的内置模块,如果没找到的话,解释器会从 sys.path变量给出的目录列表里寻找。

sys.path的初始目录包括:

当前目录
PYTHONPATH 指定的目录
安装的默认值
dir
要想查看模块中定义的内容,可以使用dir函数。

>>> a = [1, 2, 3, 4, 5]
>>> import fibo
>>> fib = fibo.fib
>>> dir()
[‘__builtins__’, ‘__name__’, ‘a’, ‘fib’, ‘fibo’, ‘sys’]

上面的例子列出了当前模块中定义的内容,包括变量,模块,函数等。

注意, dir() 不会列出内置函数和变量的名称。如果你想要这些,它们的定义是在标准模块 builtins 中。

我们可以给dir加上参数,来获取特定模块的内容:

>>> import builtins
>>> dir(builtins)
[‘ArithmeticError’, ‘AssertionError’, ‘AttributeError’, ‘BaseException’,
‘BlockingIOError’, ‘BrokenPipeError’, ‘BufferError’, ‘BytesWarning’,
‘ChildProcessError’, ‘ConnectionAbortedError’, ‘ConnectionError’,
‘ConnectionRefusedError’, ‘ConnectionResetError’, ‘DeprecationWarning’,
‘EOFError’, ‘Ellipsis’, ‘EnvironmentError’, ‘Exception’, ‘False’,
‘FileExistsError’, ‘FileNotFoundError’, ‘FloatingPointError’,
‘FutureWarning’, ‘GeneratorExit’, ‘IOError’, ‘ImportError’,
‘ImportWarning’, ‘IndentationError’, ‘IndexError’, ‘InterruptedError’,
‘IsADirectoryError’, ‘KeyError’, ‘KeyboardInterrupt’, ‘LookupError’,
‘MemoryError’, ‘NameError’, ‘None’, ‘NotADirectoryError’, ‘NotImplemented’,
‘NotImplementedError’, ‘OSError’, ‘OverflowError’,
‘PendingDeprecationWarning’, ‘PermissionError’, ‘ProcessLookupError’,
‘ReferenceError’, ‘ResourceWarning’, ‘RuntimeError’, ‘RuntimeWarning’,
‘StopIteration’, ‘SyntaxError’, ‘SyntaxWarning’, ‘SystemError’,
‘SystemExit’, ‘TabError’, ‘TimeoutError’, ‘True’, ‘TypeError’,
‘UnboundLocalError’, ‘UnicodeDecodeError’, ‘UnicodeEncodeError’,
‘UnicodeError’, ‘UnicodeTranslateError’, ‘UnicodeWarning’, ‘UserWarning’,
‘ValueError’, ‘Warning’, ‘ZeroDivisionError’, ‘_’, ‘__build_class__’,
‘__debug__’, ‘__doc__’, ‘__import__’, ‘__name__’, ‘__package__’, ‘abs’,
‘all’, ‘any’, ‘ascii’, ‘bin’, ‘bool’, ‘bytearray’, ‘bytes’, ‘callable’,
‘chr’, ‘classmethod’, ‘compile’, ‘complex’, ‘copyright’, ‘credits’,
‘delattr’, ‘dict’, ‘dir’, ‘divmod’, ‘enumerate’, ‘eval’, ‘exec’, ‘exit’,
‘filter’, ‘float’, ‘format’, ‘frozenset’, ‘getattr’, ‘globals’, ‘hasattr’,
‘hash’, ‘help’, ‘hex’, ‘id’, ‘input’, ‘int’, ‘isinstance’, ‘issubclass’,
‘iter’, ‘len’, ‘license’, ‘list’, ‘locals’, ‘map’, ‘max’, ‘memoryview’,
‘min’, ‘next’, ‘object’, ‘oct’, ‘open’, ‘ord’, ‘pow’, ‘print’, ‘property’,
‘quit’, ‘range’, ‘repr’, ‘reversed’, ’round’, ‘set’, ‘setattr’, ‘slice’,
‘sorted’, ‘staticmethod’, ‘str’, ‘sum’, ‘super’, ‘tuple’, ‘type’, ‘vars’,
‘zip’]


java中有package的概念,用来隔离程序代码。同样的在Python中也有包。

我们看一个Python中包的例子:

sound/ Top-level package
__init__.py Initialize the sound package
formats/ Subpackage for file format conversions
__init__.py
wavread.py
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py

effects/ Subpackage for sound effects
__init__.py
echo.py
surround.py
reverse.py

filters/ Subpackage for filters
__init__.py
equalizer.py
vocoder.py
karaoke.py

上面我们定义了4个包,分别是sound,sound.formats, sound.effects, sound.filters。

注意,如果是包的话,里面一定要包含 __init__.py 文件。

__init__.py 可以是一个空文件,也可以执行包的初始化代码或设置 __all__ 变量。

当导入的时候, python就会在 sys.path 路径中搜索该包。

包的导入有很多种方式,我们可以导入单个模块:

import sound.effects.echo

但是这样导入之后,使用的时候必须加载全名:

sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)

如果不想加载全名,可以这样导入:

from sound.effects import echo

那么就可以这样使用了:

echo.echofilter(input, output, delay=0.7, atten=4)

还以直接导入模块中的方法:

from sound.effects.echo import echofilter

然后这样使用:

echofilter(input, output, delay=0.7, atten=4)

如果一个包里面的子包比较多,我们可能会希望使用 * 来一次性导入:

from sound.effects import *

那么如何去控制到底会导入effects的哪一个子包呢?

我们可以在 __init__.py 中定义一个名叫 __all__ 的列表,在这个列表中列出将要导出的子包名,如下所示:

__all__ = [“echo”, “surround”, “reverse”]

这样from sound.effects import * 将导入 sound 包的三个命名子模块。

如果没有定义 __all__,from sound.effects import * 语句 不会 从包 sound.effects 中导入所有子模块到当前命名空间;它只会导入包 sound.effects。

包的相对路径
Import 可以指定相对路径,我们使用 . 来表示当前包, 使用 … 来表示父包。

如下所示:

from . import echo
from .. import formats
from ..filters import equalizer

idea如何连接linux服务器进行操作

idea如何连接linux服务器进行操作

1.找到下方图片的位置

%title插图%num

2.然后输入主机用户名密码之类的信息需要密钥上传一下密钥之类的

%title插图%num

3.然后我们就可以进行愉快的操作了

%title插图%num

怎么保存服务器会话信息以及设置多个服务器会话信息

%title插图%num %title插图%num

OK

中国数据库告别卡脖子:阿里再刷新全球纪录,代码100%自研

中国自研OceanBase数据库,又刷新了世界纪录。

时隔七月,再次在TPC-C公开证明实力。

但这一次,不只是新晋霸主地位的巩固,也不止于打破业界尘封9年世界纪录后的新里程碑……

更是技术性能benchmark、底层基础自主研发,以及全球标准话语权的关键事件。

很多年后回溯起来,这还可能是两个时代的分水岭。

数据库操作系统芯片,科技产业和数字化经济中三大当之无愧的底座技术,之前无一项主动权掌握在中国手中。

现在,阿里巴巴、支付宝,十年之功、20万亿行代码之力——在数据库领域,打破全球纪录的7个月后,再次创造了新的标准线。

究竟是怎样的成就?

去年十一,我们就报道过,阿里自主研发的金融级分布式关系数据库OceanBase,在国际事务处理性能委员会(TPC)的TPC-C基准测试中登上榜首。

这一成绩还打破了由美国公司甲骨文(Oracle)保持了9年之久的世界记录,成为首个登顶该榜单的中国数据库产品。

中国工程院院士、计算机专家李国杰都盛赞说:“这是中国基础软件取得的重大突破。”

如今,7个月后,纪录再度被刷新。

%title插图%num

OceanBase不仅打破了去年自己保持的世界纪录,性能分数首次突破7.07亿,相比去年大幅提升近11倍。

而且这一次还是扩展能力的展现,在分布式架构下使用超过1500个节点的数据库集群,*终实现了整体性能的大幅提升——这在传统的集中式数据库是无法想象的。

更重要的是,在产业领域,分布式数据库解决了传统数据库几十年的难题,标志着数据库行业迎来了新一轮技术变革。

%title插图%num

%title插图%num

TPC-C,被誉为“数据库领域的世界杯”。

是全球主流计算机硬件厂商、数据库厂商公认的性能评价标准,其对数据库系统的软硬件协同能力要求*高。

也是全球目前*具公信力的联机交易处理(OLTP)数据库的功能与性能结合的测试标准,金融、电信、政府等关键领域的客户,一般参照 TPC-C 结果来衡量各个数据库厂商的事务处理能力。

更直接来说,TPC-C的测试就是数据库产品真实实力的*佳公开证明。

具体到测试本身,主要涵盖两大方向,分别是基本属性压力性能

在模拟真实交易环境并考察数据库基本性能的需求下,要求连续运行至少2小时,通过每分钟创建新订单数量来评价数据库的性能和性价比,规定测试任务需要在指定时间内完成,95%事务在1s内完成。

所以一款商业数据库想要向业界证明自身实力,TPC-C测试,*对是一项硬指标。

然而,TPC-C排行榜长期被甲骨文、IBM和微软等传统数据库和硬件厂商占据……

中国自研品牌的身影,从未出现过。

直到2019年9月,阿里一鸣惊人,打破甲骨文长达9年的霸榜垄断。

%title插图%num

然而当是时,虽然成绩超*名甲骨文纪录两倍有余,但外界依然有不少质疑的声音,且认为“蹭”了硬件红利。

于是这一次,时隔7个月再战——硬件基本无变化,要的就是技术架构和软件实力的证明。

所以也有外界评价说:「再无敌手,独孤求败」。

但参与此次“证明”的阿里工程师表示:这个评价听起来太狂了。

不过也认同,在数据库领域,技术架构的优越和*,确实短时间内是很难超越的。

阿里凭什么?

这一次,OceanBase在测试压力性能时被要求连续运行至少八小时,1500多个数据库节点以及5000多万个仓库与对应数量的客户端参与其中,过程中上下抖动情况不超过1%。

以*苛刻的方式,无压力通过了该测试,而且短时间内,别人再以同样标准通过测试,几无可能。

OceanBase总经理杨冰,阿里连续两次刷榜的带头人。

%title插图%num

他分享了OceanBase取胜的核心原因:

分布式整体系统可用性的技术创新。

即不用担心高额的软硬件投入来保障扩展性能所造成的杯水车薪,又可搞定节点故障无法使用主备镜像技术等问题。

以此为出发点,OceanBase大胆采用了Paxos分布式一致性协议,作为整个分布式数据库中*核心的技术之一。

OceanBase创始人阳振坤坦言,无论是主备库数据不一致还是分布式事务的技术缺陷,根本原因都在于关系型数据库自身软件高可用性的缺失,仅仅通过堆砌硬件红利来解决问题显然是治标不治本的做法;而OceanBase则是从数据库内部入手将问题解决。

当然,经过首次冲击TPC-C测试成功再到二次震撼TPC-C并满载而归,期间OceanBase技术团队也做了很多重要的优化升级工作。

例如提供兼容Oracle的租户模式并支持兼容PL/SQL的存储过程;实践分布式并行查询的新执行引擎帮助更好支持TPC-H这类场景测试,更快走向混合负载等。

关于兼容Oracle的工作难点,杨冰强调OceanBase团队的目标是打算用两年时间做到业务的平滑迁移,不需要修改一行代码,也不需要业务做任何调整,但过程中由于Oracle本身功能较多,先去突破哪些具体的内容确实是一种挑战。

%title插图%num

另外甲骨文一直以来都是一家技术能力强大的企业,对自身专利权限十分看重,未来在兼容工作进行过程中技术团队认为务必要基于自研数据库的属性对类似功能的加持保持慎重。

更重要的是,分析甲骨文单机数据库强大的技术功能后,OceanBase团队发现其混合负载是其重要的技术杀手锏,“未来在OceanBase分布式技术架构中实现此项功能的确算是一种不小的技术挑战。”

此外,对于OceanBase来说,公开挑战里的成功,只是日常实力的证明方式之一。

与诸多中国技术公司一样,业务场景才是*好的练兵场,而且中国业务场景下的挑战,可能比基准测试还要复杂多变得多。

或许你多少有了解,支付宝投身OceanBase获得成功,除了强大的专业技术人才投入之外,更重要的是阿里经济体与支付宝业务为代表的的互联网规模、金融级场景的复杂度,以及每年双十一大促时期的大型历练机会……

%title插图%num

这些都为其提供了天然的练兵场,因为只有经过丰富的业务场景考验才能证明数据库系统的通用性,“用出来”才是硬道理。

举个例子,在高效解决银行业务从传统Oracle迁移到OceanBase的有关问题时,由于实操经验丰富,团队早已面向开发者、运维人员等不同技术层面人群提供了完成与大数据链路同步以及异构数据库、同构数据库同步与迁移的诸多工具,例如OCP、OMS等。

现如今随着OceanBase在金融场景的商用化程度越发深入,创始人阳振坤表示,未来团队更想该产品代表下一代分布式数据库的技术趋势前沿与发展方向,在除金融行业以外的多个领域。

例如交通、铁路与航天等也都陆续出现OceanBase的身影,夯实金融场景技术创新之余大力推进商用化进程,逐渐成长位至关重要的通用性技术。

包括如今面貌一新的国民应用,目前背后底座就是OceanBase。

所以可以想见,随着TPC-C的再次实力证明,会有更多公司、业务、场景和领域,用上全球*且中国自研的OceanBase数据库。

在波诡云谲的大环境中,不必再担心任何形式的断供。

%title插图%num

十年磨一剑

但即便如此,OceanBase一路走来,也并非轻而易举。

现在看到的是全球瞩目,之前却有十年的风雨兼程。

OceanBase创始人阳振坤回忆,当时完全是凭借技术灵感,认定传统集中式数据库,总会有尽头。

“我虽然不是做数据库的,但长期的分布式经验让我觉得像Oracle那种单机数据库总会有个尽头。毕竟业务数据量没几个月就要翻一翻,分布式*对是个机会。”

于是当年6月25日,OceanBase正式立项。

又一年,OceanBase 0.1版本正式发布,在淘宝收藏夹上线,成功帮助淘宝收藏夹业务的数据库服务器数量大幅度减少。

2013年,支付宝开始启动“去 IOE”,即去掉了Oracle数据库、IBM小型机和EMC存储。

2014年支付宝交易库上线,OceanBase产品真正带到金融核心业务。

2017年*个外部用户南京银行也正式上线OceanBase。

%title插图%num

再到去年9月,一战成名,打破垄断。

但更重要的是今年3月,OceanBase宣布正式通过阿里云向全球开放,实现更广泛的高可用、高性能、低成本服务。

而筚路蓝缕的研发之路中,一度因为困难重重、中途因为找不到愿意使用的业务,OceanBase团队还曾经濒临解散。

如今春风化雨,一切尽付笑谈中。

更重要的是,曾经因为数据库技术垄断,甲骨文创始人拉里·埃里森,让中国合作方在零下二十多度的凛冽环境中苦等2小时的傲慢往事,或许再也不会有了。

现在,我们不仅有了国产自研OceanBase数据库可供选择,而且OceanBase,也是*好的选择。

接下来,就看操作系统和芯片的了。

 

pandas基础篇一

python——pandas基础篇一
pandas的知识很多很细,更多感觉像字典工具一样,自己就打算借助这个平台梳理知识脉络,见证自己的成长!

一、文件的读取和写入
1、文件读取
pandas能读取的文件格式有很多种,主要介绍常用的几种格式(.csv/.txt/.xlsx…)
1
1.1语法
.csv%title插图%num

txt/xlsx

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210325142721709.png

1.2 分割参数sep
在读取txt文件时,经常遇到分隔符非空格的情况,read_table有一个分割参数sep,它使得用户可以自定义分割符号,进行txt数据的读取。%title插图%num

2、数据写入
pandas中没有定义to_table函数,但是to_csv可以保存为txt文件,并且允许自定义分隔符,常用制表符\t分割:%title插图%num

读取TXT文件,也可以使用上面的read_table,就可避免分隔符问题了。

Windows 10配置网络代理服务器

Windows 10配置网络代理服务器
本文是基于Windows 10系统环境,配置网络代理服务器,Cent OS 7.3希望通过网络参数配置,可以实现通过网络代理服务器连接互联网:

Windows 10
CentOS 7.3

一、配置Windows 10网络代理服务

1. 配置以太网参数
为了保证与CentOS 7.3服务器的连通性,首先配置IP地址,子网掩码、默认网关、DNS

%title插图%num

2. 配置WLAN参数
Windows 10主机是通过WLAN上网的,因此需要配置WLAN参数,选中允许其他网络用户通过此计算机的Internet连接来连接

%title插图%num

3. 配置Cent OS 7.3的网络参数

vi /etc/sysconfig/network-scripts/ifcfg-eth0
# 修改内容如下
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0
UUID=b583ed4e-a467-43da-af32-117d4f67efe6
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.10.103
NETMASK=255.255.0.0
GATEWAY=192.168.0.198
DNS=192.168.100.1
DNS1=8.8.8.8
DNS2=114.114.114.114

4. 重启Cent OS 7.3网络
systemctl restart network

5. 测试连通性
ping 192.168.0.198
ping www.baidu.com

pandas基础篇(二)

pandas基础篇(二)
这部分主要整理介绍pandas的基本数据结构及其基础语法
pandas的基本数据结构有两种数据类型:(1)Series
(2) DataFrame

1. Series
1.1 Series的组成
Series的组成由四部分组成:

data :序列的值
index:索引 (索引有它自己的名字属性,默认为NULL)
dtype: 储存类型
name: 序列名字
1.2 定义
#定义Series
import pandas as pd
s = pd.Series(data = [100, ‘a’, {‘dic1’:5}],
index = pd.Index([‘id1’, 20, ‘third’], name=’my_idx’),
dtype = ‘object’,
name = ‘my_name’)
s

运行截图%title插图%num

Object:代表了一种混合类型。正如上面所示,data里既有字符串,又有整数,字典形式等。此外,pandas把纯字符串序列也默认认为是一种object类型的序列,但它也可以用string类型存储。

1.3 Series获取属性
series获取属性,其实和java类似,都是以”.”的方式获取属性和方法。

#获取属性代码如下:
s.values #获取data值,得写成values,不能直接写data
s.index
s.dtype
s.name

部分代码运行截图:%title插图%num

2. DataFrame
DataFrame在Series的基础上增加了列索引,一个数据框可以由二维的data与行列索引来构造:

2.1 两种定义方式
普通定义
data = [[1, ‘a’, 1.2], [2, ‘b’, 2.2], [3, ‘c’, 3.2]]
df = pd.DataFrame(data = data,
index = [‘row_%d’%i for i in range(3)],
columns=[‘col_0’, ‘col_1’, ‘col_2’])
df

运行截图%title插图%num

常用方式
采用从列索引名到数据的映射来构造数据框,同时再加上行索引:
df = pd.DataFrame(data = {‘col_0’: [1,2,3],
‘col_1’:list(‘abc’),
‘col_2’: [1.2, 2.2, 3.2]},
index = [‘row_%d’%i for i in range(3)])
df

2.2 获取属性
与Series类似,在数据框中同样可以取出相应的属性

df.values
df.index

2.3 .T转置
通过.T可以把DataFrame进行转置:

df.T%title插图%num

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速