Redis 介紹
redis 這個想必大家都瞭解,關於redis的安裝參考這裡,redis使用文檔參見這裡,英文文檔。
Redis C用戶端的使用方法
Redis的c用戶端 Hiredis使用比較廣泛,下面主要介紹下它。
1,Hiredis的安裝,配置
Hiredis用戶端 在redis解壓後的deps/hiredis下有相應的檔案。如果你的安裝包沒有相應的檔案可以到這裡下載。
cd deps/hiredis (下載hiredis的話 自行解壓進入 解壓後的目錄)。
make
最後 把相應的檔案加入到 系統目錄下,這樣系統能夠搜尋到。
mkdir /usr/lib/hiredis
cp libhiredis.so /usr/lib/hiredis #將動態串連庫libhiredis.so至/usr/lib/hiredis
mkdir /usr/include/hiredis
cp hiredis.h /usr/include/hiredis
最後注意:
需要更新一下庫的cache,執行命令:sudo ldconfig /usr/lib/
因為程式啟動時,會去/etc/ld.so.cache來尋找所要用的庫,不然會出現如下錯誤:error while loading shared libraries: libhiredis.so.0.10: cannot open shared object file: No such file or directory。 關於這些知識參考這裡。
2,C用戶端訪問Redis
上面的工作完成後,就可以進行串連hiredis伺服器。代碼如下(編譯環境為ubuntu系統上gcc)
// redis_test.c#include <stdio.h>#include <string.h>#include <hiredis.h>int main(){redisContext *c = redisConnect("127.0.0.1", 6379);// ip port if(c->err) { printf("connect error.%s", c->errstr); } else { printf("connected\n"); } char *value="It's a test"; redisReply *reply1 = redisCommand(c, "set key %s", value); freeReplyObject(reply1); redisReply *reply2 = redisCommand(c, "get key"); printf("key:1 value:%s\n", reply2->str); freeReplyObject(reply2); redisFree(c); return 0;}
在linux系統下 .o 就相當於windows裡的obj檔案 .a 是好多個.o合在一起,用於靜態串連 .so 是shared object,用於動態串連的,和dll差不多 。
因此說明兩中編譯方法:
一,採用靜態連結方法
把 hiredis編譯後的 libredis.a 拷貝到當前程式 目錄下,執行如下命令:
gcc -o test redis_test.c libredis.a
運行程式: ./test , 可以看到成功了。
二,動態連結
執行如下命令:gcc -o test redis_test.c libredis.so (注意 使用共用庫前要sudo ldconfig /usr/lib/)
運行程式: ./test , 可以看到成功了。
Redis Java用戶端的使用方法
1,Jedis下載
Jedis 是Redis 的Java用戶端,Redis中Java用戶端使用的相對比較廣泛,下面就介紹Java怎麼連結和實驗Redis.
Jedis在 這裡 通過網址 https://github.com/xetorthio/jedis 下載jedis源碼。
2,編譯Jedis jar 包
通過步驟1 下載下來的源碼發現沒有 jar包,對於編程直接使用源碼比較麻煩,現在把源碼打包為jar檔案下次用的時候可以直接使用了。
用eclipse建立一個Jedis工程把 解壓後的 redis檔案放在建立工程的src目錄下,發現缺失相應的Commons Pool 2.2 包,需要到這裡
下載可執行檔包commons-pool2-2.2-bin.zip,解壓並把commons-pool2-2.2.jar等依賴包 通過 build path 中的Add External Jars 加入
到當前的工程中,最後export jar包,命名為: jedis-2.4.2.jar,可以到這裡下載 http://download.csdn.net/detail/gfsfg8545/7357837 。
3,使用Jedis訪問 Redis
建立工程, 在引入相關jar包後,只要new一個Jedis對象,就能做redis相關操作了。來個簡單的jedis執行個體:
package cn.daniel.test;/** * * @author Daniel * redis java client test. * time 2014-05-16 */import java.util.List;import java.util.Map;import java.util.Map.Entry;import redis.clients.jedis.Jedis;public class JredisTest {public void redisTest() {Jedis redis = new Jedis("172.16.0.126", 6379);// connect server: ip port// redis.auth("user");// string operator// set key-valueredis.set("key1", "1");redis.set("key2", "2");// mset key-valueredis.mset("key3", "3", "key4", "4");// get key-valueSystem.out.println("key:key1 value:"+redis.get("key1"));// MGET key [key ...] List<String> list = redis.mget("key1", "key2", "key3", "key4");for(String s:list) {System.out.println(s);}// hset key field valueredis.hset("website", "CSDN", "http://csdn.net/");redis.hset("website", "Daniel", "http://blog.csdn.net/daniel_ustc");// hgetAll, Get all the fields and values in the hash Map<String, String> map = redis.hgetAll("website");for(Entry<String, String> entry:map.entrySet()) {System.out.println("key: " + entry.getKey()+ " value: " + entry.getValue());}// quitredis.quit();}// redisTestpublic static void main(String[] args) {JredisTest test = new JredisTest();test.redisTest();}}
運行上面的程式即可訪問Redis。也可以用maven管理jar包依賴,據說比較好用。
在實際使用中,一般會採用串連池的方式,不會整個項目都使用一個Connection。jedis pool 是基於apache common pool 實現的,因此主要工程中匯入相應的commons-pool2包,代碼如下:
package cn.ustc.daniel.test;/** * @author Daniel * redis java client test. * JredisPool * time 2014-05-18 */import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;import redis.clients.jedis.JedisPoolConfig;public class JedisPoolTest {private static JedisPool pool=null;/** * create pool */private static JedisPool createJedisPool() {if(pool == null) {// 建立串連池配置參數JedisPoolConfig config = new JedisPoolConfig();//設定jedis最多串連數 config.setMaxTotal(100);// 設定最大阻塞時間,毫秒數config.setMaxWaitMillis(1000);// 設定最多空閑串連個數config.setMaxIdle(10); // 建立串連池 ip port pool = new JedisPool(config, "172.16.0.11", 6379);}return pool;} /** * 在多線程環境同步初始化 */ private static synchronized void poolInit() { if (pool == null) pool=createJedisPool(); } /** * 擷取一個jedis 對象 * * @return */ public static Jedis getJedis() { if (pool == null) poolInit(); return pool.getResource(); } /** * 返還一個串連 */ public static void returnRes(Jedis jedis) { pool.returnResource(jedis); } // main public static void main(String[] args) { Jedis jedis = JedisPoolTest.getJedis(); jedis.set("name","JedisPool"); String value = jedis.get("name"); JedisPoolTest.returnRes(jedis); System.out.println(value); }}
參考資料:
http://www.cnitblog.com/yunshichen/archive/2009/08/28/61065.html
http://flyingsnail.blog.51cto.com/5341669/1371650