<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    少年阿賓

    那些青春的歲月

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks

    #

    1、冒泡排序:
    冒泡排序(BubbleSort)的基本概念是:依次比較相鄰的兩個(gè)數(shù),將小數(shù)放在前面,大數(shù)放在后面。即在第一趟:首先比較第1個(gè)和第2個(gè)數(shù),將小數(shù)放前,大數(shù)放后。然后比較第2個(gè)數(shù)和第3個(gè)數(shù),將小數(shù)放前,大數(shù)放后,如此繼續(xù),直至比較最后兩個(gè)數(shù),將小數(shù)放前,大數(shù)放后。至此第一趟結(jié)束,將最大的數(shù)放到了最后。在第二趟:仍從第一對(duì)數(shù)開始比較(因?yàn)榭赡苡捎诘?個(gè)數(shù)和第3個(gè)數(shù)的交換,使得第1個(gè)數(shù)不再小于第2個(gè)數(shù)),將小數(shù)放前,大數(shù)放后,一直比較到倒數(shù)第二個(gè)數(shù)(倒數(shù)第一的位置上已經(jīng)是最大的),第二趟結(jié)束,在倒數(shù)第二的位置上得到一個(gè)新的最大數(shù)(其實(shí)在整個(gè)數(shù)列中是第二大的數(shù))。如此下去,重復(fù)以上過程,直至最終完成排序。

    具體代碼例一:

    package com.abin.lee.algorithm.bubble;

    public class BubbleSort {
     public static void main(String[] args) {
      int[] start={5,2,1,3,6,4};
      int[] end=sort(start);
      for(int i=0;i<end.length;i++){
       System.out.println("end["+i+"]="+end[i]);
      }
     }
     
     public static int[] sort(int[] input){
      int temp=0;

      //最多做n-1趟排序
      for(int i=0;i<input.length-1;i++){
        //對(duì)當(dāng)前無序區(qū)間score[0......length-i-1]進(jìn)行排序(j的范圍很關(guān)鍵,這個(gè)范圍是在逐步縮小的)
       for(int j=0;j<input.length-i-1;j++){
        //把大的值交換到后面
        if(input[j]>input[j+1]){
         temp=input[j];
         input[j]=input[j+1];
         input[j+1]=temp;
        }
        StringBuffer stb=new StringBuffer();
        for(int k=0;k<input.length;k++){
         stb.append("input["+k+"]="+input[k]+" ");
        }
        System.out.println("i="+i+",j="+j+" = "+stb.toString());
       }
      }
      return input;
     }

     

    }


    2、選擇排序:
    選擇排序(Straight Select Sorting) 也是一種簡(jiǎn)單的排序方法,它的基本思想是:第一次從R[0]~R[n-1]中選取最小值,與R[0]交換,第二次從R{1}~R[n-1]中選取最小值,與R[1]交換,....,   第i次從R[i-1]~R[n-1]中選取最小值,與R[i-1]交換,.....,第n-1次從R[n-2]~R[n-1]中選取最小值,與R[n-2]交換,總共通過n-1次,得到一個(gè)按排序碼從小到大排列的有序序列.
    具體代碼:

    package com.abin.lee.algorithm.select;

    public class SelectSort {
     public static void main(String[] args) {
      int[] start={5,2,3,1,6,4};
      start=sort(start);
      for(int i=0;i<start.length;i++){
       System.out.println("start["+i+"]="+start[i]);
      }
     }
     public static int[] sort(int[] input){
      int temp=0;
      for(int i=0;i<input.length;i++){
       for(int j=i+1;j<input.length;j++){
        if(input[i]>input[j]){
         temp=input[i];
         input[i]=input[j];
         input[j]=temp;
        }
        StringBuffer stb=new StringBuffer();
        for(int k=0;k<input.length;k++){
         stb.append("input["+k+"]="+input[k]+" ");
        }
        System.out.println("i="+i+",j="+j+" = "+stb.toString());
       }
      }
      return input;
     }
    }




    3、請(qǐng)輸入一個(gè)數(shù)字,比如4,輸出為:
    1
    2 3
    4 5 6
    7 8 9 10

    代碼如下:

    package com.abin.lee.photo;

    public class TestInputNumber {
     public static void main(String[] args) {
      int n=4;
      output(n);
     }
     public static void output(int n){
      int temp=1;
      for(int i=1;i<=n;i++){
       for(int j=0;j<i;j++){
        System.out.print(temp+" ");
        temp++;
       }
       System.out.println("");
      }
      
     }
    }


    4.二叉樹算法

    package com.abin.lee.algorithm.binary;

    public class BinaryNode {
     public int data;//根節(jié)點(diǎn)
     BinaryNode left;//左節(jié)點(diǎn)
     BinaryNode right;//右節(jié)點(diǎn)
     
     public BinaryNode(int data,BinaryNode left,BinaryNode right) {
      this.data=data;
      this.left=left;
      this.right=right;
     }
     
     public int getData() {
      return data;
     }
     public void setData(int data) {
      this.data = data;
     }
     public BinaryNode getLeft() {
      return left;
     }
     public void setLeft(BinaryNode left) {
      this.left = left;
     }
     public BinaryNode getRight() {
      return right;
     }
     public void setRight(BinaryNode right) {
      this.right = right;
     }
    }




    package com.abin.lee.algorithm.binary;

    public class BinaryTree {
     //前序遍歷
     public static void preOrder(BinaryNode root){
      if(null!=root){
       System.out.print(root.data+"-");
       preOrder(root.left);
       preOrder(root.right);
      }
     }
     //中序遍歷
     public static void inOrder(BinaryNode root){
      if(null!=root){
       inOrder(root.left);
       System.out.print(root.data+"--");
       inOrder(root.right);
      }
     }
     //后序遍歷
     public static void postOrder(BinaryNode root){
      if(null!=root){
       postOrder(root.left);
       postOrder(root.right);
       System.out.print(root.data+"---");
      }
     }
     
     public static void main(String[] args) {
      BinaryNode one=new BinaryNode(1,null,null);
      BinaryNode three=new BinaryNode(3,null,null);
      BinaryNode two=new BinaryNode(2,three,one);
      BinaryNode four=new BinaryNode(4,one,two);
      BinaryNode five=new BinaryNode(5,four,one);
      System.out.println("preOrder");
      preOrder(five);
      System.out.println();
      System.out.println("inOrder");
      inOrder(five);
      System.out.println();
      System.out.println("postOrder");
      postOrder(five);
      System.out.println();
      
     }

    }


    輸出結(jié)果:
    preOrder
    5-4-1-2-3-1-1-
    inOrder
    1--4--3--2--1--5--1--
    postOrder
    1---3---1---2---4---1---5---




    5、java插入排序

    插入式排序法——插入排序法

    插入排序(Insertion Sortion)的基本思想是:把n個(gè)待排序的元素看成一個(gè)有序表和一個(gè)無序表,開始有序表只包含一個(gè)元素,無序表中包含n-1個(gè)元素,排序過程中每次從無序表中取出第一個(gè)元素,把它的排序碼依次與有序表元素的排序碼進(jìn)行比較,將它插入到有序表中的適當(dāng)位置,使之成為新的有序表。


    public class InjectionSort  //定義一個(gè) InjectionSort 類
    public static void injectionSort(int[] number) //傳數(shù)組
    for(int j = 1;j<number.length;j++)//循環(huán)
    int tmp = number[j]; //循環(huán)把數(shù)組第二個(gè)值放到tmp里
    int i = j-1//給i 賦值
    while(tmp<number[i]) //tmp值和數(shù)組第一個(gè)值比較誰小
    number[i+1] = number[i]; //如果小于就把第一個(gè)值賦值給第二個(gè)
    i--;
    if(i == -1)//如果i值=-1
    break; //退出循環(huán)
    number[i+1] = tmp //因?yàn)楸容^數(shù)組里的前一個(gè)比后一個(gè)這樣就換交了實(shí)現(xiàn)了把小的放在前面
    這是第一次,因?yàn)檠h(huán)是一個(gè)數(shù)組,后邊的就一次往下循環(huán),最后就把數(shù)組里的順序從小到大排序了
    public static void main(String[] args){
    int[] num = {5,46,26,67,2,35};//定義數(shù)組num
    injectionSort(num);//調(diào)用方法
    for(int i = 0;i<num.length;i++){
    System.out.println(num[i]);//顯示排序后的數(shù)組,一行顯示一個(gè)值

    簡(jiǎn)單說就是數(shù)組里第二個(gè)和第一個(gè)比誰小,把小的放到第一個(gè)里,大的放到第二個(gè)里,然后第二個(gè)再和第三個(gè)比,小的還是放在前,一直比到這個(gè)數(shù)組結(jié)束,這樣就實(shí)現(xiàn)了從小到大,希望我說的夠詳細(xì)


    插入排序代碼while循環(huán):
    package com.abin.lee.algorithm.insert;
    public class InsertSort {
    public static void main(String[] args) {
    int[] input = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
    input=sort(input);
    for (int i = 0; i < input.length; i++) {
    System.out.print(input[i] + "  ");
    }
    }
    public static int[] sort(int[] input) {
    for (int i = 1; i < input.length; i++) {
    int insertVal = input[i];
    // insertValue準(zhǔn)備和前一個(gè)數(shù)比較
    int index = i - 1;
    while (index >= 0 && insertVal < input[index]) {
    // 將把input[index]向后移動(dòng)
    input[index + 1] = input[index];
    // 讓index向前移動(dòng)一位
    index--;
    }
    // 將insertValue插入到適當(dāng)位置
    input[index + 1] = insertVal;
    //下面這個(gè)循環(huán)是為了打印一下中間的循環(huán)看看是不是插入排序的正確算法
    StringBuffer stb=new StringBuffer();
    for(int k=0;k<input.length;k++){
    stb.append(input[k]+" ");
    }
    System.out.println("i="+i+" = "+stb.toString());
    }
    return input;
    }
    }


    插入排序for循環(huán)代碼:

    package com.abin.lee.algorithm.insert;
    public class DoInsertSort {
    public static void main(String[] args) {
    int[] input={5,4,6,3,7,2,8,1,0,9};
    input=sort(input);
    for(int i=0;i<input.length;i++){
    System.out.print("input["+i+"]="+input[i]+" ");
    }
    }
    public static int[] sort(int[] input){
    for(int i=1;i<input.length;i++){
    int temp=input[i];
    int j;
    for(j=i;j>0;j--){
    if(temp<input[j-1]){
    input[j]=input[j-1];
    }else{
    break;
    }
    }
    input[j]=temp;
    //下面這個(gè)循環(huán)是為了打印一下中間的循環(huán)看看是不是插入排序的正確算法
    StringBuffer stb=new StringBuffer();
    for(int k=0;k<input.length;k++){
    stb.append(input[k]+" ");
    }
    System.out.println("i="+i+" = "+stb.toString());
    }
    return input;
    }
    }


     

    二分查找又稱折半查找,它是一種效率較高的查找方法。

    折半查找的算法思想是將數(shù)列按有序化(遞增或遞減)排列,查找過程中采用跳躍式方式查找,即先以有序數(shù)列的中點(diǎn)位置為比較對(duì)象,如果要找的元素值小于該中點(diǎn)元素,則將待查序列縮小為左半部分,否則為右半部分。通過一次比較,將查找區(qū)間縮小一半。 折半查找是一種高效的查找方法。它可以明顯減少比較次數(shù),提高查找效率。但是,折半查找的先決條件是查找表中的數(shù)據(jù)元素必須有序。

    package com.abin.algorithm.template.half;

    public class BinarySearch {
    public static void main(String[] args) {
    int[] src=new int[]{1,3,5,7,9,11};
    int result=binarySearch(src, 3);
    System.out.println("result="+result);
    int status=binarySearch(src, 9 ,0 ,src.length);
    System.out.println("status="+status);
    }
    //循環(huán)實(shí)現(xiàn)
    public static int binarySearch(int[] src,int key){
    int low=0;
    int high=src.length-1;
    while(low<=high){
    int middle=(low+high)/2;
    if(key==src[middle]){
    return middle;
    }else if(key<src[middle]){
    high=middle-1;
    }else{
    low=middle+1;
    }
    }
    return -1;
    }
    //遞歸實(shí)現(xiàn)
    public static int binarySearch(int[] src,int key,int low,int high){
    int middle=(low+high)/2;
    if(src[middle]==key){
    return middle;
    }else if(low>=high){
    return -1;
    }else if(src[middle]>key){
    return binarySearch(src, key, low, middle-1);
    }else if(src[middle]<key){
    return binarySearch(src, key, middle+1, high);
    }
    return -1;
    }

    }


    posted @ 2013-09-05 16:27 abin 閱讀(588) | 評(píng)論 (0)編輯 收藏

    <style type="text/css">
    div.remark
    {
    white-space:nowrap; 
    width:6em; 
    overflow:hidden;
    text-overflow:ellipsis;
        }
    </style>
    <div class="remark">${refundApply.remarks }</div> 
    posted @ 2013-09-04 16:14 abin 閱讀(1230) | 評(píng)論 (4)編輯 收藏

    repcached實(shí)現(xiàn)memcached的復(fù)制功能:
    repcached是日本人開發(fā)的實(shí)現(xiàn)memcached復(fù)制功能,它是一個(gè)單 master單 slave的方案,但它的 master/slave都是可讀寫的,而且可以相互同步,如果 master壞掉, slave偵測(cè)到連接斷了,它會(huì)自動(dòng) listen而成為 master;而如果 slave壞掉, master也會(huì)偵測(cè)到連接斷,它就會(huì)重新 listen等待新的 slave加入
    安裝:
    先安裝memcached(我安裝的1.2.8)
    有兩種方式:
    方式一、下載對(duì)應(yīng)的repcached版本
    #wget http://downloads.sourceforge.net/repcached/memcached-1.2.8-repcached-2.2.tar.gz
    #tar zxf memcached-1.2.8-repcached-2.2.tar.gz
    #cd memcached-1.2.8-repcached-2.2
    方式二、下載對(duì)應(yīng)patch版本
    #wget http://downloads.sourceforge.net/repcached/repcached-2.2-1.2.8.patch.gz
    #gzip -cd ../repcached-2.2-1.2.8.patch.gz | patch -p1
    #./configure --enable-replication
    # make
    # make install
    啟動(dòng):
    啟動(dòng)master
    #memcached -v -l 192.168.50.240 -p 11211 -uroot
    replication: listen (master監(jiān)聽)
    啟動(dòng)salve
    #memcached -v -l 192.168.50.241 -p 11213 -uroot -x 127.0.0.1 -X 11212
    replication: connect (peer=192.168.50.240:11212)
    replication: marugoto copying
    replication: start
    啟動(dòng)正常后,masteraccept測(cè)試:
    操作master
    #telnet 192.168.50.240 11211
    #set key1 0 0 3
    111
    查看slave
    #telnet 192.168.50.241 11213
    #get key1
    如果正常表示,配置成功
    應(yīng)用:
    可以實(shí)現(xiàn)cache冗余
    注意:如果master down機(jī),slave接管并成為master,這時(shí)down機(jī)的master只能啟用slave,他們之間互換角色,才能保持復(fù)制功能。換句話說,master沒有搶占功能。
    posted @ 2013-08-24 17:15 abin 閱讀(731) | 評(píng)論 (0)編輯 收藏

    一、Memcache內(nèi)存分配機(jī)制

            關(guān)于這個(gè)機(jī)制網(wǎng)上有很多解釋的,我個(gè)人的總結(jié)如下。

    1. Page為內(nèi)存分配的最小單位。

      Memcached的內(nèi)存分配以page為單位,默認(rèn)情況下一個(gè)page是1M,可以通過-I參數(shù)在啟動(dòng)時(shí)指定。如果需要申請(qǐng)內(nèi)存時(shí),memcached會(huì)劃分出一個(gè)新的page并分配給需要的slab區(qū)

    2.  

    3.  

    4. 域。page一旦被分配在重啟前不會(huì)被回收或者重新分配(page ressign已經(jīng)從1.2.8版移除了) 

    5. Slabs劃分?jǐn)?shù)據(jù)空間。

      Memcached并不是將所有大小的數(shù)據(jù)都放在一起的,而是預(yù)先將數(shù)據(jù)空間劃分為一系列slabs,每個(gè)slab只負(fù)責(zé)一定范圍內(nèi)的數(shù)據(jù)存儲(chǔ)。如下圖,每個(gè)slab只存儲(chǔ)大于其上一個(gè)slab的size并小于或者等于自己最大size的數(shù)據(jù)。例如:slab 3只存儲(chǔ)大小介于137 到 224 bytes的數(shù)據(jù)。如果一個(gè)數(shù)據(jù)大小為230byte將被分配到slab 4中。從下圖可以看出,每個(gè)slab負(fù)責(zé)的空間其實(shí)是不等的,memcached默認(rèn)情況下下一個(gè)slab的最大值為前一個(gè)的1.25倍,這個(gè)可以通過修改-f參數(shù)來修改增長(zhǎng)比例。 

    6.   

    7. Chunk才是存放緩存數(shù)據(jù)的單位。

      Chunk是一系列固定的內(nèi)存空間,這個(gè)大小就是管理它的slab的最大存放大小。例如:slab 1的所有chunk都是104byte,而slab 4的所有chunk都是280byte。chunk是memcached實(shí)際存放緩存數(shù)據(jù)的地方,因?yàn)閏hunk的大小固定為slab能夠存放的最大值,所以所有分配給當(dāng)前slab的數(shù)據(jù)都可以被chunk存下。如果時(shí)間的數(shù)據(jù)大小小于chunk的大小,空余的空間將會(huì)被閑置,這個(gè)是為了防止內(nèi)存碎片而設(shè)計(jì)的。例如下圖,chunk size是224byte,而存儲(chǔ)的數(shù)據(jù)只有200byte,剩下的24byte將被閑置。 

    8.  


    9.  

    10. Slab的內(nèi)存分配。

      Memcached在啟動(dòng)時(shí)通過-m指定最大使用內(nèi)存,但是這個(gè)不會(huì)一啟動(dòng)就占用,是隨著需要逐步分配給各slab的。
               如果一個(gè)新的緩存數(shù)據(jù)要被存放,memcached首先選擇一個(gè)合適的slab,然后查看該slab是否還有空閑的chunk,如果有則直接存放進(jìn)去;如果沒有則要進(jìn)行申請(qǐng)。slab申請(qǐng)內(nèi)存時(shí)以page為單位,所以在放入第一個(gè)數(shù)據(jù),無論大小為多少,都會(huì)有1M大小的page被分配給該slab。申請(qǐng)到page后,slab會(huì)將這個(gè)page的內(nèi)存按chunk的大小進(jìn)行切分,這樣就變成了一個(gè)chunk的數(shù)組,在從這個(gè)chunk數(shù)組中選擇一個(gè)用于存儲(chǔ)數(shù)據(jù)。如下圖,slab 1和slab 2都分配了一個(gè)page,并按各自的大小切分成chunk數(shù)組。 

    11.  


    12.  

    13. Memcached內(nèi)存分配策略。

      綜合上面的介紹,memcached的內(nèi)存分配策略就是:按slab需求分配page,各slab按需使用chunk存儲(chǔ)。
      這里有幾個(gè)特點(diǎn)要注意,

      1. Memcached分配出去的page不會(huì)被回收或者重新分配
      2. Memcached申請(qǐng)的內(nèi)存不會(huì)被釋放
      3. slab空閑的chunk不會(huì)借給任何其他slab使用
         每一個(gè)slab=1M   切分的chunk個(gè)數(shù)=1M/最小的chunk大小
        下一個(gè)chunk=上一個(gè)chunk大小*增長(zhǎng)因子


     

          知道了這些以后,就可以理解為什么總內(nèi)存沒有被全部占用的情況下,memcached卻出現(xiàn)了丟失緩存數(shù)據(jù)的問題了。
    *******************
    當(dāng)存儲(chǔ)的值item大于1M的時(shí)候:

    按照官方解釋,當(dāng)大于1M時(shí),按現(xiàn)有的 slab allocation內(nèi)存分配管理機(jī)制,memcache的存取效率會(huì)下降很多,就失去了使用memcache的意義,之所以用memcache,一大原因就是它比數(shù)據(jù)庫速度快,如果失去了速度優(yōu)勢(shì),就沒意思了。
     支持大于1M的方法 官方也給出了:一個(gè)是還是使用slab allocation 機(jī)制修改源代碼中 POWER_BLOCK  的值,然后重新編譯。另一個(gè)方法是使用低效的 malloc/free 分配機(jī)制。 
     如果某個(gè)常用slab滿了  而且又沒開啟LRU,會(huì)出現(xiàn)命中低的情況·

     1M/最小的chunk=存儲(chǔ)的個(gè)數(shù)
    然后第二個(gè)chunk=第一個(gè)chunk*1.25
    這樣1M被不斷的分
    切到最后1M只能存一個(gè)chunk

      1M 用完會(huì)申請(qǐng)一個(gè)新的 1M

    但是 不能超過你的最大內(nèi)存數(shù)
    超過了 就開始回收
    也就是LRU
     當(dāng)memcache每次在get的時(shí)候會(huì)檢測(cè)key所對(duì)應(yīng)的value過期時(shí)間  那么當(dāng)檢測(cè)到此item過期了 value會(huì)被清除  key呢 保留 還是也會(huì)被清除 ?
    不會(huì)被清除,只會(huì)返回空
    直到lru覆蓋這個(gè)過期值
    那就是當(dāng)我程序棄用了大量的key時(shí)  cmd_get時(shí) 這些key 還會(huì)被掃描到?
    不會(huì)
    只是還存在內(nèi)存里  占著內(nèi)存
    posted @ 2013-08-23 17:06 abin 閱讀(895) | 評(píng)論 (0)編輯 收藏

    有些符號(hào)在URL中是不能直接傳遞的,如果要在URL中傳遞這些特殊符號(hào),那么就要使用他們的編碼了。下表中列出了一些URL特殊符號(hào)及編碼

    十六進(jìn)制值

     

    1 + URL 中+號(hào)表示空格 %2B
    2 空格 URL中的空格可以用+號(hào)或者編碼 %20
    3 / 分隔目錄和子目錄 %2F
    4 ? 分隔實(shí)際的 URL 和參數(shù) %3F
    5 % 指定特殊字符 %25
    6 # 表示書簽 %23
    7 & URL 中指定的參數(shù)間的分隔符 %26
    8 = URL 中指定參數(shù)的值 %3D

     
      解決的方法:

      replace() 方法如果直接用str.replace("-","!") 只會(huì)替換第一個(gè)匹配的字符.

      而str.replace(/\-/g,"!")則可以替換掉全部匹配的字符(g為全局標(biāo)志)。

      replace()

      js中替換字符變量如下:

      data2=data2.replace(/\%/g,"%25");

      data2=data2.replace(/\#/g,"%23");

      data2=data2.replace(/\&/g,"%26");

    posted @ 2013-08-22 20:23 abin 閱讀(554) | 評(píng)論 (0)編輯 收藏

    如何用jquery獲取<input id="test" name="test" type="text"/>中輸入的值?
    $("#test").val()
    $("input[name='test']").val()
    $("input[type='text']").val()
    $("input[type='text']").attr("value")
    posted @ 2013-08-22 10:55 abin 閱讀(71522) | 評(píng)論 (0)編輯 收藏

    1.struts的toke原理
          Struts本身有一套完善的防止重復(fù)提交表單的Token(令牌)機(jī)制,但筆者目前的項(xiàng)目自寫的framework沒有用到Struts,故也得自寫防止用戶因?yàn)楹笸嘶蛘咚⑿聛碇貜?fù)提交表單內(nèi)容的Token機(jī)制。不難,容易實(shí)現(xiàn)。實(shí)現(xiàn)原理:一致性。jsp生成表單時(shí),在表單中插入一個(gè)隱藏<input>字段,該字段就是保存在頁面端的token字符串,同時(shí)把該字符串存入session中。等到用戶提交表單時(shí),會(huì)一并提交該隱藏的token字符串。在服務(wù)器端,查看下是否在session中含有與該token字符串相等的字符串。如果有,那么表明是第一次提交該表單,然后刪除存放于session端的token字符串,再做正常業(yè)務(wù)邏輯流程;如果沒有,那么表示該表單被重復(fù)提交,做非正常流程處理,可以警告提示也可以什么也不做。
    2.
    posted @ 2013-08-21 13:43 abin 閱讀(1242) | 評(píng)論 (2)編輯 收藏

    行級(jí)鎖:
    select * from abin1 t where t.id=21 for update;

    表級(jí)鎖:
    lock table abin1 IN EXCLUSIVE MODE (nowait);
    posted @ 2013-08-20 22:38 abin 閱讀(625) | 評(píng)論 (0)編輯 收藏

    memcached

     Memcached 是一個(gè)高性能的分布式內(nèi)存對(duì)象緩存系統(tǒng),用于動(dòng)態(tài)Web應(yīng)用以減輕數(shù)據(jù)庫負(fù)載。它通過在內(nèi)存中緩存數(shù)據(jù)和對(duì)象來減少讀取數(shù)據(jù)庫的次數(shù),從而提供動(dòng)態(tài)、數(shù)據(jù)庫驅(qū)動(dòng)網(wǎng)站的速度。Memcached基于一個(gè)存儲(chǔ)鍵/值對(duì)的hashmap。其守護(hù)進(jìn)程(daemon )是用C寫的,但是客戶端可以用任何語言來編寫,并通過memcached協(xié)議與守護(hù)進(jìn)程通信。但是它并不提供冗余(例如,復(fù)制其hashmap條目);當(dāng)某個(gè)服務(wù)器S停止運(yùn)行或崩潰了,所有存放在S上的鍵/值對(duì)都將丟失。

    Memcached官方:http://danga.com/memcached/

    關(guān)于Memcached的介紹請(qǐng)參考:Memcached深度分析

    下載Windows的Server端

    下載地址:http://code.jellycan.com/memcached/

    windows服務(wù)端下載地址:
    http://code.jellycan.com/files/memcached-1.2.6-win32-bin.zip
    windows服務(wù)端安裝:
    http://www.cnblogs.com/xd502djj/archive/2012/09/25/2701800.html
    http://www.cnblogs.com/wucg/archive/2011/03/01/1968185.html
    ehcache集群的相關(guān)文章:
    http://www.cnblogs.com/yangy608/archive/2011/10/07/2200669.html
    http://www.cnblogs.com/hoojo/archive/2012/07/19/2599534.html
    http://www.open-open.com/lib/view/open1345651870876.html

    以圖為例
    Cache A、Cache B,Cache C為三臺(tái)Memcached服務(wù)器
    根據(jù)三臺(tái)Memcached的IP和端口,計(jì)算出他們的Hash值,然后分布在整個(gè)圓環(huán)上
    每?jī)膳_(tái)Memcached服務(wù)器的Hash值之間為一個(gè)區(qū)間
    Key1、Key2、Key3、Key4
    為要存儲(chǔ)在Memcached里的4個(gè)Key
    根據(jù)4個(gè)Key計(jì)算出他們的Hash值,同樣也落在這個(gè)圓環(huán)上
    在這個(gè)環(huán)形空間中,如果沿著順時(shí)針方向從對(duì)象的 key 值出發(fā),直到遇見一個(gè) cache ,那么就將該對(duì)象存儲(chǔ)在這個(gè) cache 上,因?yàn)閷?duì)象和 cache 的 hash 值是固定的,因此這個(gè) cache 必然是唯一和確定的。
    根據(jù)上面的方法,對(duì)象 key1 將被存儲(chǔ)到 cache A 上; key2 和 key3 對(duì)應(yīng)到 cache C ; key4 對(duì)應(yīng)到 cache B;
    同一個(gè)key不是三臺(tái)服務(wù)器上面都有映射, 只會(huì)映射到其中一臺(tái)服務(wù)器上面

    集群中其中一個(gè)Memcached節(jié)點(diǎn)宕機(jī),會(huì)導(dǎo)致存在著上面的Key全部失效而重新對(duì)這些key進(jìn)行hash
    對(duì)其他活著的Memcached節(jié)點(diǎn)上的key沒有影響

    如果是集群
    Set和Get時(shí)觸發(fā)操作的是否為同一個(gè)配置
    如果是多個(gè)應(yīng)用服務(wù)器觸發(fā)Set、Get操作,每一個(gè)的Memcached節(jié)點(diǎn)配置順序是否相同
    可以通過telnet的方式,去Memcached節(jié)點(diǎn)上Get一下響應(yīng)的Key,看是否真的過期

    你分析一下你的slab構(gòu)成,看看每個(gè)slab分配了多少page頁,加起來是不是跟總分配內(nèi)存一樣,如果是一樣的表示你的內(nèi)存已經(jīng)分配完了,每個(gè)slab只能使用已分配的大小,不能再增漲。再分析一下存這個(gè)value的slab的大小,如果比較小,且hits量很大,就會(huì)出現(xiàn)你這樣的情況,剛存沒多久的數(shù)據(jù)沒到過期就會(huì)被擠掉。

    失效就幾種可能:
    1,cache滿了,剛插進(jìn)去就被lru剔出來
    2,失效時(shí)間設(shè)置不對(duì),導(dǎo)致數(shù)據(jù)一插進(jìn)去就失效(不能超過30天)

     使用了64的操作系統(tǒng),能分配2GB以上的內(nèi)存。32位操作系統(tǒng)中,每個(gè)進(jìn)程最多只能使用2GB內(nèi)存。可以啟動(dòng)多個(gè)分配2GB以下內(nèi)存的進(jìn)程,但這樣一臺(tái)服務(wù)器上的TCP連接數(shù)就會(huì)成倍增加,管理上也變得復(fù)雜,所以盡量統(tǒng)一使用了64位操作系統(tǒng)。
    另外,最好分配內(nèi)存為3GB,是因?yàn)閮?nèi)存分配量超過這個(gè)值,就有可能導(dǎo)致內(nèi)存交換(swap),memcached的內(nèi)存存儲(chǔ)“slab”, memcached啟動(dòng)時(shí)指定的內(nèi)存分配量是memcached用于保存數(shù)據(jù)的量,沒有包括“slab”本身占用的內(nèi)存、以及為了保存數(shù)據(jù)而設(shè)置的管理空間。因此,memcached進(jìn)程的實(shí)際內(nèi)存分配量要比指定的容量要大。
    如果在memcached中的數(shù)據(jù)大部分都比較小。這樣,進(jìn)程的大小要比指定的容量大很多。因此,改變內(nèi)存分配量進(jìn)行驗(yàn)證,確認(rèn)了3GB的大小不會(huì)引發(fā)swap。

     64位操作系統(tǒng)不受限制(小于你的物理內(nèi)存大小即可),不過得注意Memcache軟件本身是有內(nèi)存消耗的(相比可以忽略),但這點(diǎn)還是注意一下。
    posted @ 2013-08-09 17:34 abin 閱讀(586) | 評(píng)論 (0)編輯 收藏

     <script type="text/javascript" >
      var EventUtil = {
           addHandler: function (element, type, handler) {
               if (element.addEventListener) {
                   element.addEventListener(type, handler, false);
               } else if (element.attachEvent) {
                   element.attachEvent("on" + type, handler);
               } else {
                   element["on" + type] = handler;
               }
           }
       };
       EventUtil.addHandler(document, "DOMContentLoaded", function (event) {
        setTimeout(function(){
         var imgs=document.getElementsByTagName("img");
         for (var i =0; i<=imgs.length;i++){
          var img=imgs[i];
          var height,width;
          height=img.naturalHeight;
          width=img.naturalWidth;
          if((height==0&&width==0)){
           img.src="";
           img.parentNode.parentNode.hidden=true;
           var nid=img.getAttribute('nid');
           document.getElementById('divNoneImg'+nid).style.display="block";
          }
         }
        }, 2000);
       });

     </script>

    posted @ 2013-07-31 14:33 abin 閱讀(461) | 評(píng)論 (0)編輯 收藏

    僅列出標(biāo)題
    共50頁: First 上一頁 10 11 12 13 14 15 16 17 18 下一頁 Last 
    主站蜘蛛池模板: 女人隐私秘视频黄www免费| 鲁死你资源站亚洲av| 国产免费AV片在线播放唯爱网| 亚洲国产精品综合久久2007| 欧洲美熟女乱又伦免费视频| 一级特黄a大片免费| 亚洲国产精品久久| 97国产免费全部免费观看 | 免费精品国产自产拍在线观看 | 国产成人精品123区免费视频| 福利免费在线观看| 亚洲国产情侣一区二区三区| 免费a级毛片在线观看| 91制片厂制作传媒免费版樱花 | a毛片免费全部在线播放**| 亚洲一区中文字幕在线电影网| 亚洲国产成人久久精品99 | 在线a免费观看最新网站| 国产成人人综合亚洲欧美丁香花 | 五月婷婷在线免费观看| 欧亚一级毛片免费看| 亚洲人成网站在线观看播放动漫 | 亚洲日本va中文字幕久久| 国产1024精品视频专区免费| 国产精品福利在线观看免费不卡| 亚洲精品福利你懂| 精品久久香蕉国产线看观看亚洲| 在线免费观看污网站| 人妻丰满熟妇无码区免费| eeuss草民免费| 亚洲αⅴ无码乱码在线观看性色| 女人18毛片水真多免费看| 国产在线精品免费aaa片| 国产精品手机在线亚洲| 亚洲伊人久久精品| 久久久综合亚洲色一区二区三区| 又粗又大又长又爽免费视频| 欧洲精品成人免费视频在线观看 | 一级毛片aa高清免费观看| 亚洲精品无码av片| 亚洲av无码电影网|