Last-Modified: Wed, 18 Jun 2008 14:22:27 GMT
Cache-Control: max-age=600
Expires: Wed, 18 Jun 2008 14:48:39 GMT
Date: Wed, 18 Jun 2008 14:38:39 GMT
其中 Last-Modified 后面的日期是上次更新 config 的時間,Date 后面是當前時間,Expires 后面是當前時間 + 10分鐘,10分鐘就是 Cache-Control 后面的 max-age,單位是秒。因為看到 GAE 對 static 文件的 Cache 時間也是10分鐘,所以我使用了這個數字。
Last-Modified
如果客戶端收到的 Response 中包含 Last-Modified,那么下次 request 的時候就會在 Request Header 中包含 If-Modified-Since 字段,值就是上次服務器發送的 Last-Modified,服務器端會判斷上次的 config 時間是否比 If-Modified-Since 晚。如果自上次 request 之后又更新了 config,那么服務器就會返回完整的內容;如果期間沒有更新 config,那么服務器就沒必要返回完整的內容,只需要向客戶端發送一個 304 Not Modified 狀態碼就可以了。
Cache-Control、Date 和 Expires
這幾個參數的組合,表示告訴瀏覽器:這個文件在多長時間之內不會更改,在這個時間內不需要再 request,保守起見,我設置了10分鐘。
瀏覽器行為
如果只是在網站的鏈接之間 click click click,那么瀏覽器會完全遵守上述行為。這樣可以盡可能地減少請求次數,以及 response 的數據量。
如果在某個頁面點擊了瀏覽器的刷新按鈕或者按 F5,瀏覽器會忽略 Expires 時間,把該頁面需要的所有的文件都重新請求一遍。
如果按住 Ctrl 再刷新或者 Ctrl-F5 (俗稱強制刷新),瀏覽器將不會發送 Last-Modified Header,將所有需要的文件請求一遍,服務器會返回文件的完整內容,而不是僅僅一個 304 Not Modified 狀態碼。
后記
經初步觀察,現在瀏覽器不會每次都彪呼呼地去請求一大堆 css、jpg、gif 文件了,瀏覽器也不會每次都腦殘地返回完整內容了,看來是有效了。
最近在VPS上嘗試配置安裝一個網站,VPS安裝了LNMP(Linux+Nginx+MySQL+php)在配置重定規則的時候經常遇到一些問題,直接用Apache的規則到Nginx下沒起作用。原來Apache 重寫的規則到nginx上還有一些不太一樣的地方。
這里只是簡單記錄一些學習示例,高手略過,新手可以看一下。
Nginx Rewrite規則相關指令
Nginx Rewrite規則相關指令有if、rewrite、set、return、break等,其中rewrite是最關鍵的指令。一個簡單的Nginx Rewrite規則語法如下:
rewrite ^/b/(.*)\.html /play.php?video=$1 break;
如果加上if語句,示例如下:
if (!-f $request_filename)
rewrite ^/img/(.*)$ /site/$host/images/$1 last;
Nginx與Apache的Rewrite規則實例對比
簡單的Nginx和Apache 重寫規則區別不大,基本上能夠完全兼容。例如:
Apache Rewrite 規則:
RewriteRule ^/(mianshi|xianjing)/$ /zl/index.php?name=$1 [L]
RewriteRule ^/ceshi/$ /zl/ceshi.php [L]
RewriteRule ^/(mianshi)_([a-zA-Z]+)/$ /zl/index.php?name=$1_$2 [L]
RewriteRule ^/pingce([0-9]*)/$ /zl/pingce.php?id=$1 [L]
Nginx Rewrite 規則:
rewrite ^/(mianshi|xianjing)/$ /zl/index.php?name=$1 last;
rewrite ^/ceshi/$ /zl/ceshi.php last;
rewrite ^/(mianshi)_([a-zA-Z]+)/$ /zl/index.php?name=$1_$2 last;
rewrite ^/pingce([0-9]*)/$ /zl/pingce.php?id=$1 last;
由以上示例可以看出,Apache的Rewrite規則改為Nginx的Rewrite規則,其實很簡單:Apache的RewriteRule指令換成Nginx的rewrite指令,Apache的[L]標記換成Nginx的last標記,中間的內容不變。
如果Apache的Rewrite規則改為Nginx的Rewrite規則后,使用nginx -t命令檢查發現nginx.conf配置文件有語法錯誤,那么可以嘗試給條件加上引號。例如一下的Nginx Rewrite規則會報語法錯誤:
rewrite ^/([0-9]{5}).html$ /x.jsp?id=$1 last;
加上引號就正確了:
rewrite “^/([0-9]{5}).html$” /x.jsp?id=$1 last;
Apache與Nginx的Rewrite規則在URL跳轉時有細微的區別:
Apache Rewrite 規則:
RewriteRule ^/html/tagindex/([a-zA-Z]+)/.*$ /$1/ [R=301,L]
Nginx Rewrite 規則:
rewrite ^/html/tagindex/([a-zA-Z]+)/.*$ http://$host/$1/ permanent;
以上示例中,我們注意到,Nginx Rewrite 規則的置換串中增加了“http://$host”,這是在Nginx中要求的。
另外,Apache與Nginx的Rewrite規則在變量名稱方面也有區別,例如:
Apache Rewrite 規則:
RewriteRule ^/user/login/$ /user/login.php?login=1&forward=http://%{HTTP_HOST} [L]
Nginx Rewrite 規則:
rewrite ^/user/login/$ /user/login.php?login=1&forward=http://$host last;
Apache與Nginx Rewrite 規則的一些功能相同或類似的指令、標記對應關系:
Apache的RewriteCond指令對應Nginx的if指令;
Apache的RewriteRule指令對應Nginx的rewrite指令;
Apache的[R]標記對應Nginx的redirect標記;
Apache的[P]標記對應Nginx的last標記;
Apache的[R,L]標記對應Nginx的redirect標記;
Apache的[P,L]標記對應Nginx的last標記;
Apache的[PT,L]標記對應Nginx的last標記;
允許指定的域名訪問本站,其他域名一律跳轉到http://www.aaa.com
Apache Rewrite 規則:
RewriteCond %{HTTP_HOST} ^(.*?)\.domain\.com$
RewriteCond %{HTTP_HOST} !^qita\.domain\.com$
RewriteCond %{DOCUMENT_ROOT}/market/%1/index.htm -f
RewriteRule ^/wu/$ /market/%1/index.htm [L]
Nginx的if指令不支持嵌套,也不支持AND、OR等多條件匹配,相比于Apache的RewriteCond,顯得麻煩一些,但是,我們可以通過下一頁的Nginx配置寫法來實現這個示例:
Nginx Rewrite 規則:
if ($host ~* ^(.*?)\.domain\.com$) set $var_wupin_city $1;
set $var_wupin ‘1′;
if ($host ~* ^qita\.domain\.com$)
set $var_wupin ‘0′;
if (!-f $document_root/market/$var_wupin_city/index.htm)
set $var_wupin ‘0′;
if ($var_wupin ~ ‘1′)
rewrite ^/wu/$ /market/$var_wupin_city/index.htm last;
}
rewrite 的語法
語法: rewrite regex replacement flag
默認: none
作用域: server, location, if
This directive changes URI in accordance with the regular expression and the replacement string. Directives are carried out in order of appearance in the configuration file.
這個指令根據表達式來更改URI,或者修改字符串。指令根據配置文件中的順序來執行。
Be aware that the rewrite regex only matches the relative path instead of the absolute URL. If you want to match the hostname, you should use an if condition, like so:
注意重寫表達式只對相對路徑有效。如果你想配對主機名,你應該使用if語句。
rewrite只是會改寫路徑部分的東東,不會改動用戶的輸入參數,因此這里的if規則里面,你無需關心用戶在瀏覽器里輸入的參數,rewrite后會自動添加的,因此,我們只是加上了一個?號和后面我們想要的一個小小的參數 ***https=1就可以了。
nginx的rewrite規則參考:
- ~ 為區分大小寫匹配
- ~* 為不區分大小寫匹配
- !~和!~*分別為區分大小寫不匹配及不區分大小寫不匹
- -f和!-f用來判斷是否存在文件
- -d和!-d用來判斷是否存在目錄
- -e和!-e用來判斷是否存在文件或目錄
- -x和!-x用來判斷文件是否可執行
- last 相當于Apache里的[L]標記,表示完成rewrite,呵呵這應該是最常用的
- break 終止匹配, 不再匹配后面的規則
- redirect 返回302臨時重定向 地址欄會顯示跳轉后的地址
- permanent 返回301永久重定向 地址欄會顯示跳轉后的地址
- $args
- $content_length
- $content_type
- $document_root
- $document_uri
- $host
- $http_user_agent
- $http_cookie
- $limit_rate
- $request_body_file
- $request_method
- $remote_addr
- $remote_port
- $remote_user
- $request_filename
- $request_uri
- $query_string
- $scheme
- $server_protocol
- $server_addr
- $server_name
- $server_port
- $uri
結合QeePHP的例子
- if (!-d $request_filename) {
- rewrite ^/([a-z-A-Z]+)/([a-z-A-Z]+)/?(.*)$ /index.php?namespace=user&controller=$1&action=$2&$3 last;
- rewrite ^/([a-z-A-Z]+)/?$ /index.php?namespace=user&controller=$1 last;
- break;
多目錄轉成參數
abc.domian.com/sort/2 => abc.domian.com/index.php?act=sort&name=abc&id=2
- if ($host ~* (.*)\.domain\.com) {
- set $sub_name $1;
- rewrite ^/sort\/(\d+)\/?$ /index.php?act=sort&cid=$sub_name&id=$1 last;
- }
目錄對換
/123456/xxxx -> /xxxx?id=123456
- rewrite ^/(\d+)/(.+)/ /$2?id=$1 last;
例如下面設定nginx在用戶使用ie的使用重定向到/nginx-ie目錄下:
- if ($http_user_agent ~ MSIE) {
- rewrite ^(.*)$ /nginx-ie/$1 break;
- }
目錄自動加“/”
- if (-d $request_filename){
- rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
- }
禁止htaccess
- location ~/\.ht {
- deny all;
- }
禁止多個目錄
- location ~ ^/(cron|templates)/ {
- deny all;
- break;
- }
禁止以/data開頭的文件
可以禁止/data/下多級目錄下.log.txt等請求;
- location ~ ^/data {
- deny all;
- }
禁止單個目錄
不能禁止.log.txt能請求
- location /searchword/cron/ {
- deny all;
- }
禁止單個文件
- location ~ /data/sql/data.sql {
- deny all;
- }
給favicon.ico和robots.txt設置過期時間;
這里為favicon.ico為99天,robots.txt為7天并不記錄404錯誤日志
- location ~(favicon.ico) {
- log_not_found off;
- expires 99d;
- break;
- }
- location ~(robots.txt) {
- log_not_found off;
- expires 7d;
- break;
- }
設定某個文件的過期時間;這里為600秒,并不記錄訪問日志
- location ^~ /html/scripts/loadhead_1.js {
- access_log off;
- root /opt/lampp/htdocs/web;
- expires 600;
- break;
- }
文件反盜鏈并設置過期時間
這里的return 412 為自定義的http狀態碼,默認為403,方便找出正確的盜鏈的請求
“rewrite ^/ http://leech.divmy.com/leech.gif;”顯示一張防盜鏈圖片
“access_log off;”不記錄訪問日志,減輕壓力
“expires 3d”所有文件3天的瀏覽器緩存
- location ~* ^.+\.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ {
- valid_referers none blocked *.c1gstudio.com *.c1gstudio.net localhost 208.97.167.194;
- if ($invalid_referer) {
- rewrite ^/ http://leech.divmy.com/leech.gif;
- return 412;
- break;
- }
- access_log off;
- root /opt/lampp/htdocs/web;
- expires 3d;
- break;
- }
只充許固定ip訪問網站,并加上密碼
- root /opt/htdocs/www;
- allow 208.97.167.194;
- allow 222.33.1.2;
- allow 231.152.49.4;
- deny all;
- auth_basic “C1G_ADMIN”;
- auth_basic_user_file htpasswd;
將多級目錄下的文件轉成一個文件,增強seo效果
/job-123-456-789.html 指向/job/123/456/789.html
- rewrite ^/job-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /job/$1/$2/jobshow_$3.html last;
將根目錄下某個文件夾指向2級目錄
如/shanghaijob/ 指向 /area/shanghai/
如果你將last改成permanent,那么瀏覽器地址欄顯是/location/shanghai/
- rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;
上面例子有個問題是訪問/shanghai 時將不會匹配
- rewrite ^/([0-9a-z]+)job$ /area/$1/ last;
- rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;
這樣/shanghai 也可以訪問了,但頁面中的相對鏈接無法使用,
如./list_1.html真實地址是/area/shanghia/list_1.html會變成/list_1.html,導至無法訪問。
那我加上自動跳轉也是不行咯
(-d $request_filename)它有個條件是必需為真實目錄,而我的rewrite不是的,所以沒有效果
- if (-d $request_filename){
- rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
- }
知道原因后就好辦了,讓我手動跳轉吧
- rewrite ^/([0-9a-z]+)job$ /$1job/ permanent;
- rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;
文件和目錄不存在的時候重定向:
- if (!-e $request_filename) {
- proxy_pass http://127.0.0.1;
- }
域名跳轉
- server
- {
- listen 80;
- server_name jump.88dgw.com;
- index index.html index.htm index.php;
- root /opt/lampp/htdocs/www;
- rewrite ^/ http://www.88dgw.com/;
- access_log off;
- }
多域名轉向
- server_name www.7oom.com/ www.divmy.com/;
- index index.html index.htm index.php;
- root /opt/lampp/htdocs;
- if ($host ~ “c1gstudio\.net”) {
- rewrite ^(.*) http://www.7oom.com$1/ permanent;
- }
三級域名跳轉
- if ($http_host ~* “^(.*)\.i\.c1gstudio\.com$”) {
- rewrite ^(.*) http://top.88dgw.com$1/;
- break;
- }
域名鏡向
- server
- {
- listen 80;
- server_name mirror.c1gstudio.com;
- index index.html index.htm index.php;
- root /opt/lampp/htdocs/www;
- rewrite ^/(.*) http://www.divmy.com/$1 last;
- access_log off;
- }
某個子目錄作鏡向
- location ^~ /zhaopinhui {
- rewrite ^.+ http://zph.divmy.com/ last;
- break;
- }
discuz ucenter home (uchome) rewrite
- rewrite ^/(space|network)-(.+)\.html$ /$1.php?rewrite=$2 last;
- rewrite ^/(space|network)\.html$ /$1.php last;
- rewrite ^/([0-9]+)$ /space.php?uid=$1 last;
discuz 7 rewrite
- rewrite ^(.*)/archiver/((fid|tid)-[\w\-]+\.html)$ $1/archiver/index.php?$2 last;
- rewrite ^(.*)/forum-([0-9]+)-([0-9]+)\.html$ $1/forumdisplay.php?fid=$2&page=$3 last;
- rewrite ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/viewthread.php?tid=$2&extra=page\%3D$4&page=$3 last;
- rewrite ^(.*)/profile-(username|uid)-(.+)\.html$ $1/viewpro.php?$2=$3 last;
- rewrite ^(.*)/space-(username|uid)-(.+)\.html$ $1/space.php?$2=$3 last;
- rewrite ^(.*)/tag-(.+)\.html$ $1/tag.php?name=$2 last;
給discuz某版塊單獨配置域名
- server_name bbs.c1gstudio.com news.c1gstudio.com;
- location = / {
- if ($http_host ~ news\.divmy.com$) {
- rewrite ^.+ http://news.divmy.com/forum-831-1.html last;
- break;
- }
- }
discuz ucenter 頭像 rewrite 優化
- location ^~ /ucenter {
- location ~ .*\.php?$
- {
- #fastcgi_pass unix:/tmp/php-cgi.sock;
- fastcgi_pass 127.0.0.1:9000;
- fastcgi_index index.php;
- include fcgi.conf;
- }
- location /ucenter/data/avatar {
- log_not_found off;
- access_log off;
- location ~ /(.*)_big\.jpg$ {
- error_page 404 /ucenter/images/noavatar_big.gif;
- }
- location ~ /(.*)_middle\.jpg$ {
- error_page 404 /ucenter/images/noavatar_middle.gif;
- }
- location ~ /(.*)_small\.jpg$ {
- error_page 404 /ucenter/images/noavatar_small.gif;
- }
- expires 300;
- break;
- }
- }
jspace rewrite
- location ~ .*\.php?$
- {
- #fastcgi_pass unix:/tmp/php-cgi.sock;
- fastcgi_pass 127.0.0.1:9000;
- fastcgi_index index.php;
- include fcgi.conf;
- }
- location ~* ^/index.php/
- {
- rewrite ^/index.php/(.*) /index.php?$1 break;
- fastcgi_pass 127.0.0.1:9000;
- fastcgi_index index.php;
- include fcgi.conf;
- }
另外這里還有一個工具可以直接把apache規則轉化為nginx規則
http://www.anilcetin.com/convert-apache-htaccess-to-nginx/
參考:
http://wiki.nginx.org/NginxChsHttpRewriteModule
http://blog.csdn.net/cnbird2008/archive/2009/08/04/4409620.aspx
memcached如何處理容錯的?
不處理!:) 在memcached節點失效的情況下,集群沒有必要做任何容錯處理。如果發生了節點失效,應對的措施完全取決于用戶。節點失效時,下面列出幾種方案供您選擇:
* 忽略它! 在失效節點被恢復或替換之前,還有很多其他節點可以應對節點失效帶來的影響。
* 把失效的節點從節點列表中移除。做這個操作千萬要小心!在默認情況下(余數式哈希算法),客戶端添加或移除節點,會導致所有的緩存數據不可用!因為哈希參照的節點列表變化了,大部分key會因為哈希值的改變而被映射到(與原來)不同的節點上。
* 啟動熱備節點,接管失效節點所占用的IP。這樣可以防止哈希紊亂(hashing chaos)。
”
同學們,根據上面的說法,memcached其中一個節點失效以后,memcached本身是沒有任何策略維持失效轉發的,這對于大型系統是一個無法接受的事實。 Memcached分布式每個服務器端本身沒有相互相連的關系,數據分布是由客戶端來維持的,也可以說Memcached還沒有為集群提供真的高可用方案,因為從集群的定義上來說需要滿足:1.壓力分載 2.失效轉發。
在項目組中lianjie.you同學問我如果在分布式中的其中一臺Memcached節點down掉了,應該如何解決?我當時愣住了,一時之間還不能給出任何完整的答案。
今早在座公車來上班的路上用手機上網Google了一下,發現原來在網上有很多人與我們有相同的問題,我Google的關鍵字是 “Memcached 單點” 、“Memcached 單點故障”。給出的搜索結果都不算讓人滿意,我才打算寫一篇關于解決集群中Memcached單點故障的文章。Javabloger只向大家提供2種解決 思路,暫時不提供具體代碼。
現象描述:
在客戶端連接的部分寫入多個服務器端的ip地址,客戶端將會自動的把緩存數據分布的放在每個不同的機器上,如圖所示:
現象后果:
如果其中一個緩存節點的機器down機,那么客戶端存入的緩存數據將會丟失一部分,就是圖中紅色字體描述的“Losed 33% Cache Data”,也就是說那部分數據徹底沒有了!如果是用戶的關鍵性信息那么就玩大了,如圖所示:
查看大圖請點擊這里
解決方案1:本地備份緩存
在本地放一份緩存,同時也在分布式Memcached上放一份緩存,如果當其中一臺節點當機了,客戶端程序直接讀取本地的緩存,本地客戶端維護一個HashMap即可,這樣的方案雖然很簡陋,但是可以滿足一部分場景的需要,當你很急需的時候可以作為臨時方案暫時替代一下。
解決方案2:采用緩存代理服務器
采用 Magent 緩存代理,防止單點現象,緩存代理也可以做備份,通過客戶端連接到緩存代理服務器,緩存代理服務器連接緩存服務器,緩存代理服務器可以連接多臺Memcached機器可以將每臺Memcached機器進行數據同步。這樣的架構比較完善了,如果其中一臺緩存代理服務器down機,系統依然可以繼續工作,如果其中一臺Memcached機器down掉,數據不會丟失并且可以保證數據的完整性,以上描述的系統架構如圖所示:

查看大圖請點擊這里
還是那句話:沒有任何架構是最完美的,只是最合適的,任何架構都不可能一步到位,都是經過一步一步演變過來的。
不處理!:) 在memcached節點失效的情況下,集群沒有必要做任何容錯處理。如果發生了節點失效,應對的措施完全取決于用戶。節點失效時,下面列出幾種方案供您選擇:
* 忽略它! 在失效節點被恢復或替換之前,還有很多其他節點可以應對節點失效帶來的影響。
* 把失效的節點從節點列表中移除。做這個操作千萬要小心!在默認情況下(余數式哈希算法),客戶端添加或移除節點,會導致所有的緩存數據不可用!因為哈希參照的節點列表變化了,大部分key會因為哈希值的改變而被映射到(與原來)不同的節點上。
* 啟動熱備節點,接管失效節點所占用的IP。這樣可以防止哈希紊亂(hashing chaos)。
”
同學們,根據上面的說法,memcached其中一個節點失效以后,memcached本身是沒有任何策略維持失效轉發的,這對于大型系統是一個無法接受的事實。
Memcached分布式每個服務器端本身沒有相互相連的關系,數據分布是由客戶端來維持的,也可以說Memcached還沒有為集群提供真的高可用方案,因為從集群的定義上來說需要滿足:1.壓力分載 2.失效轉發。
在項目組中lianjie.you同學問我如果在分布式中的其中一臺Memcached節點down掉了,應該如何解決?我當時愣住了,一時之間還不能給出任何完整的答案。
今早在座公車來上班的路上用手機上網Google了一下,發現原來在網上有很多人與我們有相同的問題,我Google的關鍵字是 “Memcached 單點” 、“Memcached 單點故障”。給出的搜索結果都不算讓人滿意,我才打算寫一篇關于解決集群中Memcached單點故障的文章。Javabloger只向大家提供2種解決 思路,暫時不提供具體代碼。
現象描述:
在客戶端連接的部分寫入多個服務器端的ip地址,客戶端將會自動的把緩存數據分布的放在每個不同的機器上,如圖所示:
現象后果:
如果其中一個緩存節點的機器down機,那么客戶端存入的緩存數據將會丟失一部分,就是圖中紅色字體描述的“Losed 33% Cache Data”,也就是說那部分數據徹底沒有了!如果是用戶的關鍵性信息那么就玩大了,如圖所示:
查看大圖請點擊這里
解決方案1:本地備份緩存
在本地放一份緩存,同時也在分布式Memcached上放一份緩存,如果當其中一臺節點當機了,客戶端程序直接讀取本地的緩存,本地客戶端維護一個HashMap即可,這樣的方案雖然很簡陋,但是可以滿足一部分場景的需要,當你很急需的時候可以作為臨時方案暫時替代一下。
解決方案2:采用緩存代理服務器
采用 Magent 緩存代理,防止單點現象,緩存代理也可以做備份,通過客戶端連接到緩存代理服務器,緩存代理服務器連接緩存服務器,緩存代理服務器可以連接多臺Memcached機器可以將每臺Memcached機器進行數據同步。這樣的架構比較完善了,如果其中一臺緩存代理服務器down機,系統依然可以繼續工作,如果其中一臺Memcached機器down掉,數據不會丟失并且可以保證數據的完整性,以上描述的系統架構如圖所示:
查看大圖請點擊這里
還是那句話:沒有任何架構是最完美的,只是最合適的,任何架構都不可能一步到位,都是經過一步一步演變過來的。
sudo vim /home/admin/{app}/conf/tomcat-server.xml
修改 HTTP/1.1 Connector中的maxPostSize="10000"
以及AJP 1.3 Connector中的maxPostSize="10000"
然后
sudo -u admin cp /home/admin/{app}/conf/tomcat-server.xml /home/admin/{app}/.default/deploy/jboss-web.deployer/server.xml
sudo -u admin /home/admin/{app}/bin/jbossctl restart {app}
最后檢查一下應用
常見的服務器會將用戶post的數據保存在hashmap中. 而向hashmap中插入n對元素的時間復雜度大約是O(n), 但如果精心構造key使得每個key的hash值相同(也就是產生了碰撞),則時間復雜度會惡化到O(n^2),導致消耗大量的CPU時間.
經測試,在tomcat6服務器上, 總大小2MByte的數據就需要消耗一個i7CPU core44分鐘,也就是6kbit/s就可以讓這個CPU core一直忙碌. 所以只要一個G兆網絡就能讓100000個i7CPU core一直忙.
再說下相同hash值key的構造:
在java中,字符串的hash函數采用DJBX33A,只不過常數因子改為了31. 這樣的函數有個特點,即如果字符串X, Y的hash值相同,那么X,Y都添加任意相同的前綴或后綴的以后的hash值也都相同.比如: "rQ"與 "qp"的hash值相同, 則"rQrQ", "rQqp", "qprQ", "qpqp" 這四個也相同,繼續這個模式就可以很容易構造出 2^n 個 2*n長度的不同字符串
一、棧內存 基礎類型int, short, long, byte, float, double, boolean, char和對象引用 棧的共享特性 String str1 = "abc"; 1、編譯器先處理String str1 = "abc";它會在棧中創建一個變量為str1的引用,然后查找棧中是否有abc這個值,如果沒找到,就將abc存放進來,然后將str1指向abc。 2、 接著處理String str2 = "abc";在創建完b的引用變量后,因為在棧中已經有abc這個值,便將str2直接指向abc。這樣,就出現了str1與str2同時均指向abc的情況。 二、堆內存 new、newarray、anewarray和multianewarray等指令建立 要注意: 我們在使用諸如String str = "abc";的格式定義類時,總是想當然地認為,創建了String類的對象str。擔心陷阱!對象可能并沒有被創建!而可能只是指向一個先前已經創建的 對象。只有通過new()方法才能保證每次都創建一個新的對象。 由于String類的immutable性質,當String變量需要經常變換其值時,應該考慮使用StringBuffer類,以提高程序效率。 三、 == 內存地址比對 String str1 = "abc"; String str3 = "abc"; System.out.println(str3 == str4); //flase str3值在棧內存中,str4值在堆內存中 String hello = "hello" ; String hel = "hel" ; String lo = "lo" ; System.out.println(hello == "hel" + "lo") ; //true //兩個常量相加,先檢測棧內存中是否有hello如有有,指向已有的棧中的hello空間 System.out.println(hello == "hel" + lo) ; //flase System.out.println(hello == hel + lo) ; //flase //lo是在常量池中,不檢查棧內存,在堆中產生一個新的hello 四、 equals 值進行比對 public boolean equals(Object anObject) 將此字符串與指定的對象比較。當且僅當該參數不為 null,并且是與此對象表示相同字符序列的 String 對象時,結果才為 true。 String str5 = "abc"; System.out.println(str5.equals(str6)); //true str5的值str6的值比對 五、 intern 棧中值的內存地址 Public String intern() 當調用 intern 方法時 1、如果池已經包含一個等于此 String 對象的字符串(用equals(Object) 方法確定),則返回池中的字符串。 2、將此 String 對象添加到池中,并返回此 String 對象的引用。 String s7 = new String("abc") ; String s8 = "abc" ; System.out.println(s7 == s7.intern()) ;//flase; System.out.println(s8 == s7.intern() );//true 1.檢查棧內存中有沒有abc對象如果有 2.將s7指向pool中abc |
javascript 手機號碼正則表達式驗證函數
//ip與域名驗證函數
function checkIP()
{
var ipArray,ip,j;
ip = document.ipform.ip.value;
if(/[A-Za-z_-]/.test(ip)){
if (ip.indexOf(" ")>=0){
ip = ip.replace(/ /g,"");
document.ipform.ip.value = ip;
}
if (ip.toLowerCase().indexOf("http://")==0){
ip = ip.slice(7);
document.ipform.ip.value = ip;
}
if(!/^([\w-]+\.)+((com)|(net)|(org)|(gov\.cn)|(info)|(cc)|(com\.cn)|(net\.cn)|(org\.cn)|(name)|(biz)|(tv)|(cn)|(mobi)|(name)|(sh)|(ac)|(io)|(tw)|(com\.tw)|(hk)|(com\.hk)|(ws)|(travel)|(us)|(tm)|(la)|(me\.uk)|(org\.uk)|(ltd\.uk)|(plc\.uk)|(in)|(eu)|(it)|(jp))$/.test(ip)){
alert("不是正確的域名");
document.ipform.ip.focus();
return false;
}
}
else{
ipArray = ip.split(".");
j = ipArray.length
if(j!=4)
{
alert("不是正確的IP");
document.ipform.ip.focus();
return false;
}
for(var i=0;i<4;i++)
{
if(ipArray[i].length==0 || ipArray[i]>255)
{
alert("不是正確的IP");
document.ipform.ip.focus();
return false;
}
}
}
}
//手機號碼驗證函數
function checkMobile(){
var sMobile = document.mobileform.mobile.value
if(!(/^1[3|4|5|8][0-9]\d{4,8}$/.test(sMobile))){
alert("不是完整的11位手機號或者正確的手機號前七位");
document.mobileform.mobile.focus();
return false;
}
}
//郵政編碼驗證函數
function checkZip(){
var sZip = document.zipform.zip.value
if(!(/^\d{4,6}$/.test(sZip))){
alert("請輸入郵政編碼前4-6位");
return false;
}
}
//區號驗證
function checkZone(){
var sZone = document.zoneform.zone.value
if(!(/^0\d{2,6}$/.test(sZone))){
alert("請輸入以“0”開頭的3-7位區號");
return false;
}
}
//身份證驗證
function checkID(){
var sID = document.IDform.userid.value
if(!(/^\d{15}$|^\d{18}$|^\d{17}[xX]$/.test(sID))){
alert("請輸入15位或18位身份證號");
document.IDform.userid.focus();
return false;
}

















先排A ,后排B ,,,以B為最優先級
JAVA_HOME=C:\j2sdk1.4.2_04
CLASSPATH=.;C:\j2sdk1.4.2_04\lib\tools.jar;C:\j2sdk1.4.2_04\lib\dt.jar;C:\j2sdk1.4.2_04
\bin;
path=C:\j2sdk1.4.2_04\bin;
接口編程








