Redis 和 Jedis

一直想整理一些redis的資料,今天終於有開始了~

1、 什麼是Redis
(以下內容參考自百度百科:http://baike.baidu.com/link?url=_daPcmtbGPr4cSc8J-pN_YXFpXzPdQ83iTGHj7QmtZc0OUDFA4InvaYbIBJlBKjGugLwDJeM3iwAJWlCh-OgCK

redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set –有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,爲了保證效率,數據都是緩存在內存中。區別的是redis會週期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。
Redis 是一個高性能的key-value數據庫。 redis的出現,很大程度補償了memcached這類key/value存儲的不足,在部 分場合可以對關係數據庫起到很好的補充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客戶端,使用很方便。[1]
Redis支持主從同步。數據可以從主服務器向任意數量的從服務器上同步,從服務器可以是關聯其他從服務器的主服務器。這使得Redis可執行單層樹複製。存盤可以有意無意的對數據進行寫操作。由於完全實現了發佈/訂閱機制,使得從數據庫在任何地方同步樹時,可訂閱一個頻道並接收主服務器完整的消息發佈記錄。同步對讀取操作的可擴展性和數據冗餘很有幫助。
目前,Vmware在資助着redis項目的開發和維護。

2、redis操作命令

redis操作命令可以參考:
http://redisdoc.com/

3、redis優缺點

Redis和Memcache比較:
(1) Redis和Memcache都是將數據存放在內存中,都是內存數據庫。不過memcache還可用於緩存其他東西,例如圖片、視頻等等。
(2)Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,hash等數據結構的存儲。
(3)虛擬內存–Redis當物理內存用完時,可以將一些很久沒用到的value 交換到磁盤
(4)過期策略–memcache在set時就指定,例如set key1 0 0 8,即永不過期。Redis可以通過例如expire 設定,例如expire name 10
(5)分佈式–設定memcache集羣,利用magent做一主多從;redis可以做一主多從。都可以一主一從
(6)存儲數據安全–memcache掛掉後,數據沒了;redis可以定期保存到磁盤(持久化)
(7)災難恢復–memcache掛掉後,數據不可恢復; redis數據丟失後可以通過aof恢復
(8)Redis支持數據的備份,即master-slave模式的數據備份。

其他的可以自行百度
網上隨便找了幾篇博客,可以看看:
http://www.cnblogs.com/davidgu/p/3665589.html
http://blog.sina.com.cn/s/blog_9c581bd30101d5s8.html

4、Java訪問redis——jedis

jedis是redis官方訪問redis的接口。具體使用方法可以參考:
http://www.cnblogs.com/liuling/p/2014-4-19-04.html

部分實例代碼如下:

package redis;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import redis.clients.jedis.Jedis;

public class TestRedis {
    private static Jedis jedis;

    public static void setup() {
        jedis = new Jedis("127.0.0.1", 6379);

        // 可以不用
        jedis.auth("password");
    }

    public void testString() {
        String key = "key";
        String value = "value";

        jedis.set(key, value);
        System.out.println(jedis.get(key));

        jedis.append(key, value);
        System.out.println(jedis.get(key));

        jedis.del(key);
        System.out.println(jedis.get(key));

        // 設置多個鍵值對
        jedis.mset("name", "xiaogang", "age", "23");
        jedis.incr("age"); // 加1操作
        System.out.println(jedis.get("name") + " " + jedis.get("age"));
    }

    public void testMap() {
        Map<String, String> map = new HashMap<String, String>();
        map.put("name", "name");
        map.put("age", "23");

        jedis.hmset("map", map);

        List<String> rsmap = jedis.hmget("map", "name", "age");
        jedis.hset("map", "qq", "123432");

        jedis.hdel("map", "qq");

        System.out.println(jedis.hmget("map", "name"));
        System.out.println(jedis.hlen("map"));//返回key爲map鍵中存放值得個數
        System.out.println(jedis.exists("map"));
        System.out.println(jedis.hkeys("map"));
        System.out.println(jedis.hvals("map"));
    }

}

Redis連接池

package redis;

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

public final class RedisUtil {
    private static final String ADDR = "localhost";

    private static final int PORT = 6379;

    // 端口密碼
    // private static final String AUTH = "admin";

    // 可用連接實例的最大數目,默認值爲8;
    // 如果賦值爲-1,則表示不限制;如果pool已經分配了maxActive個jedis實例,則此時pool的狀態爲exhausted(耗盡)。
    private static final int MAX_ACTIVE = 1024;

    // 控制一個pool最多有多少個狀態爲idle(空閒的)的jedis實例,默認值也是8。
    private static int MAX_IDLE = 200;

    // 等待可用連接的最大時間,單位毫秒,默認值爲-1,表示永不超時。如果超過等待時間,則直接拋出JedisConnectionException;
    private static int MAX_WAIT = 10000;

    private static int TIMEOUT = 10000;

    // 在borrow一個jedis實例時,是否提前進行validate操作;如果爲true,則得到的jedis實例均是可用的;
    private static boolean TEST_ON_BORROW = true;

    private static JedisPool jedisPool = null;

    /**
     * 初始化Redis連接池
     */
    static {
        try {
            JedisPoolConfig config = new JedisPoolConfig();
            config.setMaxActive(MAX_ACTIVE);
            config.setMaxIdle(MAX_IDLE);
            config.setMaxWait(MAX_WAIT);
            config.setTestOnBorrow(TEST_ON_BORROW);
            jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT);
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }

    /**
     * 獲取jedis實例
     */

    public synchronized static Jedis getJedis() {
        try {
            if (jedisPool != null) {
                Jedis resource = jedisPool.getResource();
                return resource;
            } else {
                return null;
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
            return null;
        }
    }

    public static void returnResource(final Jedis jedis) {
        if (jedis != null) {
            jedisPool.returnResource(jedis);
        }
    }

    public static void returnBorkenResource(final Jedis jedis) {
        if (jedis != null) {
            jedisPool.returnBrokenResource(jedis);
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章