用js计算时间差,得到比较人性化的结果0+

2,751 views / 2009.09.03 / 5:05 下午

我们经常看到一些文章或者评论的发表时间不是直接显示出死板的Y-m-d格式,而是算了一个时间差,如:发表于2分钟前,这样显得比较人性化,多用于一些非正式网站。下面提供JavaScript的实现方法:

var minute = 1000 * 60;
var hour = minute * 60;
var day = hour * 24;
var halfamonth = day * 15;
var month = day * 30;
 
function getDateDiff(dateTimeStamp){
var now = new Date().getTime();
var diffValue = now - dateTimeStamp;
 
if(diffValue < 0){
 //非法操作
 //alert("结束日期不能小于开始日期!");
 }
 
var monthC =diffValue/month;
var weekC =diffValue/(7*day);
var dayC =diffValue/day;
var hourC =diffValue/hour;
var minC =diffValue/minute;
 
if(monthC>=1){
 result="发表于" + parseInt(monthC) + "个月前";
 }
 else if(weekC>=1){
 result="发表于" + parseInt(weekC) + "个星期前";
 }
 else if(dayC>=1){
 result="发表于"+ parseInt(dayC) +"天前";
 }
 else if(hourC>=1){
 result="发表于"+ parseInt(hourC) +"个小时前";
 }
 else if(minC>=1){
 result="发表于"+ parseInt(minC) +"分钟前";
 }else
 result="刚刚发表";
? return result;
}

如果你得到的原始数据不是时间戳,可以采用下面的函数把字符串转换为标准时间戳, 它相当于JS版的strtotime,只不过精度不同罢了:

function getDateTimeStamp(dateStr){
 return Date.parse(dateStr.replace(/-/gi,"/"));
}
Categories: 感悟 Tags: , ,

大数据网站降低单点故障损失的方法0+

1,343 views / 2009.09.03 / 12:12 上午

大数据网站的数据具有访问频率高,更新速度快,更新量大,不便于备份等特点,如果我们依然用传统的单服务器单数据库去构架,首先不能保证大流量访问,其次数据备份困难,再次数据出现故障不能及时修复,所以,我们从两个方面着手,本着低成本的原则,提出解决方案。

一 采用双网卡,内网外网分离,维护时内网操作,外网负载均衡后提供服务。采用主从数据库的方式。

目的:提高系统稳健性,降低单点故障给系统构成的影响。

前提:1. BIGIP自动识别异常服务器功能正常工作;2. 系统挂载的存储及数据库正常工作

方式

1. web端的冗余

a) 唯一性数据存放在存储服务器上(模板、静态化文件、碎片等)

b)程序等多份数据(选择一台机器做为主机器,用rysnc进行程序更新以及分发),程序定期更新至svn。

 2 . 数据库冗余

采用M-S模式,进行读写分离。在程序上进行控制,要是有一个出问题直接切回单机模式,来防止数据库机器损害带来的长时间停机。(应用程序修改大,需要较长时间,可以考虑进一步优化)

如图:

1

二 挂载双存储,每个存储分多个挂载点挂载到前端服务器。

如果系统存储只有一台服务器,如果出问题,会造成长时间服务中断,我们讨论出一套方案,可以使损失降到尽量小。

设存储一为s1,存储二为s2, 这两台都有三个挂载点,记为data1,data2,data3,我们把s1的data1,data2挂载在前端机器上,把s2的data3也挂载在前端机器上,同时每天把s1的data1,data2同步到s2, 把s2的data3同步到s1,保证两个存储数据尽量同步。

如图:

2

当故障发生时,比如s2宕掉,可以快速的把前端服务器的data3挂载改为s1的data3,这样只有最多一天的单个目录数据丢失,我们可以再对其进行简单的恢复操作。?

优点:1. 单存储负载被分担 2.线上已有产品程序不用调整 3.故障时处理迅速

缺点:故障恢复时,当天的部分数据可能会丢失。

同时兼容32位与64位机器的php hash函数2+

2,229 views / 2009.09.01 / 8:08 下午

时代在进步,社会在发展,64位机的出现导致移位元算不再很轻易溢出,这固然是件值得高兴的事情,可在系统迁移中,忽然发现64位机器hash函数得出的结果居然与32位不一样,震惊之余赶紧研究算法在发现是移位运算符号的问题。

没办法,只好对系统进行判断,并针对64位机器重写了算法,代码如下:

if (exec("getconf LONG_BIT") == "32") {
 function _hash($apszData = "", $MAX_TABLE_NUM = 0) {
  $_hash = $x = $i = 0;
  for($i = 0; $i < strlen($apszData); $i++) {
   $_hash = ($_hash << 4) + ord($apszData[$i]);
   if (($x = $_hash &0xF0000000) != 0) {
    $_hash ^= ($x >> 24);
    $_hash &= ~$x;
   } 
  } 
  return ($_hash &0x7FFFFFFF) % $MAX_TABLE_NUM + 1;
 } 
} else {
 function _hash($apszData = "", $MAX_TABLE_NUM = 0) {
  $hash = $x = $i = 0;
  for($i = 0; $i < strlen($apszData); $i++) {
   $hash = ($hash << 4) + ((ord($apszData[$i])) << 32);
 
   if (($x = $hash &0xF000000000000000) != 0) {
    $hash ^= $x >> 24;
    $hash &= (~$x) &0xFFFFFFFF00000000;
   } 
  }
 
  $ret = ($hash &0x7FFFFFFF00000000) % ($MAX_TABLE_NUM << 32) + (1 << 32);
  $ret >>= 32;
  $ret &= 0xFFFFFFFF;
  return $ret;
 } 
}

如果你不知道hash函数的作用,请参阅 http://baike.baidu.com/view/20089.htm

Categories: 感悟 Tags: , ,

操作页面刷新后,数据不能及时更新1+

1,542 views / 2009.09.01 / 6:06 下午

众所周知,刷新页面可以直接在html的head标签中使用如下代码:

<meta http-equiv="refresh" content="1; URL=http://www.71j.cn">

其中content中的数字1表示等待是时间(秒)

也可以使用php发送头消息:

header("location:http://71j.cn");

甚至可以使用js中window.location.reload()方法,但是我们在开发过程中发现,因为浏览器或者CDN等带有的缓存机制会使页面刷新后,数据得不到刷新。

解决办法如下:

function autorefresh(){
var s="&";
var href=window.location.href;
if(href.indexOf("t=")==-1){
if(href.indexOf("?")==-1) s="?";
window.location.href+=s+"t="+new Date().getTime();
}else{
window.location.href = href.replace(/t=[0-9]+/,"t="+new Date().getTime());
}
}

这样给url加上时间戳,可以有效解决本问题。

Categories: 感悟 Tags: , , ,

使用javascript从url获取参数值0+

1,281 views / 2009.09.01 / 6:06 下午

随着Ajax的泛滥,有时需要我们从url获取变量进行用户交互,本函数提供了获取方法:

function getQuery(name)
{
var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
var r = window.location.search.substr(1).match(reg);
if (r!=null) return unescape(r[2]); return null;
}

如需要从下面地址中获取id的值:

http://71j.cn/a.php?a=my&id=7&m=1

只需要在当前页面调用getQuery(“id”)即可。

Categories: 感悟 Tags: , ,