4种系统间交互方式比较
|
||||
指相对独立子系统间的交互 | ||||
指标\方式 | API | 数据文件 | 共享数据库 | (web系统)根域名cookie |
实效性 | 高 | 低 | 最高 | 实时 |
时间效率 | 高 | 低 | 最高 | 低 |
实时空间效率 | 低 | 高 | 低 | – |
实时占用带宽 | 低 | 低 | 低 | 低 |
系统设计正交性 | 高 | 高 | 低 | 低 |
系统设计耦合度 | 低 | 低 | 高 | 高 |
实现方式 | 同步/异步 | 异步 | 异步 | 异步 |
协议 | http request,socket,… | ftp,telnet,http,https,iSCSI,nfs… | redis,memcache,mysql,MongoDB… | http,https |
数据结构 | 自定义 | xml,yaml,csv,excel,txt,binany,… | database | |
适用场景 | 时效性要求高,请求次数多,请求频率很高 | 时效性要求低,数据量小或中,请求频率最低 | 时效性要求最高,系统中,某几个对数据请求次数很高,请求频率最高 | 需要记录在浏览器中的信息 |
举例 | 单点登录中,cas服务器和cas客户端之间的交互 | 财务系统和银行的对账文件 | 分布式数据库,共享session,异步api,计费系统的数据库 | 单点登录系统中的登陆信息(ticket等) |
作者归档:Zuocheng Liu
WEB后台服务设计:高并发时应该注意的问题
留个题目,不断补充和更新 java内置锁
由粗放危险转向细致安全的行为习惯
1.SVN中的代码,必须首先先充分自测,达到stable状态才能提交。
2.提交svn代码的时间,只放到提测前和晚上。提交svn的文件必须检查有更改的所有行。
3.使用一些工具保证代码不会出错。
4.不断总结经验。
5.使用svn和git的ignore list 功能,确保代码安全性。
产品开发过程中的经验
-
对于文本的处理,要考虑到文本可能的来源,对于文件中文本,不仅要用trim加工,还要将原有格式去掉。比如从excel专成csv文件,会多出引号。
- 对于业务中的一些需求和情况,在系统中的逻辑可有可无,最好的是把逻辑加上。比如银行加密箱号是unique,在数据库中最好将加密箱号设为unique
svn 使用经验总结
都是经验,甚至教训!
移动svn目录 最好的方法是使用svn move;
中间好的方法是先svn copy 原路径 新路径,再svn delete 原路径;
最坏的方法是将本地目录移动一下,然后在svn delete 原路径 和 svn add 新路径,先不说这种方法比较麻烦,其实还存在错误,因为本地移动目录,目录中的.svn隐藏文件夹也被移动;
参考:http://www.subversion.org.cn/svnbook/nightly/svn.ref.svn.c.move.html
apache nginx 配置多端口监听,浏览器自动跳转到80端口
最近两天在分别在配置apache 和 nginx 时,都遇到了一个相同的问题:
为apache和nginx开启监听多个端口(比如监听80和8080端口)时,改好配置,重启服务。
在浏览器端访问8080端口,url自动跳转到80端口,例如url输入http://**.**.**.**:8080, 则浏览器自动跳转到http://**.**.**.**。
而如果如果在url中的8080端口的后面添加访问文件,则正常展示8080端口下的目录或文件。
离奇的是,过一段时间,大约1个小时后,再访问http://**.**.**.**:8080,就不会跳转到http://**.**.**.**了。
网上搜索,记录此问题的网文不多。 然后自己分析了一下,大概有2种可能性。
1.浏览器端的缓存造成。但是,我换了浏览器,清空了缓存,依然如上。
2.服务器端缓存,1小时后才能恢复正常。 第2种情况比较靠谱些,顺着这个思路,最终找到了答案: 是因为开启了RPCBind服务造成。
解决方法是,将RPCBind的缓存清空。
BAE Website 配置 app.conf 实现单入口
Baidu Application Engin 中搭建网站时,如果要使用MVC框架,往往需要设置单入口。然而BAE的web服务程序(apache或者lighthttp)对用户是透明的。开发者不能通过修改配置文件,也不能通过修改.htaccess文件来实现单入口。但BAE在应用的根目录提供了app.conf这个配置文件,通过修改它可以实现重写、设置缓存时间的功能。 下面的这个app.conf,将所有,除文本文件和图片、视频文件等所有请求,都重定向到index.php。 欢迎大家补充~
handlers:
expire : .jpg modify 10 years
expire : .swf modify 10 years
expire : .png modify 10 years
expire : .gif modify 10 years
expire : .JPG modify 10 years
expire : .ico modify 10 years
url : ^(.*\.js)$
script : /$1
url : ^(.*\.css)$
script : /$1
url : ^(.*\.jpg)$
script : /$1
url : ^(.*\.gif)$
script : /$1
url : ^(.*\.jpeg)$
script : /$1
url : ^(.*\.png)$
script : /$1
url : ^(.*\.bmp)$
script : /$1
url : ^(.*\.swf)$
script : /$1
url : ^(.*\.ico)$
script : /$1
url : ^(.*\.JPG)$
script : /$1
url : ^(.*\.txt)$
script : /$1
url : ^(.*)$
script : /index.php
LNMP启停控制自动脚本
常常在更改LNMP配置之后,需要重启LNMP,在此写了一个自动化脚本,方便重启LNMP。 除了方便重新启动,还增加了关闭与开启功能。 Operating System: Ubuntu Server 代码
# !/bin/bash
function start(){ sudo service nginx start sudo service php5-fpm start }
function startall(){ start sudo service mysql start }
function stop(){ sudo service nginx stop sudo service php5-fpm stop }
function stopall(){ stop sudo service mysql start }
function restart(){ sudo service nginx restart sudo service php5-fpm restart }
function restartall(){ restart sudo service mysql restart }
## main()
case "$1" in
"start") start ;;
"startall") startall ;;
"stop") stop ;;
"stopall") stopall ;;
"restart") restart ;;
"restartall") restartall ;;
"configtest") configtest ;;
*) echo "Usage: $0 {start|stop|restart|startall|stopall|restartall}"
esac exit 0
webserver restart //重启nginx 和 php-fpm
若基类中有虚函数,则必需有虚析构函数
C函数和C++函数相互调用
实例解说
这个例子,示例了两点
- C 如何调用C++对象里的函数
- C++ 如何调用C的函数
共两个文件,test.c 和 main.cpp,代码解释如下:
在main.cpp (C++ 代码) 里定义了一个类MyMath,类里有个成员函数sum ;如何让C能调用这个c++的函数MyMath::sum呢?
即在main.cpp 中添加extern C后,声明定义一个C的函数call_MyMath_sum。在test.c 中先声明这个函数,然后通过调用call_MyMath_sum,达到调用C++ MyMath::sum的作用。
在test.c 中,定义了一个sum 的函数。如何让C++能调用这个c的函数sum呢? 这么做的,在main.cpp中 extend C 后声明它,然后在main函数中直接调用就可以了。
代码有点绕,C和C++调来调去的,不过仔细看就容易明白。
起关键作用的就是 extent C 这个关键语句,它的作用是告诉C++编译器,把后面的语句当作C语言进行处理。
代码如下
C语言中的函数,其中调用了C++中的call_MyMath_sum:
test.c
int call_MyMath_sum (int, int); // 此函数定义在main.cpp中
int sum(int a , int b) {
return call_MyMath_sum(a,b);
}
C++语言中的函数:
main.cpp
# include <iostream>
using namespace std;
extern C {
int sum(int , int); // 声明sum函数,已经在test.c 中定义过
}
class MyMath {
public :
static int sum(int , int);
};
int MyMath::sum(int a, int b) {
return (a + b);
}
extern C int call_MyMath_sum (int a , int b) { // 定义call_MyMath_sum , 使其可以被c的代码调用
return (MyMath::sum(a,b));
}
int main(void) {
cout< <sum(5,6); return 0; // 此sum是 在test.c中定义的
}
如何编译:
# Makefile
main.o:
g++ -c -o main.o main.cpp # 注意是g++
test.o:
gcc -c -o test.o test.c # 注意是gcc
main: main.o test.o
g++ -o main main.o test.o # 最后链接用的是g++
all: main
clean:
rm -f test.o main.o
执行 make 得到可执行文件main
编译系统内核 -fno-stack-protector
在编译于渊的《Orange’s 一个操作系统实现》中的源代码时, 经常提示:
klib.c:(.text+0xe5): undefined reference to __stack_chk_fail' make: *** [kernel.bin] Error 1
这是由于GCC中的编译器堆栈保护机制造成,编译时禁掉就可以。
解决方案:
在CFLAGS后面加上-fno-stack-protector
[php5.2.4]explode函数不能按照”\r\n”切割字符串
php 版本 5.2.4 现有一txt文件,格式如下: file.txt
- 1
- 2
- 3
- 4
- 5
要将其内容按行分割存入数据$array中 执行代码:
- $fileContent = trim(file_get_contents(‘file.txt’);
- $array = explode(“\r\n”, $fileContent);
并未达到预想的效果 $array => array( 0 => String(15) “1 2 3 4 5” ) 这就是问题! 解决方法:
- $fileContent = trim(file_get_contents(‘file.txt’));
- $array = array_unique(explode(‘,’, str_replace(“\r\n”,”,”,$fileContent)));
protected函数中含有private属性,此类被继承后,此属性是否有效
答案是肯定的,以下面代码为例:
- < ?php
- class A
- {
- private $var;
- protected function fun()
- {
- $this->var = ‘Hello var!’;
- echo $this->var;
- }
- }
- class B extends A
- {
- public function fun0()
- {
- $this->fun();
- }
- }
- $b=new B();
- $b->fun0();
- ?>
其中,var为class A中私有变量,被protected型fun函数调用。当class A被class B继承,class B并不能继承属性var,但是class B调用fun函数时,属性var仍然是有效的。 浏览器中显示结果如下:
- Hello var!
PHP 编程陷阱
遍历数组元素,使用引用
foreach ($PostList as &$postInfo) {
}
unset(&$postInfo); // 最好加上这条语句,不然下面的语句中用到这个变量,用的是数组最后一个元素
运算符结合性和优先级
尽可能不写运算符堆砌的语句,可读性较差。
浮点数比较
和其他语言浮点数比较相同
不同类型数值比较
var_dump("true == 70", true == 70);
bool(true)
整形和布尔比较,PHP会先把整形转换成布尔
php 版本 5.2.4 问题:文件字符串转码时按字节截断不当 比如
$str = “公司”; //默认以UTF-8编码
$str = Simple_Util_String::msubstr($str, 4); // 按字节截取前4个字节,原字符串有6个字节
$str .= “adfadsfasdfadsfasdf”; //拼接后面的字符串 (执行下一步后,这些字符就消失了)
$str = iconv("UTF-8", "GBK//TRANSLIT",$str); // 转码 , 遇到不认识的字符串进行转写
执行此步时,“公司”的“司”字编码不完整,iconv不认识,但iconv没有转写,而是做了截断。导致$str后面的字符串也没有转换成功,“adfadsfasdfadsfasdf”丢失了。在一些商业产品,尤其是有关统计的系统里,这是很危险的。 解决方法是: 改变iconv第二个参数。
$str = iconv("UTF-8","GBK//IGNORE", $str);
总结:iconv的TRANSLIT并不靠谱,遇到不认识也不能转写的字符串,也可能截断。保险的方法是用IGNORE。