redis(jedis)相關API ,實現與關係型資料庫相似的功能

來源:互聯網
上載者:User

標籤:

    本文簡單介紹了在使用jedis操作redis這個nosql資料庫過程中,總結的一些問題,例如使用jedis實現形如關係型資料庫的資料關聯關係處理。

    分三個層面:

        1:單表資料處理,新增一行資料到資料庫中,如果存在主鍵id是自增情況的條件下,如何新增資料集合到資料庫行資料;

        2:一對多關聯關係,本文舉例形如---學生&&成績; 一個學生包含多個學科的成績,某一個學科的的成績屬於某個學生;

        3:多對多關聯關係,本文舉例例如---文章&&標籤; 一篇文章可以添加多個標籤,某一個標籤可以被包含於多個文章中;

        整體代碼連結已經上傳git,可以在git上查看: 

http://git.oschina.net/alexgaoyh/MutiModule-parent/blob/master/MutiModule-service/src/test/java/com/alexgaoyh/MutiModule/service/unJunit/redis/test2/TestCase.java

    1:單表資料處理

/** * [向Redis list壓入ID而不是實際的資料]在上面的例子裡 ,我們將“對象”(此例中是簡單訊息)直接壓入Redis list,但通常不應這麼做,由於對象可能被多次引用:例如在一個list中維護其時間順序,在一個集合中儲存它的類別,只要有必要,它還會出現在其他list中,等等。讓我們回到reddit.com的例子,將使用者提交的連結(新聞)添加到list中,有更可靠的方法如下所示:$ redis-cli incr next.news.id(integer) 1$ redis-cli set news:1:title "Redis is simple"OK$ redis-cli set news:1:url "http://code.google.com/p/redis"OK$ redis-cli lpush submitted.news 1OK我們自增一個key,很容易得到一個獨一無二的自增ID,然後通過此ID建立對象–為對象的每個欄位設定一個key。最後將新對象的ID壓入submitted.news list。這隻是牛刀小試。在命令參考文檔中可以讀到所有和list有關的命令。你可以刪除元素,旋轉list,根據索引擷取和設定元素,當然也可以用LLEN得到list的長度。 * * 形如關係型資料庫的單表一行資料(主鍵id為自增) * 自訂一個自增的id ,jedis.incr(key),這個key可以形如mysql這種關係型資料庫的自增主鍵id * 形如關係型資料庫的一行資料,自增主鍵id:jedis.incr(key) 他對應的資料內容:jedis.get("ad:adinfo:" + adInfoId + ":title") jedis.get("ad:adinfo:" + adInfoId + ":url") * 這樣,在查詢這張‘表’結構下的所有資料時,可以匹配查詢即可 */public static void testListStrUsage() {String title = "alexgaoyh";String url = "http://git.oschina.net/alexgaoyh";Jedis jedis = RedisUtil.getJedis(IP, PORT);long adInfoId = jedis.incr("ad:adinfo:next.id");jedis.set("ad:adinfo:" + adInfoId + ":title", title);jedis.set("ad:adinfo:" + adInfoId + ":url", url);jedis.lpush("ad:adinfo", String.valueOf(adInfoId));String resultTitle = jedis.get("ad:adinfo:" + adInfoId + ":title");String resultUrl = jedis.get("ad:adinfo:" + adInfoId + ":url");List<String> ids = jedis.lrange("ad:adinfo", 0, -1);System.out.println(resultTitle);System.out.println(resultUrl);System.out.println(ids);/** * dbsize返回的是所有key的數目,包括已經到期的, 而redis-cli keys "*"查詢得到的是有效key數目 */System.out.println(jedis.dbSize());//清空所有的keyjedis.flushAll();}



 


    2:一對多關聯關係

/** * sort list * LIST結合hash的排序 * 根據指定的SortingParams排序方式,將合格資料格式進行返回 * 關聯關係處理, * 可以理解為studentlist代表學生的整體資料集合 * hset方法,可以將某個學生user:id下的某個域(學科)的成績(value)進行資料儲存 * 根據匹配條件,將相對應的成績進行輸出 */public static void testSort2() {Jedis jedis = RedisUtil.getJedis(IP, PORT);jedis.del("user:66", "user:55", "user:33", "user:22", "user:11", "userlist");jedis.lpush("studentlist", "33");jedis.lpush("studentlist", "22");jedis.lpush("studentlist", "55");jedis.lpush("studentlist", "11");//將雜湊表 key 中的域 field 的值設為 value 。 如果 key 不存在,一個新的雜湊表被建立並進行 HSET 操作。 如果域 field 已經存在於雜湊表中,舊值將被覆蓋。jedis.hset("user:66", "math", "66");jedis.hset("user:55", "math", "55");jedis.hset("user:33", "math", "33");jedis.hset("user:22", "math", "22");jedis.hset("user:11", "math", "11");//學生user:編號,在field域(某個學科-數學/英語)上的成績(value)jedis.hset("user:11", "english", "110");jedis.hset("user:22", "english", "220");jedis.hset("user:33", "english", "330");jedis.hset("user:55", "english", "550");jedis.hset("user:66", "english", "660");SortingParams sortingParameters = new SortingParams();// 符號 "->" 用於分割雜湊表的鍵名(key name)和索引域(hash field),格式為 "key->field" 。sortingParameters.desc();sortingParameters.get("user:*->math");sortingParameters.get("user:*->english");List<String> result = jedis.sort("studentlist", sortingParameters);for (String item : result) {System.out.println("item...." + item);}/** * 對應的redis用戶端命令是:sort ml get user*->name sort ml get user:*->name get * user:*->add */}

/**        * sort set        * SET結合String的排序        * REL關係相關處理操作   好友名單 好友資訊 好友成績資料資訊添加即相應的資料輸出        * 輸出好友id,好友的詳細資料,好友的對應成績        */        public static void testSort3() {              Jedis jedis = RedisUtil. getJedis( IP, PORT);              jedis.del( "tom:friend:list" , "score:uid:123" , "score:uid:456" ,                            "score:uid:789" , "score:uid:101" , "uid:123" , "uid:456" ,                            "uid:789" , "uid:101" );              jedis.sadd( "tom:friend:list" , "123" ); // tom的好友名單              jedis.sadd( "tom:friend:list" , "456" );              jedis.sadd( "tom:friend:list" , "789" );              jedis.sadd( "tom:friend:list" , "101" );              jedis.set( "score:uid:123" , "1000" ); // 好友對應的成績              jedis.set( "score:uid:456" , "6000" );              jedis.set( "score:uid:789" , "100" );              jedis.set( "score:uid:101" , "5999" );              jedis.set( "uid:123" , "{‘uid‘:123,‘name‘:‘lucy‘}" ); // 好友的詳細資料              jedis.set( "uid:456" , "{‘uid‘:456,‘name‘:‘jack‘}" );              jedis.set( "uid:789" , "{‘uid‘:789,‘name‘:‘jay‘}" );              jedis.set( "uid:101" , "{‘uid‘:101,‘name‘:‘jolin‘}" );              SortingParams sortingParameters = new SortingParams();              sortingParameters.desc();               // sortingParameters.limit(0, 2);               // 注意GET操作是有序的,GET user_name_* GET user_password_*               // 和 GET user_password_* GET user_name_*返回的結果位置不同              sortingParameters.get( "#" );// GET 還有一個特殊的規則—— "GET #"                                                               // ,用於擷取被排序對象(tom:friend:list)(我們這裡的例子是 user_id )的當前元素。              sortingParameters.get( "uid:*" );              sortingParameters.get( "score:uid:*" );              sortingParameters.by( "score:uid:*" );               // 對應的 redis 命令是./redis -cli sort tom:friend:list by score:uid:* get # get               // uid :* get score:uid:*              List<String> result = jedis.sort( "tom:friend:list" , sortingParameters);               for (String item : result) {                     System. out .println("item..." + item);              }       }



其中需要注意 sortingParameters.get("#");

GET 還有一個特殊的規則—— "GET #" 用於擷取被排序對象(tom:friend:list)(我們這裡的例子是 user_id )的當前元素。



     3:多對多關聯關係

    

/** * 下面是一個簡單的方案:對每個想加標籤的對象,用一個標籤ID集合與之關聯,並且對每個已有的標籤,一組對象ID與之關聯。 例如假設我們的新聞ID * 1000被加了三個標籤tag 1,2,5和77,就可以設定下面兩個集合:  * $ redis-cli sadd news:1000:tags 1 * (integer) 1  * $ redis-cli sadd news:1000:tags 2  * (integer) 1  * $ redis-cli sadd news:1000:tags 5  * (integer) 1  * $ redis-cli sadd news:1000:tags 77 * (integer) 1  * $ redis-cli sadd tag:1:objects 1000  * (integer) 1  * $ redis-cli sadd tag:2:objects 1000  * (integer) 1  * $ redis-cli sadd tag:5:objects 1000 * (integer) 1  * $ redis-cli sadd tag:77:objects 1000  * (integer) 1 * 要擷取一個對象的所有標籤,如此簡單:  * $ redis-cli smembers news:1000:tags  * 1.52.13.774.2  *  而有些看上去並不簡單的操作仍然能使用相應的Redis命令輕鬆實現。 *  例如我們也許想獲得一份同時擁有標籤1, 2,10和27的對象列表。這可以用SINTER命令來做,他可以在不同集合之間取出交集。 *  因此為達目的我們只需: $ redis-cli sinter tag:1:objects tag:2:objects tag:10:objects tag:27:objects ... no result * in our dataset composed of just one object ... * 在命令參考文檔中可以找到和集合相關的其他命令,令人感興趣的一抓一大把。一定要留意SORT命令,Redis集合和list都是可排序的。 *  * 關係型資料庫雙向關聯操作  一個文章對應多個標籤,一個標籤可以被多個文章關聯 * 多對多的資料庫表結構 */public static void testSetUsage() {Jedis jedis = RedisUtil.getJedis(IP, PORT);//某個文章包含的標籤jedis.sadd("zhongsou:news:1000:tags", "1");jedis.sadd("zhongsou:news:1000:tags", "2");jedis.sadd("zhongsou:news:1000:tags", "5");jedis.sadd("zhongsou:news:1000:tags", "77");jedis.sadd("zhongsou:news:2000:tags", "1");jedis.sadd("zhongsou:news:2000:tags", "2");jedis.sadd("zhongsou:news:2000:tags", "5");jedis.sadd("zhongsou:news:2000:tags", "77");jedis.sadd("zhongsou:news:3000:tags", "2");jedis.sadd("zhongsou:news:4000:tags", "77");jedis.sadd("zhongsou:news:5000:tags", "1");jedis.sadd("zhongsou:news:6000:tags", "5");//某個標籤包含的對應的文章idjedis.sadd("zhongsou:tag:1:objects", 1000 + "");jedis.sadd("zhongsou:tag:2:objects", 1000 + "");jedis.sadd("zhongsou:tag:5:objects", 1000 + "");jedis.sadd("zhongsou:tag:77:objects", 1000 + "");jedis.sadd("zhongsou:tag:1:objects", 2000 + "");jedis.sadd("zhongsou:tag:2:objects", 2000 + "");jedis.sadd("zhongsou:tag:5:objects", 2000 + "");jedis.sadd("zhongsou:tag:77:objects", 2000 + "");//返回一個集合的全部成員,該集合是所有給定集合的交集//這四個標籤全部都被包含的文章id集合Set<String> sets = jedis.sinter("zhongsou:tag:1:objects","zhongsou:tag:2:objects", "zhongsou:tag:5:objects","zhongsou:tag:77:objects");System.out.println(sets);jedis.flushAll();}



redis(jedis)相關API ,實現與關係型資料庫相似的功能

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.