Java連接Redis (key-value存儲系統)


Redis簡介:

redis是一個性能非常優秀的內存數據庫,通過key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hashs(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在內存中。區別的是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。
Redis 是一個高性能的key-value數據庫。 redis的出現,很大程度補償了memcached這類key/value存儲的不足,在部 分場合可以對關系數據庫起到很好的補充作用。它提供了Python,Ruby,Erlang,PHP客戶端,使用很方便。redis的安裝配置,比較簡單,詳見官方網站。

在多線程下使用Jedis 

在不同的線程中使用相同的Jedis實例會發生奇怪的錯誤。但是創建太多的實現也不好因為這意味着會建立很多sokcet連接,也會導致奇怪的錯誤發生。單一Jedis實例不是線程安全的。為了避免這些問題,可以使用JedisPool, JedisPool是一個線程安全的網絡連接池。可以用JedisPool創建一些可靠Jedis實例,可以從池中拿到Jedis的實例。這種方式可以解決那些問題並且會實現高效的性能. 
初始化JedisPool 

JedisPool pool = new JedisPool(new JedisPoolConfig(), "localhost");

可以以靜態的方式處理以上代碼,它是線程安全的. 

static {
        pool = new JedisPool(new Config(), "host", 6379);
    }

JedisPoolConfig包含了許多有用的redis指定的連接池的默認參數。比如,如果一個連接300秒內沒有任何的返回Jedis將關閉這個連接. 

可以這樣使用:

Jedis jedis = pool.getResource(); 
try { 
   //隨便做一些對於redis的操作 
   jedis.set("foo", "bar"); 
   String foobar = jedis.get("foo"); 
   jedis.zadd("sose", 0, "car"); jedis.zadd("sose", 0, "bike");  
   Set<String> sose = jedis.zrange("sose", 0, -1); 
 } finally { 
   //這里很重要,一旦拿到的jedis實例使用完畢,必須要返還給池中 
   pool.returnResource(jedis); 
 } 
 //程序關閉時,需要調用關閉方法 
 pool.destroy();

設置主/從分布 

啟用同步復制 
Redis主要為了主/從分布而構建。這意味着"write"請求必須要指向"master", "master"會同步復制改變的內容到"slave". "read"請求可以(不是必須的)被指向"slave",緩解"master"的讀寫壓力. 
可以按以下的步驟使用"master". 為了啟用同步復制,有兩個方式去告訴"slave"將"slaveOf"到一個給定的"master":   1.在redis server的config文件(redis.conf)指明   2.在拿到的jedis實例中調用"slaveOf"方法並指定IP和端口 

jedis.slaveOf("192.168.1.35", 6379);

注意:"slave"也是一個redis server,也可以接收"write"請求並不會報錯,但是改變不會被同步復制,所以如果弄反了jedis的實例則一些操作會被覆蓋. 
禁用同步復制/master失敗后,提升slave 
如果"master"down掉,可以提升"slave"成為新的"master".首先試着禁用同步復制離線的"master",如果有幾個"slave",啟用同步復制其余的"slave"到新的"master". 

slave1jedis.slaveofNoOne(); 
slave2jedis.slaveOf("192.168.1.36", 6379);

因為自己在使用Hadoop做join的時候,小表也很大,導致內存爆滿,所以打算用Redis來看看。把數據加入Redis的代碼如下:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException; 

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

public class RedisInutAccount {

    private static String parseRaw(String str) {
        if (str==null) {
            return "";
        }
        str = str.trim();
        if (str.startsWith("\"")) {
            str = str.substring(1);
        }
        if (str.endsWith("\"")) {
            str = str.substring(0, str.length() - 1);
        }
        return str;
    }

    public static void main(String[] args) throws IOException {
        JedisPool pool = new JedisPool("192.168.2.101", 6379);
        Jedis jedis = pool.getResource();
 
        jedis.flushAll();
 
        File file = new File("sample_account.del");
        FileReader is = new FileReader(file);
        BufferedReader br = new BufferedReader(is);
        String tmp = null;
        while ((tmp = br.readLine()) != null) {
            System.out.println(tmp);
            jedis.set(parseRaw(tmp), "1");
        }
        br.close();
      pool.returnResource(jedis);
      pool.destroy();
  
    }
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM