Redis學習筆記1--入門篇

來源:互聯網
上載者:User
一、Redis簡介:

Redis(http://redis.io)是一款開源的、高效能的鍵-值儲存(key-value store),它是用ANSI C來編寫。Redis的項目名是Remote Dictionary Server的縮寫,但它常被稱作是一款資料結構伺服器(data structureserver)。Redis的索引值可以包括字串(strings)、雜湊(hashes)、列表(lists)、集合(sets)和 有序集合(sorted sets)等資料類型。 對於這些資料類型,你可以執行原子操作。例如:對字串進行附加操作(append);遞增雜湊中的值;向列表中增加元素;計算集合的交集、並集與差集等。

為了獲得優異的效能,Redis採用了記憶體中(in-memory)資料集(dataset)的方式。根據使用情境的不同,你可以每隔一段時間將資料集轉存到磁碟上來持久化資料,或者在日誌尾部追加每一條操作命令。

Redis同樣支援主從複製(master-slave replication),並且具有非常快速的非阻塞首次同步(non-blockingfirst synchronization)、網路斷開自動重連等功能。同時Redis還具有其它一些特性,其中包括簡單的check-and-set機制、pub/sub和配置設定等,以便使得Redis能夠表現得更像緩衝(cache)。

Redis還提供了豐富的用戶端,以便支援現階段流行的大多數程式設計語言。  二、Redis安裝:

2.4.15目前是最新穩定版。下載地址:http://redis.googlecode.com/files/redis-2.4.15.tar.gz

linux下運行如下命令進行安裝(linux上已經安裝好了gcc):

$ tar xzf redis-2.4.15.tar.gz
$ cd redis-2.4.15
$ make

make完後 redis-2.4.15/src目錄下會出現編譯後的redis服務程式redis-server,還有用於測試的用戶端程式redis-cli。

下面啟動redis服務:

$./redis-server

這種方式啟動redis 使用的是預設配置。也可以通過啟動參數告訴redis使用指定設定檔使用下面命令啟動:

$./redis-server ../redis.conf

在redis-2.4.15目錄下的redis.conf是一個預設的設定檔。我們可以根據需要使用自己的設定檔。

啟動redis服務進程後,就可以使用測試用戶端程式redis-cli和redis服務互動了:

$ ./redis-cli
redis 127.0.0.1:6379> set foo bar
OK
redis 127.0.0.1:6379> get foo
"bar"

上面示範了get和set命令操作簡單類型value的例子。foo是key ,bar是個string類型的value。

停止Redis命令:

./redis-cli-p 6379 shutdown     其中6379是redis的連接埠號碼 三、Redis用戶端:

Redis的用戶端有很多,有C、C++、C#、Java、PHP、Perl、Python、Ruby等等,支援現階段流行的大多數程式設計語言,詳情請看redis官網:http://redis.io/clients

下面是Java版的Redis用戶端樣本:

用戶端jar包地址https://github.com/xetorthio/jedis/downloads

package com.jd.redis.client;

 

import redis.clients.jedis.Jedis;

 

publicclass App {

    publicstaticvoid main(String[] args) {

        Jedis jr = null;

        try {

            //redis服務地址和連接埠號碼

            jr = new Jedis("192.168.157.128", 6379);

            String key = "mkey";

            jr.set(key,"hello,redis!");

            String v = jr.get(key);

            String k2 = "count";

            jr.incr(k2);

            jr.incr(k2);

            System.out.println(v);

            System.out.println(jr.get(k2));

        } catch (Exception e) {

            e.printStackTrace();

        }

        finally{

            if(jr!=null){

                jr.disconnect();

            }

        }

    }

}

 

Jedis用戶端支援對象池,可以通過JedisPool.getResource方法從池中擷取Jedis用戶端對象,通過JedisPool.returnResource方法釋放Jedis對象到池中,用對象池我們可以節省很多重新串連Redis Server的建議串連的時間,下面就是不用Jedis對象池與用Jedis對象池的一個效能對比:

測試方法:分別用直接new Jedis和從池中擷取Jedis對象的方法,起200個並發,生個並發迴圈1000次。每個並發線程用一個Jedis對象。

測試代碼如下:

package com.jd.redis.client;

 

import java.util.concurrent.CountDownLatch;

 

import redis.clients.jedis.Jedis;

import redis.clients.jedis.JedisPool;

import redis.clients.jedis.JedisPoolConfig;

 

publicclass JedisPoolTest {

 

    privatestatic JedisPoolConfigconfig;//Jedis用戶端池配置

    privatestatic JedisPoolpool;//Jedis用戶端池

   

    static{

        config =new JedisPoolConfig();

        config.setMaxActive(60000);

          config.setMaxIdle(1000);

          config.setMaxWait(10000);

          config.setTestOnBorrow(true);

          pool =new JedisPool(config,"192.168.157.128", 6380);

    }

   

    /**

     * 單筆測試(不用池)

     * @param count

     */

    publicstaticvoid testNoPool(int count){

        for(int i=0;i<count;i++){

            Jedis jr = null;

            try {

                jr = new Jedis("10.10.224.44", 6379);

                testOnce(jr);

            } catch (Exception e) {

                e.printStackTrace();

            }

            finally{

                if(jr!=null)jr.disconnect();

            }

        }

    }

   

    /**

     * 單筆測試(用池)

     * @param count

     */

    publicstaticvoid testWithPool(int count){

        for(int i=0;i<count;i++){

            Jedis jr = null;

            try {

                jr = pool.getResource();

                testOnce(jr);

            } catch (Exception e) {

                e.printStackTrace();

            }

            finally{

                if(jr!=null)pool.returnResource(jr);

            }

        }

    }

   

    /**

     * 並發測試(不用池)

     * @param paiallel並發量

     * @param count每個並發迴圈次數

     */

    publicstaticvoid paiallelTestNoPool(int paiallel, int count){

       

        Thread[] ts = new Thread[paiallel];

       

        //用該對象保證所線程都完成主線程才退出

        CountDownLatch cd = new CountDownLatch(paiallel);

       

        long start = System.currentTimeMillis();

        for(int i=0; i < paiallel; i++){

            ts[i] = new Thread(new WorkerNoPool(cd, count));

            ts[i].start();

        }

       

        try {

            cd.await();//等待所有子線程完成

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

        System.out.println("NoPool useTime:"+ (System.currentTimeMillis() - start));

    }

   

    /**

     * 並發測試(用池)

     * @param paiallel並發量

     * @param count每個並發迴圈次數

     */

    publicstaticvoid paiallelTestWithPool(int paiallel, int count){

       

        //用該對象保證所線程都完成主線程才退出

        CountDownLatch cd = new CountDownLatch(paiallel);

       

        long start = System.currentTimeMillis();

        Thread[] ts = new Thread[paiallel];

        for(int i=0; i < paiallel; i++){

            ts[i] = new Thread(new WorkerWithPool(cd, count));

            ts[i].start();

        }

        try {

            cd.await();//等待所有子線程完成

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

        System.out.println("Pool useTime:"+ (System.currentTimeMillis() - start));

        pool.destroy();

    }

   

    privatestaticvoid testOnce(Jedis jr){

        System.out.println(jr.incr("incrTest"));

    }

   

    publicstaticclass WorkerNoPoolimplements Runnable{

        private CountDownLatchcd;

        privateintcount;

       

        public WorkerNoPool(CountDownLatch cd,int count){

            this.cd = cd;

            this.count = count;

        }

       

        publicvoid run() {

            try {

                testNoPool(this.count);

            } catch (Exception e) {

     

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.