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

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

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

         摘要: 在金融行業(yè)的應(yīng)用王 和全, 架構(gòu)師簡介: EDA 與 SOA 的融合已經(jīng)成為一種趨勢和務(wù)實的選擇,但如何撥云見日,了解其中本質(zhì)的思想?這正是本文想和你一起探討的。發(fā)布日期: 2010 年 10 月 28 日 級別: 初級 訪問情況 : 5393 次瀏覽 評論: 1 (查看 | 添加評論&n...  閱讀全文
    posted @ 2014-12-30 10:41 小馬歌 閱讀(298) | 評論 (0)編輯 收藏
     

    1. 讓 Command Line 指令列顯示目前處在哪一個 Git Branch 分支,最早是在 RGBA 看到這一招,非常方便。另外我最近看到一個點子是顯示從上一次 commit 之後過了多久時間,這可以提醒你是不是該 commit 了 XD

    請修改家目錄的 ~/.bash_profile 檔案 (我是用 Bash)。

    1234567891011121314151617
    function git_branch {
    ref=$(git symbolic-ref HEAD 2> /dev/null) || return;
    echo "("${ref#refs/heads/}") ";
    }
     
    function git_since_last_commit {
    now=`date +%s`;
    last_commit=$(git log --pretty=format:%at -1 2> /dev/null) || return;
    seconds_since_last_commit=$((now-last_commit));
    minutes_since_last_commit=$((seconds_since_last_commit/60));
    hours_since_last_commit=$((minutes_since_last_commit/60));
    minutes_since_last_commit=$((minutes_since_last_commit%60));
    echo "${hours_since_last_commit}h${minutes_since_last_commit}m ";
    }
     
    PS1="[\[\033[1;32m\]\w\[\033[0m\]] \[\033[0m\]\[\033[1;36m\]\$(git_branch)\[\033[0;33m\]\$(git_since_last_commit)\[\033[0m\]$ "
    view rawgistfile1.txt hosted with ? by GitHub

    結(jié)果如下,各位可以看到目前處在 master 分支,並且這個專案已經(jīng)過了 1821 個小時沒有 commit 了…. :p

    2. 安裝 Git 的 Bash autocompletion,這樣按 tab 就會有自動完成的效果,它甚至包括 git checkout 時都可以抓到你的 branch 名稱。這裡我用 Homebrew 來安裝 bash-completion,這套件其實包括很多 autocompletion script,你可以去 /usr/local/etc/bash_completion.d 這個目錄找找看。

    brew install bash-completion cp /usr/local/etc/bash_completion.d/git-completion.bash ~/.git-bash-completion.sh 

    編輯 ~/.bash_profile 加入

    [ -f ~/.git-bash-completion.sh ] && . ~/.git-bash-completion.sh 

    3. 打開 Git 的 color 顏色設(shè)定,這樣 Git 指令的輸出結(jié)果才會加上顏色,像是 git status 等:

    git config --global color.ui true 

    4. 設(shè)定你偏好的文字編輯器和 diff 工具

    git config --global core.editor git config --global merge.tool opendiff 

    5. 最後,我個人喜歡以下的 alias:

    git config --global alias.co checkout git config --global alias.ci commit git config --global alias.st status git config --global alias.br branch 

    這樣只要輸入 git st 就是 git status 了。

    FYI,以上 git 設(shè)定檔的位置在 ~/.gitconfig,你也可以直接修改這個檔案。

    posted @ 2014-12-24 15:07 小馬歌 閱讀(237) | 評論 (0)編輯 收藏
     
         摘要: 時間:2014-04-14 11:49來源:blog.51cto.com 作者:“游響云停” 博客 舉報 點擊:6031次1 關(guān)于版本控制版本控制是一種記錄一個或若干文件內(nèi)容變化,以便將來查閱特定版本修訂情況的系統(tǒng)。有以下三種版本控制系統(tǒng):1. 本地版本控制系統(tǒng)許多人習(xí)慣用復(fù)制整個項目目錄的方式來保存不同的版本,或許還會改名加上備份時間以示區(qū)別...  閱讀全文
    posted @ 2014-12-19 10:40 小馬歌 閱讀(265) | 評論 (0)編輯 收藏
     

    2013-05-18 10:02:31     我來說兩句       作者:沉睡一千年
    收藏    我要投稿
    git在windows上配置ssh公鑰
     
    一 .設(shè)置git的user name和email:
     
    $ git config --global user.name "lxyz"
     
    $ git config --global user.email "1129103472@qq.com"
     
    二 生成密鑰
     
    ssh-keygen -t rsa -C “1129103472@qq.com”
     
     按3個回車,密碼為空。(不要輸密碼)
     
    然后到.ssh下面將id_rsa.pub里的內(nèi)容復(fù)制出來粘貼到github個人中心的賬戶設(shè)置的ssh key里面
     
    git for windows下載地址:
     
    http://code.google.com/p/msysgit/downloads/list
    posted @ 2014-12-19 10:39 小馬歌 閱讀(416) | 評論 (0)編輯 收藏
     
    from:http://blog.csdn.net/cooldragon/article/details/40212761


    現(xiàn)象是:

    Windows下Eclipse可以連接Device里能顯示設(shè)備名稱,但是在Mac OS X下的Eclipse Device始終不能顯示連接。


    解決方法:
    1.把Android手機(jī)開啟調(diào)試模式,然后連接在我們的Mac OS上。
    2.選擇Mac的 關(guān)于本機(jī)->更多信息-> 系統(tǒng)報告->找到usb選項,右邊會出現(xiàn)一系列和usb相關(guān)的設(shè)備我們找到自己的Android設(shè)備并選中。
    3.選中后找到 供應(yīng)商ID或叫廠商ID,我的MX4手機(jī)顯示的供應(yīng)商ID是:0x2a45


    4.打開Mac終端 輸入: echo 0x2a45 >> ~/.android/adb_usb.ini

    然后重啟adb(我是重啟Mac系統(tǒng))后再打開eclipse 你會發(fā)現(xiàn)Android手機(jī)的設(shè)備顯示了。這樣的辦法還可以解決Mac上其他android設(shè)備不顯示的問題。


    感謝魅族的冤家對手小米論壇提供了解決方法,原文:點擊打開鏈接



    posted @ 2014-12-16 16:19 小馬歌 閱讀(1693) | 評論 (0)編輯 收藏
     
         摘要: spring 集成測試中 對mock 的集成實在是太棒了!但是使用請注意一下3個條件。 junit 必須使用4.9以上同時您的框架必須是用spring mvc spring 3.2以上才完美支持 目前使用spring MVC 取代struts2 的很多,spring MVC 的各種靈活讓人無比銷魂!所以使用spring MVC吧!以前在對接口(主要是java服務(wù)端提供...  閱讀全文
    posted @ 2014-12-08 18:26 小馬歌 閱讀(1163) | 評論 (0)編輯 收藏
     
    Bug #70588 Index merge used on partitionned table can return wrong result set
    Submitted: 10 Oct 2013 12:09 Modified: 5 Nov 2013 17:05
    Reporter: Joffrey MICHAIE Email Updates:
    Status: Closed Impact on me:
    None 
    Category: Server: Partition Severity: S2 (Serious)
    Version: 5.6.14,5.5 OS: Any
    Assigned to: Target Version:
    Tags: index merge, intersect, partition, wrong resultset
    Triage: Needs Triage: D2 (Serious)
    ViewAdd CommentFilesDeveloperEdit SubmissionView Progress LogContributions
    [10 Oct 2013 12:09] Joffrey MICHAIE
    Description:
    Simple query where 
    indexed_col = 'x' and indexed_date_column = 'yyyy-mm-aa'
     returns wrong resultset, when run on partitionned table, and using index_merge (indexed_col,indexed_date_column)
    Found on 5.5, repeated on 5.6.14, didn't test on 5.1
    How to repeat:
    Start MySQL with 100% default settings.
    CREATE TABLE `poll` (
      `id_key` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `id` int(6) NOT NULL DEFAULT '0',
      `id_poll` int(6) NOT NULL DEFAULT '0',
      `date_long` datetime NOT NULL,
      `date_short` date NOT NULL,
      PRIMARY KEY (`id_key`,`id_poll`),
      KEY `id` (`id`),
      KEY `date_creation` (`date_short`)
    ) ENGINE=InnoDB AUTO_INCREMENT=14101389 DEFAULT CHARSET=latin1
    /*!50100 PARTITION BY HASH (id_poll)
    PARTITIONS 20 */;
    INSERT INTO `poll` VALUES (NULL,1718848,580660,'2013-10-09 18:21:00','2013-10-09');
    INSERT INTO `poll` VALUES (NULL,39369,869049,'2013-10-09 18:21:02','2013-10-09');
    INSERT INTO `poll` VALUES (NULL,70,1916580,'2013-10-09 18:21:09','2013-10-09');
    INSERT INTO `poll` VALUES (NULL,70,1333222,'2013-10-09 18:20:31','2013-10-09');
    INSERT INTO `poll` VALUES (NULL,1557405,869555,'2013-10-09 18:20:32','2013-10-09');
    INSERT INTO `poll` VALUES (NULL,70,1343938,'2013-10-09 18:20:32','2013-10-09');
    INSERT INTO `poll` VALUES (NULL,70,1157259,'2013-10-09 18:20:40','2013-10-09');
    INSERT INTO `poll` VALUES (NULL,70,1800441,'2013-10-09 18:20:50','2013-10-09');
    INSERT INTO `poll` VALUES (NULL,70,60,'2013-10-09 18:20:53','2013-10-09');
    INSERT INTO `poll` VALUES (NULL,1718848,580660,'2013-10-09 18:21:00','2013-10-09');
    INSERT INTO `poll` VALUES (NULL,39369,869049,'2013-10-09 18:21:02','2013-10-09');
    INSERT INTO `poll` VALUES (NULL,70,1916580,'2013-10-09 18:21:09','2013-10-09');
    INSERT INTO `poll` VALUES (NULL,70,1916580,'2013-10-0Query OK, 1 row affected (0,01 sec)
    explain SELECT date_short FROM poll WHERE id =70 AND date_short =  '2013-10-10';                                                                                                                                                      +----+-------------+-------+-------------+------------------+------------------+---------+------+------+-------------------------------------------------------------+
    | id | select_type | table | type        | possible_keys    | key              | key_len | ref  | rows | Extra                                                       |
    +----+-------------+-------+-------------+------------------+------------------+---------+------+------+-------------------------------------------------------------+
    |  1 | SIMPLE      | poll  | index_merge | id,date_creation | date_creation,id | 3,4     | NULL |    2 | Using intersect(date_creation,id); Using where; Using index |
    +----+-------------+-------+-------------+------------------+------------------+---------+------+------+-------------------------------------------------------------+
    1 row in set (0,00 sec)
    (data sample is small, you can run ANALYZE TABLE if intersect is not shown)
    mysql>  SELECT date_short FROM poll WHERE id =70 AND date_short =  '2013-10-10';
    Empty set (0,01 sec)
    mysql>  SELECT date_short FROM poll WHERE id =70 AND date_short like  '2013-10-10';
    +------------+
    | date_short |
    +------------+
    | 2013-10-10 |
    +------------+
    1 row in set (0,00 sec)
    Other examples:
    mysql>  SELECT date_short FROM poll IGNORE INDEX (date_creation) WHERE id =70 AND date_short =  '2013-10-10';
    +------------+
    | date_short |
    +------------+
    | 2013-10-10 |
    +------------+
    1 row in set (0,00 sec)
    mysql>  SELECT date_short FROM poll IGNORE INDEX (id) WHERE id =70 AND date_short =  '2013-10-10';
    +------------+
    | date_short |
    +------------+
    | 2013-10-10 |
    +------------+
    1 row in set (0,00 sec)
    mysql> alter table poll remove partitioning;
    Query OK, 13 rows affected (0,08 sec)
    Records: 13  Duplicates: 0  Warnings: 0
    mysql>  SELECT date_short FROM poll WHERE id =70 AND date_short =  '2013-10-10';
    +------------+
    | date_short |
    +------------+
    | 2013-10-10 |
    +------------+
    1 row in set (0,00 sec)
    Suggested fix:
    Return correct resultset, or do not use intersection merge on hash partitionned tables
    [10 Oct 2013 12:30] Miguel Solorzano
    Thank you for the bug report.
    C:\dbs>c:\dbs\5.6\bin\mysql -uroot --port=3560 --prompt="mysql 5.6 > "
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 3
    Server version: 5.6.15 Source distribution
    Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    mysql 5.6 > use xd
    Database changed
    mysql 5.6 > CREATE TABLE `poll` (
        ->   `id_key` int(10) unsigned NOT NULL AUTO_INCREMENT,
        ->   `id` int(6) NOT NULL DEFAULT '0',
        ->   `id_poll` int(6) NOT NULL DEFAULT '0',
        ->   `date_long` datetime NOT NULL,
        ->   `date_short` date NOT NULL,
        ->   PRIMARY KEY (`id_key`,`id_poll`),
        ->   KEY `id` (`id`),
        ->   KEY `date_creation` (`date_short`)
        -> ) ENGINE=InnoDB AUTO_INCREMENT=14101389 DEFAULT CHARSET=latin1
        -> /*!50100 PARTITION BY HASH (id_poll)
        -> PARTITIONS 20 */;
    Query OK, 0 rows affected (4.76 sec)
    mysql 5.6 >
    mysql 5.6 > INSERT INTO `poll` VALUES (NULL,1718848,580660,'2013-10-09 18:21:00','2013-10-09');
    Query OK, 1 row affected (0.20 sec)
    <CUT>
    mysql 5.6 > SELECT date_short FROM poll WHERE id =70 AND date_short =  '2013-10-10';
    Empty set (0.00 sec)
    mysql 5.6 > alter table poll remove partitioning;
    Query OK, 13 rows affected (3.76 sec)
    Records: 13  Duplicates: 0  Warnings: 0
    mysql 5.6 > SELECT date_short FROM poll WHERE id =70 AND date_short =  '2013-10-10';
    +------------+
    | date_short |
    +------------+
    | 2013-10-10 |
    +------------+
    1 row in set (0.02 sec)
    mysql 5.6 >
    [10 Oct 2013 12:55] Joffrey MICHAIE
    From:
    http://dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-6-14.html
    For partitioned tables, queries could return different results depending on whether Index Merge was used. (Bug #16862316)
    [5 Nov 2013 17:05] Jonathan Stephens
    Fixed in 5.5+. Documented in the 5.5.36, 5.6.16, and 5.7.4 changelogs, as follows:
          Queries using index_merge optimization (see 
          http://dev.mysql.com/doc/refman/5.5/en/index-merge-optimization.html) 
          could return invalid results when run against tables that were 
          partitioned by HASH. 
    Closed.
    [2 Feb 17:20] Laurynas Biveinis
    5.5$ bzr log -r 4538
    ------------------------------------------------------------
    revno: 4538
    committer: Aditya A <aditya.a@oracle.com>
    branch nick: mysql-5.5
    timestamp: Tue 2013-11-05 19:25:26 +0530
    message:
      Bug#17588348: INDEX MERGE USED ON PARTITIONED TABLE 
                     CAN RETURN WRONG RESULT SET
      
      PROBLEM
      -------
      In ha_partition::cmp_ref() we were only calling the 
      underlying cmp_ref() of storage engine if the records
      are in the same partiton,else we sort by partition and
      returns the result.But the index merge intersect 
      algorithm expects first to sort by row-id first and 
      then by partition id.
      
      FIX
      ---
      Compare the refernces first using storage engine cmp_ref
      and then if references are equal(only happens if 
      non clustered index is used) then sort it by partition id.
      
      [Approved by Mattiasj #rb3755]
      -
    posted @ 2014-12-08 17:33 小馬歌 閱讀(212) | 評論 (0)編輯 收藏
     

    一、概述:

          在Redis中,我們可以將Set類型看作為沒有排序的字符集合,和List類型一樣,我們也可以在該類型的數(shù)據(jù)值上執(zhí)行添加、刪除或判斷某一元素是否存在等操作。需要說明的是,這些操作的時間復(fù)雜度為O(1),即常量時間內(nèi)完成次操作。Set可包含的最大元素數(shù)量是4294967295。
          和List類型不同的是,Set集合中不允許出現(xiàn)重復(fù)的元素,這一點和C++標(biāo)準(zhǔn)庫中的set容器是完全相同的。換句話說,如果多次添加相同元素,Set中將僅保留該元素的一份拷貝。和List類型相比,Set類型在功能上還存在著一個非常重要的特性,即在服務(wù)器端完成多個Sets之間的聚合計算操作,如unions、intersections和differences。由于這些操作均在服務(wù)端完成,因此效率極高,而且也節(jié)省了大量的網(wǎng)絡(luò)IO開銷。

    二、相關(guān)命令列表:

    命令原型時間復(fù)雜度命令描述返回值
    SADD key member [member ...]O(N)時間復(fù)雜度中的N表示操作的成員數(shù)量。如果在插入的過程用,參數(shù)中有的成員在Set中已經(jīng)存在,該成員將被忽略,而其它成員仍將會被正常插入。如果執(zhí)行該命令之前,該Key并不存在,該命令將會創(chuàng)建一個新的Set,此后再將參數(shù)中的成員陸續(xù)插入。如果該Key的Value不是Set類型,該命令將返回相關(guān)的錯誤信息。本次操作實際插入的成員數(shù)量。
    SCARD keyO(1)獲取Set中成員的數(shù)量。返回Set中成員的數(shù)量,如果該Key并不存在,返回0。
    SISMEMBERkey memberO(1)判斷參數(shù)中指定成員是否已經(jīng)存在于與Key相關(guān)聯(lián)的Set集合中。1表示已經(jīng)存在,0表示不存在,或該Key本身并不存在。
    SMEMBERS keyO(N)時間復(fù)雜度中的N表示Set中已經(jīng)存在的成員數(shù)量。獲取與該Key關(guān)聯(lián)的Set中所有的成員。

    返回Set中所有的成員。

    SPOP key O(1) 隨機(jī)的移除并返回Set中的某一成員。 由于Set中元素的布局不受外部控制,因此無法像List那樣確定哪個元素位于Set的頭部或者尾部。返回移除的成員,如果該Key并不存在,則返回nil。
    SREM key member [member ...]O(N) 時間復(fù)雜度中的N表示被刪除的成員數(shù)量。從與Key關(guān)聯(lián)的Set中刪除參數(shù)中指定的成員,不存在的參數(shù)成員將被忽略,如果該Key并不存在,將視為空Set處理。從Set中實際移除的成員數(shù)量,如果沒有則返回0。
    SRANDMEMBERkey O(1) 和SPOP一樣,隨機(jī)的返回Set中的一個成員,不同的是該命令并不會刪除返回的成員。返回隨機(jī)位置的成員,如果Key不存在則返回nil。
    SMOVE source destination memberO(1) 原子性的將參數(shù)中的成員從source鍵移入到destination鍵所關(guān)聯(lián)的Set中。因此在某一時刻,該成員或者出現(xiàn)在source中,或者出現(xiàn)在destination中。如果該成員在source中并不存在,該命令將不會再執(zhí)行任何操作并返回0,否則,該成員將從source移入到destination。如果此時該成員已經(jīng)在destination中存在,那么該命令僅是將該成員從source中移出。如果和Key關(guān)聯(lián)的Value不是Set,將返回相關(guān)的錯誤信息。1表示正常移動,0表示source中并不包含參數(shù)成員。
    SDIFF key [key ...]O(N) 時間復(fù)雜度中的N表示所有Sets中成員的總數(shù)量。返回參數(shù)中第一個Key所關(guān)聯(lián)的Set和其后所有Keys所關(guān)聯(lián)的Sets中成員的差異。如果Key不存在,則視為空Set。差異結(jié)果成員的集合。
    SDIFFSTOREdestination key [key ...] O(N) 該命令和SDIFF命令在功能上完全相同,兩者之間唯一的差別是SDIFF返回差異的結(jié)果成員,而該命令將差異成員存儲在destination關(guān)聯(lián)的Set中。如果destination鍵已經(jīng)存在,該操作將覆蓋它的成員。返回差異成員的數(shù)量。
    SINTER key [key ...] O(N*M) 時間復(fù)雜度中的N表示最小Set中元素的數(shù)量,M則表示參數(shù)中Sets的數(shù)量。該命令將返回參數(shù)中所有Keys關(guān)聯(lián)的Sets中成員的交集。因此如果參數(shù)中任何一個Key關(guān)聯(lián)的Set為空,或某一Key不存在,那么該命令的結(jié)果將為空集。交集結(jié)果成員的集合。
    SINTERSTOREdestination key [key ...]O(N*M) 該命令和SINTER命令在功能上完全相同,兩者之間唯一的差別是SINTER返回交集的結(jié)果成員,而該命令將交集成員存儲在destination關(guān)聯(lián)的Set中。如果destination鍵已經(jīng)存在,該操作將覆蓋它的成員。返回交集成員的數(shù)量。 
    SUNION key [key ...] O(N)時間復(fù)雜度中的N表示所有Sets中成員的總數(shù)量。該命令將返回參數(shù)中所有Keys關(guān)聯(lián)的Sets中成員的并集。并集結(jié)果成員的集合。
    SUNIONSTOREdestination key [key ...] O(N) 該命令和SUNION命令在功能上完全相同,兩者之間唯一的差別是SUNION返回并集的結(jié)果成員,而該命令將并集成員存儲在destination關(guān)聯(lián)的Set中。如果destination鍵已經(jīng)存在,該操作將覆蓋它的成員。 返回并集成員的數(shù)量。

    三、命令示例:

       1. SADD/SMEMBERS/SCARD/SISMEMBER:
        #在Shell命令行下啟動Redis的客戶端程序。
        /> redis-cli
        #插入測試數(shù)據(jù),由于該鍵myset之前并不存在,因此參數(shù)中的三個成員都被正常插入。
        redis 127.0.0.1:6379> sadd myset a b c
        (integer) 3
        #由于參數(shù)中的a在myset中已經(jīng)存在,因此本次操作僅僅插入了d和e兩個新成員。
        redis 127.0.0.1:6379> sadd myset a d e
        (integer) 2
        #判斷a是否已經(jīng)存在,返回值為1表示存在。
        redis 127.0.0.1:6379> sismember myset a
        (integer) 1
        #判斷f是否已經(jīng)存在,返回值為0表示不存在。
        redis 127.0.0.1:6379> sismember myset f
        (integer) 0
        #通過smembers命令查看插入的結(jié)果,從結(jié)果可以,輸出的順序和插入順序無關(guān)。
        redis 127.0.0.1:6379> smembers myset
        1) "c"
        2) "d"
        3) "a"
        4) "b"
        5) "e"
        #獲取Set集合中元素的數(shù)量。
        redis 127.0.0.1:6379> scard myset
        (integer) 5

        2. SPOP/SREM/SRANDMEMBER/SMOVE:
        #刪除該鍵,便于后面的測試。
        redis 127.0.0.1:6379> del myset
        (integer) 1
        #為后面的示例準(zhǔn)備測試數(shù)據(jù)。
        redis 127.0.0.1:6379> sadd myset a b c d
        (integer) 4
        #查看Set中成員的位置。
        redis 127.0.0.1:6379> smembers myset
        1) "c"
        2) "d"
        3) "a"
        4) "b"
        #從結(jié)果可以看出,該命令確實是隨機(jī)的返回了某一成員。
        redis 127.0.0.1:6379> srandmember myset
        "c"
        #Set中尾部的成員b被移出并返回,事實上b并不是之前插入的第一個或最后一個成員。
        redis 127.0.0.1:6379> spop myset
        "b"
        #查看移出后Set的成員信息。
        redis 127.0.0.1:6379> smembers myset
        1) "c"
        2) "d"
        3) "a"
        #從Set中移出a、d和f三個成員,其中f并不存在,因此只有a和d兩個成員被移出,返回為2。
        redis 127.0.0.1:6379> srem myset a d f
        (integer) 2
        #查看移出后的輸出結(jié)果。
        redis 127.0.0.1:6379> smembers myset
        1) "c"
        #為后面的smove命令準(zhǔn)備數(shù)據(jù)。
        redis 127.0.0.1:6379> sadd myset a b
        (integer) 2
        redis 127.0.0.1:6379> sadd myset2 c d
        (integer) 2
        #將a從myset移到myset2,從結(jié)果可以看出移動成功。
        redis 127.0.0.1:6379> smove myset myset2 a
        (integer) 1
        #再次將a從myset移到myset2,由于此時a已經(jīng)不是myset的成員了,因此移動失敗并返回0。
        redis 127.0.0.1:6379> smove myset myset2 a
        (integer) 0
        #分別查看myset和myset2的成員,確認(rèn)移動是否真的成功。
        redis 127.0.0.1:6379> smembers myset
        1) "b"
        redis 127.0.0.1:6379> smembers myset2
        1) "c"
        2) "d"
        3) "a"

       3. SDIFF/SDIFFSTORE/SINTER/SINTERSTORE:
        #為后面的命令準(zhǔn)備測試數(shù)據(jù)。
        redis 127.0.0.1:6379> sadd myset a b c d
        (integer) 4
        redis 127.0.0.1:6379> sadd myset2 c
        (integer) 1
        redis 127.0.0.1:6379> sadd myset3 a c e
        (integer) 3
        #myset和myset2相比,a、b和d三個成員是兩者之間的差異成員。再用這個結(jié)果繼續(xù)和myset3進(jìn)行差異比較,b和d是myset3不存在的成員。
        redis 127.0.0.1:6379> sdiff myset myset2 myset3
        1) "d"
        2) "b"
        #將3個集合的差異成員存在在diffkey關(guān)聯(lián)的Set中,并返回插入的成員數(shù)量。
        redis 127.0.0.1:6379> sdiffstore diffkey myset myset2 myset3
        (integer) 2
        #查看一下sdiffstore的操作結(jié)果。
        redis 127.0.0.1:6379> smembers diffkey
        1) "d"
        2) "b"
        #從之前準(zhǔn)備的數(shù)據(jù)就可以看出,這三個Set的成員交集只有c。
        redis 127.0.0.1:6379> sinter myset myset2 myset3
        1) "c"
        #將3個集合中的交集成員存儲到與interkey關(guān)聯(lián)的Set中,并返回交集成員的數(shù)量。
        redis 127.0.0.1:6379> sinterstore interkey myset myset2 myset3
        (integer) 1
        #查看一下sinterstore的操作結(jié)果。
        redis 127.0.0.1:6379> smembers interkey
        1) "c"
        #獲取3個集合中的成員的并集。    
        redis 127.0.0.1:6379> sunion myset myset2 myset3
        1) "b"
        2) "c"
        3) "d"
        4) "e"
        5) "a"
        #將3個集合中成員的并集存儲到unionkey關(guān)聯(lián)的set中,并返回并集成員的數(shù)量。
        redis 127.0.0.1:6379> sunionstore unionkey myset myset2 myset3
        (integer) 5
        #查看一下suiionstore的操作結(jié)果。
        redis 127.0.0.1:6379> smembers unionkey
        1) "b"
        2) "c"
        3) "d"
        4) "e"
        5) "a"

    四、應(yīng)用范圍:

          1). 可以使用Redis的Set數(shù)據(jù)類型跟蹤一些唯一性數(shù)據(jù),比如訪問某一博客的唯一IP地址信息。對于此場景,我們僅需在每次訪問該博客時將訪問者的IP存入Redis中,Set數(shù)據(jù)類型會自動保證IP地址的唯一性。
          2). 充分利用Set類型的服務(wù)端聚合操作方便、高效的特性,可以用于維護(hù)數(shù)據(jù)對象之間的關(guān)聯(lián)關(guān)系。比如所有購買某一電子設(shè)備的客戶ID被存儲在一個指定的Set中,而購買另外一種電子產(chǎn)品的客戶ID被存儲在另外一個Set中,如果此時我們想獲取有哪些客戶同時購買了這兩種商品時,Set的intersections命令就可以充分發(fā)揮它的方便和效率的優(yōu)勢了。

    分類: Redis
    posted @ 2014-12-01 19:45 小馬歌 閱讀(235) | 評論 (0)編輯 收藏
     

    一、概述:

          我們可以將Redis中的Hashes類型看成具有String Key和String Value的map容器。所以該類型非常適合于存儲值對象的信息。如Username、Password和Age等。如果Hash中包含很少的字段,那么該類型的數(shù)據(jù)也將僅占用很少的磁盤空間。每一個Hash可以存儲4294967295個鍵值對。

    二、相關(guān)命令列表:

    命令原型時間復(fù)雜度命令描述返回值
    HSET key field valueO(1)為指定的Key設(shè)定Field/Value對,如果Key不存在,該命令將創(chuàng)建新Key以參數(shù)中的Field/Value對,如果參數(shù)中的Field在該Key中已經(jīng)存在,則用新值覆蓋其原有值。 1表示新的Field被設(shè)置了新值,0表示Field已經(jīng)存在,用新值覆蓋原有值。 
    HGET key field O(1) 返回指定Key中指定Field的關(guān)聯(lián)值。返回參數(shù)中Field的關(guān)聯(lián)值,如果參數(shù)中的Key或Field不存,返回nil。
    HEXISTSkey field O(1) 判斷指定Key中的指定Field是否存在。1表示存在,0表示參數(shù)中的Field或Key不存在。
    HLEN key O(1)獲取該Key所包含的Field的數(shù)量。返回Key包含的Field數(shù)量,如果Key不存在,返回0。
    HDEL key field [field ...] O(N)時間復(fù)雜度中的N表示參數(shù)中待刪除的字段數(shù)量。從指定Key的Hashes Value中刪除參數(shù)中指定的多個字段,如果不存在的字段將被忽略。如果Key不存在,則將其視為空Hashes,并返回0.實際刪除的Field數(shù)量。
    HSETNXkey field valueO(1)只有當(dāng)參數(shù)中的Key或Field不存在的情況下,為指定的Key設(shè)定Field/Value對,否則該命令不會進(jìn)行任何操作。 1表示新的Field被設(shè)置了新值,0表示Key或Field已經(jīng)存在,該命令沒有進(jìn)行任何操作。
    HINCRBYkey field increment O(1)增加指定Key中指定Field關(guān)聯(lián)的Value的值。如果Key或Field不存在,該命令將會創(chuàng)建一個新Key或新Field,并將其關(guān)聯(lián)的Value初始化為0,之后再指定數(shù)字增加的操作。該命令支持的數(shù)字是64位有符號整型,即increment可以負(fù)數(shù)。 返回運算后的值。
    HGETALLkeyO(N) 時間復(fù)雜度中的N表示Key包含的Field數(shù)量。獲取該鍵包含的所有Field/Value。其返回格式為一個Field、一個Value,并以此類推。Field/Value的列表。
    HKEYSkey O(N)時間復(fù)雜度中的N表示Key包含的Field數(shù)量。返回指定Key的所有Fields名。Field的列表。
    HVALSkey O(N)時間復(fù)雜度中的N表示Key包含的Field數(shù)量。返回指定Key的所有Values名。 Value的列表。 
    HMGETkey field [field ...] O(N) 時間復(fù)雜度中的N表示請求的Field數(shù)量。獲取和參數(shù)中指定Fields關(guān)聯(lián)的一組Values。如果請求的Field不存在,其值返回nil。如果Key不存在,該命令將其視為空Hash,因此返回一組nil。返回和請求Fields關(guān)聯(lián)的一組Values,其返回順序等同于Fields的請求順序。
    HMSET key field value [field value ...]O(N)時間復(fù)雜度中的N表示被設(shè)置的Field數(shù)量。逐對依次設(shè)置參數(shù)中給出的Field/Value對。如果其中某個Field已經(jīng)存在,則用新值覆蓋原有值。如果Key不存在,則創(chuàng)建新Key,同時設(shè)定參數(shù)中的Field/Value。   

    三、命令示例:

        1. HSET/HGET/HDEL/HEXISTS/HLEN/HSETNX:
        #在Shell命令行啟動Redis客戶端程序
        /> redis-cli
        #給鍵值為myhash的鍵設(shè)置字段為field1,值為stephen。
        redis 127.0.0.1:6379> hset myhash field1 "stephen"
        (integer) 1
        #獲取鍵值為myhash,字段為field1的值。
        redis 127.0.0.1:6379> hget myhash field1
        "stephen"
        #myhash鍵中不存在field2字段,因此返回nil。
        redis 127.0.0.1:6379> hget myhash field2
        (nil)
        #給myhash關(guān)聯(lián)的Hashes值添加一個新的字段field2,其值為liu。
        redis 127.0.0.1:6379> hset myhash field2 "liu"
        (integer) 1
        #獲取myhash鍵的字段數(shù)量。
        redis 127.0.0.1:6379> hlen myhash
        (integer) 2
        #判斷myhash鍵中是否存在字段名為field1的字段,由于存在,返回值為1。
        redis 127.0.0.1:6379> hexists myhash field1
        (integer) 1
        #刪除myhash鍵中字段名為field1的字段,刪除成功返回1。
        redis 127.0.0.1:6379> hdel myhash field1
        (integer) 1
        #再次刪除myhash鍵中字段名為field1的字段,由于上一條命令已經(jīng)將其刪除,因為沒有刪除,返回0。
        redis 127.0.0.1:6379> hdel myhash field1
        (integer) 0
        #判斷myhash鍵中是否存在field1字段,由于上一條命令已經(jīng)將其刪除,因為返回0。
        redis 127.0.0.1:6379> hexists myhash field1
        (integer) 0
        #通過hsetnx命令給myhash添加新字段field1,其值為stephen,因為該字段已經(jīng)被刪除,所以該命令添加成功并返回1。
        redis 127.0.0.1:6379> hsetnx myhash field1 stephen
        (integer) 1
        #由于myhash的field1字段已經(jīng)通過上一條命令添加成功,因為本條命令不做任何操作后返回0。
        redis 127.0.0.1:6379> hsetnx myhash field1 stephen
        (integer) 0

       2. HINCRBY:
        #刪除該鍵,便于后面示例的測試。
        redis 127.0.0.1:6379> del myhash
        (integer) 1
        #準(zhǔn)備測試數(shù)據(jù),該myhash的field字段設(shè)定值1。
        redis 127.0.0.1:6379> hset myhash field 5
        (integer) 1
        #給myhash的field字段的值加1,返回加后的結(jié)果。
        redis 127.0.0.1:6379> hincrby myhash field 1
        (integer) 6
        #給myhash的field字段的值加-1,返回加后的結(jié)果。
        redis 127.0.0.1:6379> hincrby myhash field -1
        (integer) 5
        #給myhash的field字段的值加-10,返回加后的結(jié)果。
        redis 127.0.0.1:6379> hincrby myhash field -10
        (integer) -5   

        3. HGETALL/HKEYS/HVALS/HMGET/HMSET:
        #刪除該鍵,便于后面示例測試。
        redis 127.0.0.1:6379> del myhash
        (integer) 1
        #為該鍵myhash,一次性設(shè)置多個字段,分別是field1 = "hello", field2 = "world"。
        redis 127.0.0.1:6379> hmset myhash field1 "hello" field2 "world"
        OK
        #獲取myhash鍵的多個字段,其中field3并不存在,因為在返回結(jié)果中與該字段對應(yīng)的值為nil。
        redis 127.0.0.1:6379> hmget myhash field1 field2 field3
        1) "hello"
        2) "world"
        3) (nil)
        #返回myhash鍵的所有字段及其值,從結(jié)果中可以看出,他們是逐對列出的。
        redis 127.0.0.1:6379> hgetall myhash
        1) "field1"
        2) "hello"
        3) "field2"
        4) "world"
        #僅獲取myhash鍵中所有字段的名字。
        redis 127.0.0.1:6379> hkeys myhash
        1) "field1"
        2) "field2"
        #僅獲取myhash鍵中所有字段的值。
        redis 127.0.0.1:6379> hvals myhash
        1) "hello"
        2) "world" 

    分類: Redis
    posted @ 2014-12-01 19:44 小馬歌 閱讀(227) | 評論 (0)編輯 收藏
     

    一、概述:

          在Redis中,List類型是按照插入順序排序的字符串鏈表。和數(shù)據(jù)結(jié)構(gòu)中的普通鏈表一樣,我們可以在其頭部(left)和尾部(right)添加新的元素。在插入時,如果該鍵并不存在,Redis將為該鍵創(chuàng)建一個新的鏈表。與此相反,如果鏈表中所有的元素均被移除,那么該鍵也將會被從數(shù)據(jù)庫中刪除。List中可以包含的最大元素數(shù)量是4294967295。
          從元素插入和刪除的效率視角來看,如果我們是在鏈表的兩頭插入或刪除元素,這將會是非常高效的操作,即使鏈表中已經(jīng)存儲了百萬條記錄,該操作也可以在常量時間內(nèi)完成。然而需要說明的是,如果元素插入或刪除操作是作用于鏈表中間,那將會是非常低效的。相信對于有良好數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)的開發(fā)者而言,這一點并不難理解。

    二、相關(guān)命令列表:

    命令原型時間復(fù)雜度命令描述返回值
    LPUSH key value [value ...] O(1)在指定Key所關(guān)聯(lián)的List Value的頭部插入?yún)?shù)中給出的所有Values。如果該Key不存在,該命令將在插入之前創(chuàng)建一個與該Key關(guān)聯(lián)的空鏈表,之后再將數(shù)據(jù)從鏈表的頭部插入。如果該鍵的Value不是鏈表類型,該命令將返回相關(guān)的錯誤信息。 插入后鏈表中元素的數(shù)量。
    LPUSHX key value O(1)  僅有當(dāng)參數(shù)中指定的Key存在時,該命令才會在其所關(guān)聯(lián)的List Value的頭部插入?yún)?shù)中給出的Value,否則將不會有任何操作發(fā)生。插入后鏈表中元素的數(shù)量。 
    LRANGE key start stop O(S+N)時間復(fù)雜度中的S為start參數(shù)表示的偏移量,N表示元素的數(shù)量。該命令的參數(shù)start和end都是0-based。即0表示鏈表頭部(leftmost)的第一個元素。其中start的值也可以為負(fù)值,-1將表示鏈表中的最后一個元素,即尾部元素,-2表示倒數(shù)第二個并以此類推。該命令在獲取元素時,start和end位置上的元素也會被取出。如果start的值大于鏈表中元素的數(shù)量,空鏈表將會被返回。如果end的值大于元素的數(shù)量,該命令則獲取從start(包括start)開始,鏈表中剩余的所有元素。返回指定范圍內(nèi)元素的列表。
    LPOP key O(1) 返回并彈出指定Key關(guān)聯(lián)的鏈表中的第一個元素,即頭部元素,。如果該Key不存,返回nil。鏈表頭部的元素。
    LLEN keyO(1) 返回指定Key關(guān)聯(lián)的鏈表中元素的數(shù)量,如果該Key不存在,則返回0。如果與該Key關(guān)聯(lián)的Value的類型不是鏈表,則返回相關(guān)的錯誤信息。鏈表中元素的數(shù)量。
    LREM key count value O(N) 時間復(fù)雜度中N表示鏈表中元素的數(shù)量。在指定Key關(guān)聯(lián)的鏈表中,刪除前count個值等于value的元素。如果count大于0,從頭向尾遍歷并刪除,如果count小于0,則從尾向頭遍歷并刪除。如果count等于0,則刪除鏈表中所有等于value的元素。如果指定的Key不存在,則直接返回0。返回被刪除的元素數(shù)量。
    LSET key index value O(N) 時間復(fù)雜度中N表示鏈表中元素的數(shù)量。但是設(shè)定頭部或尾部的元素時,其時間復(fù)雜度為O(1)。設(shè)定鏈表中指定位置的值為新值,其中0表示第一個元素,即頭部元素,-1表示尾部元素。如果索引值Index超出了鏈表中元素的數(shù)量范圍,該命令將返回相關(guān)的錯誤信息。 
    LINDEX key index O(N) 時間復(fù)雜度中N表示在找到該元素時需要遍歷的元素數(shù)量。對于頭部或尾部元素,其時間復(fù)雜度為O(1)。該命令將返回鏈表中指定位置(index)的元素,index是0-based,表示頭部元素,如果index為-1,表示尾部元素。如果與該Key關(guān)聯(lián)的不是鏈表,該命令將返回相關(guān)的錯誤信息。返回請求的元素,如果index超出范圍,則返回nil。
    LTRIM key start stop O(N) N表示被刪除的元素數(shù)量。該命令將僅保留指定范圍內(nèi)的元素,從而保證鏈接中的元素數(shù)量相對恒定。start和stop參數(shù)都是0-based,0表示頭部元素。和其他命令一樣,start和stop也可以為負(fù)值,-1表示尾部元素。如果start大于鏈表的尾部,或start大于stop,該命令不錯報錯,而是返回一個空的鏈表,與此同時該Key也將被刪除。如果stop大于元素的數(shù)量,則保留從start開始剩余的所有元素。 
    LINSERT key BEFORE|AFTER pivot value O(N) 時間復(fù)雜度中N表示在找到該元素pivot之前需要遍歷的元素數(shù)量。這樣意味著如果pivot位于鏈表的頭部或尾部時,該命令的時間復(fù)雜度為O(1)。該命令的功能是在pivot元素的前面或后面插入?yún)?shù)中的元素value。如果Key不存在,該命令將不執(zhí)行任何操作。如果與Key關(guān)聯(lián)的Value類型不是鏈表,相關(guān)的錯誤信息將被返回。成功插入后鏈表中元素的數(shù)量,如果沒有找到pivot,返回-1,如果key不存在,返回0。
    RPUSH key value [value ...] O(1) 在指定Key所關(guān)聯(lián)的List Value的尾部插入?yún)?shù)中給出的所有Values。如果該Key不存在,該命令將在插入之前創(chuàng)建一個與該Key關(guān)聯(lián)的空鏈表,之后再將數(shù)據(jù)從鏈表的尾部插入。如果該鍵的Value不是鏈表類型,該命令將返回相關(guān)的錯誤信息。 插入后鏈表中元素的數(shù)量。 
    RPUSHX key value O(1) 僅有當(dāng)參數(shù)中指定的Key存在時,該命令才會在其所關(guān)聯(lián)的List Value的尾部插入?yún)?shù)中給出的Value,否則將不會有任何操作發(fā)生。 插入后鏈表中元素的數(shù)量。 
    RPOP key O(1) 返回并彈出指定Key關(guān)聯(lián)的鏈表中的最后一個元素,即尾部元素,。如果該Key不存,返回nil。 鏈表尾部的元素。 
    RPOPLPUSHsource destination O(1) 原子性的從與source鍵關(guān)聯(lián)的鏈表尾部彈出一個元素,同時再將彈出的元素插入到與destination鍵關(guān)聯(lián)的鏈表的頭部。如果source鍵不存在,該命令將返回nil,同時不再做任何其它的操作了。如果source和destination是同一個鍵,則相當(dāng)于原子性的將其關(guān)聯(lián)鏈表中的尾部元素移到該鏈表的頭部。返回彈出和插入的元素。

    三、命令示例:

        1. LPUSH/LPUSHX/LRANGE:
        /> redis-cli    #在Shell提示符下啟動redis客戶端工具。
        redis 127.0.0.1:6379> del mykey
        (integer) 1
        #mykey鍵并不存在,該命令會創(chuàng)建該鍵及與其關(guān)聯(lián)的List,之后在將參數(shù)中的values從左到右依次插入。
        redis 127.0.0.1:6379> lpush mykey a b c d
        (integer) 4
        #取從位置0開始到位置2結(jié)束的3個元素。
        redis 127.0.0.1:6379> lrange mykey 0 2
        1) "d"
        2) "c"
        3) "b"
        #取鏈表中的全部元素,其中0表示第一個元素,-1表示最后一個元素。
        redis 127.0.0.1:6379> lrange mykey 0 -1
        1) "d"
        2) "c"
        3) "b"
        4) "a"
        #mykey2鍵此時并不存在,因此該命令將不會進(jìn)行任何操作,其返回值為0。
        redis 127.0.0.1:6379> lpushx mykey2 e
        (integer) 0
        #可以看到mykey2沒有關(guān)聯(lián)任何List Value。
        redis 127.0.0.1:6379> lrange mykey2 0 -1
        (empty list or set)
        #mykey鍵此時已經(jīng)存在,所以該命令插入成功,并返回鏈表中當(dāng)前元素的數(shù)量。
        redis 127.0.0.1:6379> lpushx mykey e
        (integer) 5
        #獲取該鍵的List Value的頭部元素。
        redis 127.0.0.1:6379> lrange mykey 0 0
        1) "e"

        2. LPOP/LLEN:
        redis 127.0.0.1:6379> lpush mykey a b c d
        (integer) 4
        redis 127.0.0.1:6379> lpop mykey
        "d"
        redis 127.0.0.1:6379> lpop mykey
        "c"
        #在執(zhí)行l(wèi)pop命令兩次后,鏈表頭部的兩個元素已經(jīng)被彈出,此時鏈表中元素的數(shù)量是2
        redis 127.0.0.1:6379> llen mykey
        (integer) 2

       3. LREM/LSET/LINDEX/LTRIM:
        #為后面的示例準(zhǔn)備測試數(shù)據(jù)。
        redis 127.0.0.1:6379> lpush mykey a b c d a c
        (integer) 6
        #從頭部(left)向尾部(right)變量鏈表,刪除2個值等于a的元素,返回值為實際刪除的數(shù)量。
        redis 127.0.0.1:6379> lrem mykey 2 a
        (integer) 2
        #看出刪除后鏈表中的全部元素。
        redis 127.0.0.1:6379> lrange mykey 0 -1
        1) "c"
        2) "d"
        3) "c"
        4) "b"
        #獲取索引值為1(頭部的第二個元素)的元素值。
        redis 127.0.0.1:6379> lindex mykey 1
        "d"
        #將索引值為1(頭部的第二個元素)的元素值設(shè)置為新值e。
        redis 127.0.0.1:6379> lset mykey 1 e
        OK
        #查看是否設(shè)置成功。
        redis 127.0.0.1:6379> lindex mykey 1
        "e"
        #索引值6超過了鏈表中元素的數(shù)量,該命令返回nil。
        redis 127.0.0.1:6379> lindex mykey 6
        (nil)
        #設(shè)置的索引值6超過了鏈表中元素的數(shù)量,設(shè)置失敗,該命令返回錯誤信息。
        redis 127.0.0.1:6379> lset mykey 6 hh
        (error) ERR index out of range
        #僅保留索引值0到2之間的3個元素,注意第0個和第2個元素均被保留。
        redis 127.0.0.1:6379> ltrim mykey 0 2
        OK
        #查看trim后的結(jié)果。
        redis 127.0.0.1:6379> lrange mykey 0 -1
        1) "c"
        2) "e"
        3) "c"

        4. LINSERT:
        #刪除該鍵便于后面的測試。
        redis 127.0.0.1:6379> del mykey
        (integer) 1
        #為后面的示例準(zhǔn)備測試數(shù)據(jù)。
        redis 127.0.0.1:6379> lpush mykey a b c d e
        (integer) 5
        #在a的前面插入新元素a1。
        redis 127.0.0.1:6379> linsert mykey before a a1
        (integer) 6
        #查看是否插入成功,從結(jié)果看已經(jīng)插入。注意lindex的index值是0-based。
        redis 127.0.0.1:6379> lindex mykey 0
        "e"
        #在e的后面插入新元素e2,從返回結(jié)果看已經(jīng)插入成功。
        redis 127.0.0.1:6379> linsert mykey after e e2
        (integer) 7
        #再次查看是否插入成功。
        redis 127.0.0.1:6379> lindex mykey 1
        "e2"
        #在不存在的元素之前或之后插入新元素,該命令操作失敗,并返回-1。
        redis 127.0.0.1:6379> linsert mykey after k a
        (integer) -1
        #為不存在的Key插入新元素,該命令操作失敗,返回0。
        redis 127.0.0.1:6379> linsert mykey1 after a a2
        (integer) 0

        5. RPUSH/RPUSHX/RPOP/RPOPLPUSH:
        #刪除該鍵,以便于后面的測試。
        redis 127.0.0.1:6379> del mykey
        (integer) 1
        #從鏈表的尾部插入?yún)?shù)中給出的values,插入順序是從左到右依次插入。
        redis 127.0.0.1:6379> rpush mykey a b c d
        (integer) 4
        #通過lrange的可以獲悉rpush在插入多值時的插入順序。
        redis 127.0.0.1:6379> lrange mykey 0 -1
        1) "a"
        2) "b"
        3) "c"
        4) "d"
        #該鍵已經(jīng)存在并且包含4個元素,rpushx命令將執(zhí)行成功,并將元素e插入到鏈表的尾部。
        redis 127.0.0.1:6379> rpushx mykey e
        (integer) 5
        #通過lindex命令可以看出之前的rpushx命令確實執(zhí)行成功,因為索引值為4的元素已經(jīng)是新元素了。
        redis 127.0.0.1:6379> lindex mykey 4
        "e"
        #由于mykey2鍵并不存在,因此該命令不會插入數(shù)據(jù),其返回值為0。
        redis 127.0.0.1:6379> rpushx mykey2 e
        (integer) 0
        #在執(zhí)行rpoplpush命令前,先看一下mykey中鏈表的元素有哪些,注意他們的位置關(guān)系。
        redis 127.0.0.1:6379> lrange mykey 0 -1
        1) "a"
        2) "b"
        3) "c"
        4) "d"
        5) "e"
        #將mykey的尾部元素e彈出,同時再插入到mykey2的頭部(原子性的完成這兩步操作)。
        redis 127.0.0.1:6379> rpoplpush mykey mykey2
        "e"
        #通過lrange命令查看mykey在彈出尾部元素后的結(jié)果。
        redis 127.0.0.1:6379> lrange mykey 0 -1
        1) "a"
        2) "b"
        3) "c"
        4) "d"
        #通過lrange命令查看mykey2在插入元素后的結(jié)果。
        redis 127.0.0.1:6379> lrange mykey2 0 -1
        1) "e"
        #將source和destination設(shè)為同一鍵,將mykey中的尾部元素移到其頭部。
        redis 127.0.0.1:6379> rpoplpush mykey mykey
        "d"
        #查看移動結(jié)果。
        redis 127.0.0.1:6379> lrange mykey 0 -1
        1) "d"
        2) "a"
        3) "b"
        4) "c"

    四、鏈表結(jié)構(gòu)的小技巧:

          針對鏈表結(jié)構(gòu)的Value,Redis在其官方文檔中給出了一些實用技巧,如RPOPLPUSH命令,下面給出具體的解釋。
          Redis鏈表經(jīng)常會被用于消息隊列的服務(wù),以完成多程序之間的消息交換。假設(shè)一個應(yīng)用程序正在執(zhí)行LPUSH操作向鏈表中添加新的元素,我們通常將這樣的程序稱之為"生產(chǎn)者(Producer)",而另外一個應(yīng)用程序正在執(zhí)行RPOP操作從鏈表中取出元素,我們稱這樣的程序為"消費者(Consumer)"。如果此時,消費者程序在取出消息元素后立刻崩潰,由于該消息已經(jīng)被取出且沒有被正常處理,那么我們就可以認(rèn)為該消息已經(jīng)丟失,由此可能會導(dǎo)致業(yè)務(wù)數(shù)據(jù)丟失,或業(yè)務(wù)狀態(tài)的不一致等現(xiàn)象的發(fā)生。然而通過使用RPOPLPUSH命令,消費者程序在從主消息隊列中取出消息之后再將其插入到備份隊列中,直到消費者程序完成正常的處理邏輯后再將該消息從備份隊列中刪除。同時我們還可以提供一個守護(hù)進(jìn)程,當(dāng)發(fā)現(xiàn)備份隊列中的消息過期時,可以重新將其再放回到主消息隊列中,以便其它的消費者程序繼續(xù)處理。

    分類: Redis
    posted @ 2014-12-01 19:43 小馬歌 閱讀(256) | 評論 (0)編輯 收藏
    僅列出標(biāo)題
    共95頁: First 上一頁 14 15 16 17 18 19 20 21 22 下一頁 Last 
     
    主站蜘蛛池模板: 日韩精品无码一区二区三区免费| 精品无码专区亚洲| 亚洲人和日本人jizz| 7777久久亚洲中文字幕| 亚洲av中文无码字幕色不卡| 男性gay黄免费网站| 91国内免费在线视频| 99视频在线精品免费| 成人免费视频观看无遮挡| 免费一级毛片女人图片| 亚洲日本va在线视频观看| 亚洲精品成人网站在线播放| 亚洲欧美一区二区三区日产| 永久免费无码网站在线观看个| 久久九九全国免费| 成人免费a级毛片无码网站入口 | a级毛片在线视频免费观看| 三年片在线观看免费观看大全动漫| 亚洲一区二区三区免费在线观看| 免费特级黄毛片在线成人观看| 亚洲欧洲中文日韩久久AV乱码| 亚洲国产精品无码专区| 天天爽亚洲中文字幕| 一级一级一级毛片免费毛片| 最近中文字幕高清免费中文字幕mv | 亚洲中文字幕视频国产| 久久精品国产亚洲av四虎| 亚洲AV成人影视在线观看| 中文字幕乱码系列免费| 日本成年免费网站| 亚洲精品高清一二区久久| 亚洲国产日韩在线| free哆拍拍免费永久视频| 2021久久精品免费观看| 久久久久亚洲精品无码网址| 亚洲精品熟女国产| 东北美女野外bbwbbw免费| 免费无码看av的网站| 亚洲AV人无码激艳猛片| 国产亚洲欧美日韩亚洲中文色| 无码A级毛片免费视频内谢|