初次安装Docker 运行出现的问题
Ubuntu 14.04 第一次安装Docker,运行hello-world 是可以的, 重启系统之后,运行hello-world 出现如下报错: Cannot connect to the Docker daemon. Is the docker daemon running on this host? 多方查找,解决如下: sudo su //切换到root service docker start //启动docker service docker images //显示所有images docker run hello-world //重新运行 恩,是权限问题,当前用户没权限,root用户可以运行 from:http://blog.163.com/s2006203387@126/blog/static/533199572015111703735423/
View Detailsmysql存储过程示例
DROP PROCEDURE IF EXISTS proc_name; delimiter // create definer=root@localhost procedure proc_name( in pi_id int ) begin todo…… end// delimiter ;
View Details详解MySQL性能优化(二)
七、MySQL数据库Schema设计的性能优化 高效的模型设计 适度冗余-让Query尽两减少Join 大字段垂直分拆-summary表优化 大表水平分拆-基于类型的分拆优化 统计表-准实时优化 合适的数据类型 时间存储格式总类并不是太多,我们常用的主要就是DATETIME,DATE和TIMESTAMP这三种了。从存储空间来看TIMESTAMP最少,四个字节,而其他两种数据类型都是八个字节,多了一倍。而TIMESTAMP的缺点在于他只能存储从1970年之后的时间,而另外两种时间类型可以存放最早从1001年开始的时间。如果有需要存放早于1970年之前的时间的需求,我们必须放弃TIMESTAMP类型,但是只要我们不需要使用1970年之前的时间,最好尽量使用TIMESTAMP来减少存储空间的占用。 字符存储类型 CHAR[(M)]类型属于静态长度类型,存放长度完全以字符数来计算,所以最终的存储长度是基于字符集的,如latin1则最大存储长度为255字节,但是如果使用gbk则最大存储长度为510字节。CHAR类型的存储特点是不管我们实际存放多长数据,在数据库中都会存放M个字符,不够的通过空格补上,M默认为1。虽然CHAR会通过空格补齐存放的空间,但是在访问数据的时候,MySQL会忽略最后的所有空格,所以如果我们的实际数据中如果在最后确实需要空格,则不能使用CHAR类型来存放。 VARCHAR[(M)]属于动态存储长度类型,仅存占用实际存储数据的长度。TINYTEXT,TEXT,MEDIUMTEXT和LONGTEXT这四种类型同属于一种存储方式,都是动态存储长度类型,不同的仅仅是最大长度的限制。 事务优化 1. 脏读:脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。 2. 不可重复读:是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。 3. 幻读:是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。 Innodb在事务隔离级别方面支持的信息如下: 1.READ UNCOMMITTED 常被成为Dirty Reads(脏读),可以说是事务上的最低隔离级别:在普通的非锁定模式下SELECT的执行使我们看到的数据可能并不是查询发起时间点的数据,因而在这个隔离度下是非Consistent Reads(一致性读); 2.READ COMMITTED 这一隔离级别下,不会出现DirtyRead,但是可能出现Non-RepeatableReads(不可重复读)和PhantomReads(幻读)。 3. REPEATABLE READ REPEATABLE READ隔离级别是InnoDB默认的事务隔离级。在REPEATABLE READ隔离级别下,不会出现DirtyReads,也不会出现Non-Repeatable Read,但是仍然存在PhantomReads的可能性。 4.SERIALIZABLE SERIALIZABLE隔离级别是标准事务隔离级别中的最高级别。设置为SERIALIZABLE隔离级别之后,在事务中的任何时候所看到的数据都是事务启动时刻的状态,不论在这期间有没有其他事务已经修改了某些数据并提交。所以,SERIALIZABLE事务隔离级别下,PhantomReads也不会出现。 八、可扩展性设计之数据切分 数据的垂直切分 数据的垂直切分,也可以称之为纵向切分。将数据库想象成为由很多个一大块一大块的“数据块”(表)组成,我们垂直的将这些“数据块”切开,然后将他们分散到多台数据库主机上面。这样的切分方法就是一个垂直(纵向)的数据切分。 垂直切分的优点 ◆数据库的拆分简单明了,拆分规则明确; ◆应用程序模块清晰明确,整合容易; ◆数据维护方便易行,容易定位; 垂直切分的缺点 ◆部分表关联无法在数据库级别完成,需要在程序中完成; ◆对于访问极其频繁且数据量超大的表仍然存在性能平静,不一定能满足要求; ◆事务处理相对更为复杂; ◆切分达到一定程度之后,扩展性会遇到限制; ◆过读切分可能会带来系统过渡复杂而难以维护。 数据的水平切分 数据的垂直切分基本上可以简单的理解为按照表按照模块来切分数据,而水平切分就不再是按照表或者是功能模块来切分了。一般来说,简单的水平切分主要是将某个访问极其平凡的表再按照某个字段的某种规则来分散到多个表之中,每个表中包含一部分数据。 水平切分的优点 ◆表关联基本能够在数据库端全部完成; ◆不会存在某些超大型数据量和高负载的表遇到瓶颈的问题; ◆应用程序端整体架构改动相对较少; ◆事务处理相对简单; ◆只要切分规则能够定义好,基本上较难遇到扩展性限制; 水平切分的缺点 ◆切分规则相对更为复杂,很难抽象出一个能够满足整个数据库的切分规则; ◆后期数据的维护难度有所增加,人为手工定位数据更困难; ◆应用系统各模块耦合度较高,可能会对后面数据的迁移拆分造成一定的困难。 数据切分与整合中可能存在的问题 1.引入分布式事务的问题 完全可以将一个跨多个数据库的分布式事务分拆成多个仅处于单个数据库上面的小事务,并通过应用程序来总控各个小事务。当然,这样作的要求就是我们的俄应用程序必须要有足够的健壮性,当然也会给应用程序带来一些技术难度。 2.跨节点Join的问题 推荐通过应用程序来进行处理,先在驱动表所在的MySQLServer中取出相应的驱动结果集,然后根据驱动结果集再到被驱动表所在的MySQL Server中取出相应的数据。 3.跨节点合并排序分页问题 从多个数据源并行的取数据,然后应用程序汇总处理。 九、可扩展性设计之Cache与Search的利用 通过引入Cache(Redis、Memcached),减少数据库的访问,增加性能。 通过引入Search(Lucene、Solr、ElasticSearch),利用搜索引擎高效的全文索引和分词算法,以及高效的数据检索实现,来解决数据库和传统的Cache软件完全无法解决的全文模糊搜索、分类统计查询等功能。 以上就是本文的全部内容,希望大家可以喜欢。 from:http://www.jb51.net/article/70530.htm
View DetailsPHP实现RIJNDAEL_256加密(静态类)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
<?php /** * Created by PhpStorm. * User: w3cnet * Date: 2016/12/10 * Time: 22:50 */ namespace app\models; class AESCrypt{ /** * 设置默认的加密key * @var str */ private static $key = "A9823E9B32A658F72814D0B612F550EC"; /** * 设置默认加密向量 * @var str */ private static $iv = 'A9823E9B@#A658F72814D0^&12F550E$'; /** * 设置加密算法 * @var str */ private static $cipher = MCRYPT_RIJNDAEL_256; /** * 设置加密模式 * @var str */ private static $mode = MCRYPT_MODE_CBC; /** * 对内容加密,注意此加密方法中先对内容使用padding pkcs7,然后再加密。 * @param str $content 需要加密的内容 * @return str 加密后的密文 */ public static function encrypt($content){ if(empty($content)){ return null; } $src_data = $content; $block_size = mcrypt_get_block_size(self::$cipher, self::$mode); $padding_char = $block_size - (strlen($content) % $block_size); $src_data .= str_repeat(chr($padding_char),$padding_char); return base64_encode(mcrypt_encrypt(self::$cipher, self::$key, $src_data, self::$mode, self::$iv)); } /** * 对内容解密,注意此加密方法中先对内容解密。再对解密的内容使用padding pkcs7去除特殊字符。 * @param String $content 需要解密的内容 * @return String 解密后的内容 */ public static function decrypt($content){ if(empty($content)){ return null; } $content = base64_decode($content); $content = mcrypt_decrypt(self::$cipher, self::$key, $content, self::$mode, self::$iv); $pad = ord($content[($len = strlen($content)) - 1]); return substr($content, 0, strlen($content) - $pad); } } |
View Details
MySQL 的 20+ 条最佳实践
数据库操作是当今 Web 应用程序中的主要瓶颈。 不仅是 DBA(数据库管理员)需要为各种性能问题操心,程序员为做出准确的结构化表,优化查询性能和编写更优代码,也要费尽心思。 在本文中,我列出了一些针对程序员的 MySQL 优化技术。 在我们开始学习之前,我补充一点:你可以在 Envato Market 上找到大量的 MySQL 脚本和实用程序。 1.优化查询的查询缓存 大部分MySQL服务器都有查询缓存功能。这是提高性能的最有效的方法之一,这是由数据库引擎私下处理的。当同一个查询被多次执行,结果会直接从缓存里提取,这样速度就很快。 主要的问题是,这对程序员来说太简单了,不容易看到,我们很多人都容易忽略。我们实际上是可以组织查询缓存执行任务的。 ? 1 2 3 4 5 6 // query cache does NOT work $r = mysql_query("SELECT username FROM user WHERE signup_date >= CURDATE()"); // query cache works! $today = date("Y-m-d"); $r = mysql_query("SELECT username FROM user WHERE signup_date >= '$today'"); 查询缓存在第一行不执行的原因在于CURDTE()功能的使用。这适用于所有的非确定性功能,就像NOW()和RAND()等等。。。因为功能返回的结果是可变的。MySQL决定禁用查询器的查询缓存。我们所需要做的是通过添加一额外一行PHP,在查询前阻止它发生。 2. EXPLAIN你的选择查询 使用EXPLAIN关键词可以帮助了解MySQL是怎样运行你的查询的。这有助于发现瓶颈和查询或表结构的其它问题。 EXPLAIN的查询结果会展示哪一个索引被使用过,表示怎样扫描和储存的,等等。。。 选择一个SELECT查询(一个有连接的复杂查询会更好),在它的前面添加关键词EXPLAIN,这样就可以直接使用数据库了。结果会以一个漂亮的表来展示。例如,就好比我执行连接时忘了添加一栏的索引: 现在它只会从表2里面扫描9和16行,而非扫描7883行。经验法则是乘以所有“行”那一栏的数字,你的查询性能会跟结果数字成比例的。 3. 获取唯一行时使用LIMIT 1 有时当你查表时,你已经知道你正在查找的结果只有一行。你可能正在获取唯一记录,或者你可能只是查询是否存在满足你的WHERE子句条件的记录。 在这种情况下,将LIMIT 1添加到查询条件中可以提高性能。这样,数据库引擎将在找到刚刚第一个记录之后停止扫描记录,而不是遍历整个表或索引。 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 // do I have any users from Alabama? // what NOT to do: $r = mysql_query("SELECT * FROM user WHERE state = 'Alabama'"); if(mysql_num_rows($r) > 0) { // … } // much better: $r = mysql_query("SELECT 1 FROM user WHERE state = 'Alabama' LIMIT 1"); if(mysql_num_rows($r) > 0) { // … } 4. 索引搜索字段 索引不仅仅是为了主键或唯一键。如果你会在你的表中按照任何列搜索,你就都应该索引它们。 正如你所看到的,这个规则也适用于如 last_name LIKE a%' 的部分字符串搜索。当从字符串的开头搜索时,MySQL就可以使用那一列的索引。 你也应该明白什么样搜索可以不使用有规律的索引。例如,当搜索一个单词时(例如, WHERE post_content LIKE %apple%' […]
View DetailsMySQL存储过程中游标循环的跳出和继续操作示例
最近遇到这样的问题,在MySQL的存储过程中,游标操作时,需要执行一个conitnue的操作.众所周知,MySQL中的游标循环操作常用的有三种,LOOP,REPEAT,WHILE.三种循环,方式大同小异.以前从没用过,所以记下来,方便以后查阅. 1.REPEAT 复制代码代码如下: REPEAT Statements; UNTIL expression END REPEAT demo DECLARE num INT; DECLARE my_string VARCHAR(255); REPEAT SET my_string =CONCAT(my_string,num, , ); SET num = num +1; UNTIL num <5 END REPEAT; 2.WHILE 复制代码代码如下: WHILE expression DO Statements; END WHILE demo DECLARE num INT; DECLARE my_string VARCHAR(255); SET num =1; SET str = ; WHILE num < span>10DO SET my_string =CONCAT(my_string,num, , ); SET num = num +1; END WHILE; 3.LOOP(这里面有非常重要的ITERATE,LEAVE) 复制代码代码如下: DECLARE num INT; DECLARE str VARCHAR(255); SET num =1; SET my_string = ; loop_label: LOOP IF […]
View DetailsMySQL字符串连接函数
MySQL中 concat 函数 使用方法: CONCAT(str1,str2,…) 返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。 注意: 如果所有参数均为非二进制字符串,则结果为非二进制字符串。 如果自变量中含有任一二进制字符串,则结果为一个二进制字符串。 一个数字参数被转化为与之相等的二进制字符串格式;若要避免这种情况,可使用显式类型 cast, 例如: SELECT CONCAT(CAST(int_col AS CHAR), char_col) MySQL的concat函数可以连接一个或者多个字符串,如 mysql> select concat( 10 ); + + | concat( 10 ) | + + | 10 | + + 1 row in set (0.00 sec) mysql> select concat( 11 , 22 , 33 ); + + | concat( 11 , 22 , 33 ) | + + | 112233 | + + 1 row in set (0.00 sec) MySQL的concat函数在连接字符串的时候,只要其中一个是NULL,那么将返回NULL mysql> select concat( 11 , 22 ,null); + + […]
View Detailsc# WebBrowser如何伪造http referer
webbrowser1.Navigate(url, _self , null, Referer:http://www.xxxx.com ); from:http://blog.csdn.net/sunshuqian2005/article/details/23561535
View Details用n多的框架写同一个demo
最近有了比较长的空闲时间。 所以看了很多很多不同的语言,框架。 java用了很多年了,总觉得眼界都被java影响了,所以想从新开始学一点新的东西。 而一旦开始选择开始的路径,完美主义的小心思就出来作祟了。 泛泛的接触了好多好多东西,基本上主流的语言,框架都把入门文档看了个遍。 到最后都没有达到最初想学点东西的目的,反而看文档的能力提高不少 所以,我决定不再单纯的看了。 我觉得执行下面的计划,动手写写。这也是为什么文章开始就要写明发表时间,因为未来会发生什么谁也不知道,我得到的结果只是当下我认为的好结果而已。 仅此而已 这里是列表文本测试方式:controller层上返回服务器当前时间 new Date().getTime() //long类型 开发方式:使用各个框架的引导教程默认设置去写代码,尽量写最少的代码完成demo 测试的框架:jfinal(java),grails(groovy),play(scala),springboot-undertow(java),express(js),beego(golang),compojure(clojure) .看情况增加 测试内容:ab进行压测测试,开发效率(完成所花费的时间),上手难度,扩展性(面对需求频繁更改的可维护性) 压测命令:ab -n 100000 -c 1000 -k http://localhost:8080/ 测试机器:amdFX 6300 3.5G+8G+windows10 因为都是主观感受,因此对其他人来说没有任何参考价值 没有任何参考价值 没有任何参考价值 没有任何参考价值 重要的事情说三遍,免得别人以为我在宣扬啥。 下面开始贴图 jfinal jfianl是我用的最多的框架,目前整个公司也在用,真的用起来很爽,最喜欢orm层设计,可以不写字段,对于需要频繁变更数据库结构的前期开发非常顺手。扩展起来也很方便,毕竟是java系。上手的话和在测的这些比较对于0基础的朋友来说属于困难。 jfinal+tomcat9m 不打包,使用idea直接运行起来,配置文件里面关闭dev jfinal+tomcat8 war包 关闭dev jfinal + jetty9 war包 关闭dev spring spring是jee开发绕不过去的大山,springboot用的人越来越多,其实我之所以要看springboot只是对undertow这个框架感兴趣。因此测试结果也是直接测试undertow内核下的性能。 springboot上手难度的话个人感觉比jfianl简单一些,比着教程可以跑起来,不过对于不了解java的朋友来说 看到一大堆注解,会疯掉。 springboot+undertow idea中直接run scala scala号称是会干掉java的jvm语言,多范式,spark,这门语言本身有很强烈的光环,而且play作为非常牛逼的全栈框架,给人的体验是极爽的。写代码->刷新看结果,不需要重新编译。唯一感觉不好的是,scala这门语言好晦涩 .各种符号,各种+-*/,各种箭头。语言本身上手难度决定了这个框架的上手难度。 play groovy groovy是大家经常用却不知道它的语言,这么说的原因是,gradle就是groovy开发的。grails是groovy借鉴ruby on rails框架开发的web 框架,对新人极其友好,命令行里面,create-controller,create-doman,create-service。直到现在我还能回想起那种写代码顺畅的感觉。而且grails3以后,底层实现直接使用spring4+hibernate5。对于ssh系的开发人员来说,上手速度杠杠的。因此测试也是两种,console中直接执行使用的jetty,使用main函数执行使用springboot。而且由于本身是脚本语言,代码修改非常方便。 grails3 console中直接运行 grails3-springboot nodejs 作为nodejs杀手框架express,让前端人员在各种领域里面虐杀各种后台开发人员。俗话说的好,凡事能用js实现的东西,早晚要用js实现。上手速度没有比他更快了。而且写的是js的代码,简单又好学。nodejs真心不错的。 express4 clojure clojure 是jvm下面的一门lisp方言。俗话说,每过一段时间,总有一小撮人发现这个世界上还有另外一个世界叫lisp,并且他们妄想lisp能够统领全世界。其实lisp下面有不少web框架可以用,为什么选择compojure这个框架,主要原因还是http-kit。compojure默认配置使用jetty7执行,效率没法看了,但是换成http-kit内核以后,速度飞起.测试完http-kit以后,我对这个框架产生非常大的兴趣,有谁知道有http-kit有哪些应用吗? 这个速度真的是可怕啊。 上手难度:你知道lisp吗? compojure 默认配置 compojure+http-kit golang golang作为google亲儿子语言,不用多说了。好多朋友都喜欢,我去年也用了好一阵子,确实很好,而且beego作为国人开发的框架,教程的丰富程度,从视频到文字应有尽有。但是,不知道是什么原因,在我的机器上beego测试出来的速度有点匪夷所思的慢,这个值大家看看就成了 这个值大家看看就成了 这个值大家看看就成了这个值大家看看就成了 重要的事情说三遍,要不然我就成beego黑了. beego 默认配置 测试全部完成以后发现,其实测试本身没啥意义,因为都是默认配置,和优化以后效率就没有什么可比性了。因此只能图个乐呵。 茄子萝卜各有所爱,何必在意细节 from:https://my.oschina.net/jsmagic/blog/802851
View Details如何在CentOS 7中安装Git
Git是在今天的软件开发行业一个非常有用的版本控制工具。我一直使用Git。于是为Linux公社的读者写一篇如何在CentOS 7中安装Git教程 什么是Git? 如果你曾经使用过Github这样的网站或者在Bitbucket 购买过代码,把它展示给你的朋友,那么你可能知道Git是什么。至少,你肯定对它有过了解。 Git是软件开发中最广泛使用的版本控制系统,其最初发布于九年前的2005年4月7日,主要是为了保证一个大型的分布式开发项目的顺利进行。和客户端 服务器系统的开发不同,开发者独立于网络访问或中央服务器,因为每个Git的工作目录是一个全面的资料库。 创始人Linus Torvalds决定遵循GNU通用公共许可证第二版的协议条款,免费的发布Git。维基百科中可以了解到,有许多语言来正在开发这个版本控制系统,如Perl, Bash, C and Tcl。 在GentOS7上安装Git之前,我必须明确Git支持主流的操作系统,如Linux,POSIX,Windows和OS X. 分割线 GitHub 教程系列文章: GitHub 使用教程图文详解 http://www.linuxidc.com/Linux/2014-09/106230.htm Git 标签管理详解 http://www.linuxidc.com/Linux/2014-09/106231.htm Git 分支管理详解 http://www.linuxidc.com/Linux/2014-09/106232.htm Git 远程仓库详解 http://www.linuxidc.com/Linux/2014-09/106233.htm Git 本地仓库(Repository)详解 http://www.linuxidc.com/Linux/2014-09/106234.htm Git 服务器搭建与客户端安装 http://www.linuxidc.com/Linux/2014-05/101830.htm Git 概述 http://www.linuxidc.com/Linux/2014-05/101829.htm 分享实用的GitHub 使用教程 http://www.linuxidc.com/Linux/2014-04/100556.htm 分割线 前期准备 请确保您的机器上安装有CentOS 7系统以及一个帐户具有root权限。因为我们需要在系统上安装软件。 安装Git 从源代码编译 从源代码编译和安装软件并不是很难,但是可以肯定它需要一些知识,我强烈建议仔细地按照本教程的每个步骤,尤其是如果你之前还没有这样做过。 这个方法可以使我们获得包含最新的功能的最新的版本,但这种方法的缺点是,一旦安装完成正在被在CentOS系统中使用的yum包管理器不能更新 因为一些软件包之间有依赖关系,我们必须你必须以手动安装一些软件,才可以继续安装。于是我们可以打开CentOS7终端,运行以下命令。 拿到root权限 su root 使用下面的命令 sudo yum install Development Tools 如果 上面的命令没有执行,也可以使用下面的命令来解决这个问题。 yum groupinstall Development Tools 选择Y并按下回车键。 然后运行下面的命令来安装需要本教程的一些其他的包。 1 sudo yum install gettext–devel openssl–devel perl–CPAN perl–devel zlib–devel 一旦依赖已经安装那么,我们需要找出并下载的Git软件的最新版本。下面的截图显示,我们可以得到最新版本的页面信息。 你可以从上面的截图看到最新的版本是V2.3.0。不要下载带有-rc的,因为它代表了一个候选发布版本。 通过使用wget的工具下载的Git的2.3.0版本。 1 wget https://Github.com/Git/Git/archive/v2.3.0.tar.gz 然后使用tar工具来解压您刚刚下载的.tar归档文件。 tar xvf v2.3.0.tar.gz 然后使用cd命令更改工作目录,如下所示。 […]
View Details