主题:【原创】javascript字串mysql的float -- 铁手
随手记个帐,供以后参考,也供有需要者参考。
最近改程序,碰到两个奇怪的问题,一个是和javascript 的 string 有关,一个是和 mysql的float有关。
先是javascript中的string。比如一个 var str="abcdefg" 这样的一个字符串,为了获得位置3处的字符值,按照以前的语言习惯,很自然的就开始用str[3]的方式,意想不到的是,在firefox,ie8工作很正常,但是在旧版ie中不行。规矩的做法,应该是用 charAt(3) 函数来获得相关值。实在是不明白为什么不能直接用[]来获取,而非得用 charAt()这样的,我觉得是大题小做的方式。新版的浏览器似乎承认这个做法了。将来为保险起见,还是应该用 charAt()。
再一个就是mysql中的float类型的字段。想当然的以为精度够高,用来作为index可以很好解决一个问题。结果,排序是可以,数值大小的比较就出现了问题。追究下去,给我的感觉是,存储的内容大小还是有差别,但是选择语句给出结果的时候,却是相同的。乘以一个大的整数,比如1百万,可能就能看出差异来。关于float类型的不可靠,在mysql的文档中实际上有说明,但是没注意到,被忽略了。按照文档说明,用decimal可以保证精确的值,但是内容保存方式和flaot不同,大概会增加不少内部操作,影响性能。
以后记得,能避免float尽可能避免,不能避免的情况下,用decimal。
假设你有多台服务器,为了提高性能,可能会考虑服务器之间有直接的网络连接,这样,服务器之间通信就不用经过路由,而是直接的点对点,传送速度会快很多。比如通过公开IP的PING需要几十毫秒的,点对点可能只需要不到1毫秒。
假设硬件连接已经完成,需要做的是进行软件设置。假设是两台服务器,每台当中都有两个网卡,一个网卡供外联(eth0),一个网卡供内联(eth1)。供内联的两个网卡之间用 cross connect 网线相连。
以下步骤在redhat这一系中实现。
1、修改 /etc/sysconfig/network-scripts/ifcfg-eth1 的内容为:
DEVICE=eth1
IPADDR=169.254.0.2
NETMASK=255.255.0.0
BOOTPROTO=static
ONBOOT=yes
TYPE=Ethernet
其中,169.254.0.0/16 这个ip地址块是被保留做 Link-local addressing 用,可以挑选里面的任何地址。
在另外一台服务器中,做同样的修改,但是取一个不同的ipaddress,比如 169.254.0.3
修改完毕保存后,在两台服务器中都执行下面的命令:
ifdown eth1
ifup eth1
之后,用命令 route 查看,会发现类似下面这行内容。
169.254.0.0 * 255.255.0.0 U 0 0 0 eth1
这时候,可以在一台服务器上 ping 另外一台服务器,比如在 169.254.0.2 上 ping 169.254.0.3,如果通了,就大功告成了。如果不能成功,关掉防火墙再试试看。一般情况下,防火墙需要重新设置来允许这些ip。
32位精度太低了,除非性能上有考虑,用64比较保险。
我觉得两台服务器之间的latency直接连跟通过switch连差别不大。我可以想到一些情况需要用网线直接连:
1 需要特别小的latency。有些高性能计算需要。比如模拟。
2 需要独立的带宽,比如storage server。
对于一般的web service的话,直接连似乎没有必要,内部的两台服务器之间最多通过本层的switch,不会去上层的router绕一圈的,所以区别不大。但设置要麻烦多了,而且不好扩展。
My two cents。
[3]表示的是第三个字节处的Byte值
而charAt(3)则是第三个字符,有不少语言考虑国际化的问题,第三个字符指的是第三个完整的字符。譬如“四大名捕之铁手”,第三个字符是“名”,而第三个Byte的值。。。就难说了
从新版的浏览器来看,对字符串的处理,的确是按照字符为基本单位,比如字符串的长度,都是按照字符来算,两个中文字算是2,两个字母,也算是2,用字节数就不一样了。老版的ie好像也是这样。
区别是在于[]的对待上,新的浏览器就当做是字符来处理了。这样就比较统一了。ie不知道是不是完全支持。
还是上个交换机吧,哪怕是个傻瓜的二层交换机。
如果只有两台服务器,这样直连没什么问题,如果服务器多了,就要在机器上再加网卡,加了网卡也就差不多成了一个软交换机了,还不如弄个背板带宽大的二层交换,如果是网站应用,应用横向扩展,不断加入server几乎是一定的,这样将来服务器往交换机上一叉就得。把网络部分和服务器区隔开,将来诊断故障也方便,如果将来有更高要求,也方便换高速网络。
至于 str[x]出错,那是IE支持问题(连IE8都不支持)和Byte无关——也就是说在FF下面 str[1] == str.charAt(1) (页面输出的头部编码要和文件本身的编码格式相同). 因为js内部是采用Unicode方式处理一切信息。
思维受到限制了,没想到服务商完全可以照我的意愿给我弄个自己的switch,只是多交点银子的问题。