Redis學習記錄之Java中的初步使用

來源:互聯網
上載者:User

標籤:redis   jedis   

1.關於Redis
redis:<span style="font-family: Arial, Helvetica, sans-serif;">http://download.csdn.net/detail/he90227/8569855</span>

Redis是什嗎?兩句話可以做下概括: 1. 是一個完全開源免費的key-value記憶體資料庫 2. 通常被認為是一個資料結構伺服器,主要是因為其有著豐富的資料結構 strings、map、 list、sets、 sorted sets它通過提供多種索引值資料類型來適應不同情境下的儲存需求,並藉助許多高層級的介面使其可以勝任如緩衝、隊列系統等不同的角色和Memcached類似,但是解決了斷電後資料完全丟失的情況,而且她支援更多無化的value類型,除了和string外,還支援lists(鏈表)、sets(集合)和zsets(有序集合)幾種資料類型。這些資料類型都支援push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的2.支援的資料類型              字串類型    string            散列類型         Hash            鏈表表類型     lists            集合類型          sets            有序集合類型  zsets說明:     string是最簡單的類型,你可以理解成與Memcached一模一個的類型,一個key對應一個value,其上支援的操作與Memcached的操作類似。但它的功能更豐富。     list是一個鏈表結構,主要功能是push、pop、擷取一個範圍的所有值等等。操作中key理解為鏈表的名字。     set是集合,和我們數學中的集合概念相似,對集合的操作有添加刪除元素,有對多個集合求交並差等操作。操作中key理解為集合的名字。     zset是set的一個升級版本,他在set的基礎上增加了一個順序屬性,這一屬性在添加修改元素的時候可以指定,每次指定後,zset會自動重新按新的值調整順序。可以理解了有兩列的mysql表,一列存value,一列存順序。操作中key理解為zset的名字。     Hash資料類型允許使用者用Redis儲存物件類型,Hash資料類型的一個重要優點是,當你儲存的資料對象只有很少幾個key值時,資料存放區的記憶體消耗會很小. 3.記憶體儲存於持久化     Redis資料庫中的所有資料都儲存在記憶體中,同時提供了對持久化的支援,即:可以將記憶體中的資料非同步寫入硬碟中,同時不會影響繼續提供服務        redis主從配置redis支援master-slave的主從配置,配置方法是在從機的設定檔中指定slaveof參數為主機的ip和port即可4. Redis VS  Memcached    1.都可以做為緩衝系統使用   2.效能上Redis是單執行緒模式,Memcached支援多線程,所有在多核伺服器上後者的效能更高一些   3.Redis支援進階的資料類型和持久化等功能   4.儲存方式方面:Memcached只支援簡單的key-value儲存,不支援枚舉,不支援持久化和複製等功能5.安裝Redis  -- Redis官方僅支援 Linux、Unix和OS X,不支援WindowsLinux下安裝:  wget或拷貝到指定目錄下    ---  解壓後在src目錄下使用macke命令完成編譯wget http://download.redis.io/redis-stable.tar.gztar xzf redis-stable.tar.gzcd redis-stablemake需要說明的事,redis的安裝非常簡單,已經有現成的Makefile檔案,直接運行make命令即可。makemake installRedis 由四個可執行檔:redis-benchmark、redis-cli、redis-server、redis-stat 這四個檔案,加上一個redis.conf就構成了整個redis的最終可用包。它們的作用如下:redis-server:Redis伺服器的daemon啟動程式redis-cli:Redis命令列操作工具。當然,你也可以用telnet根據其純文字協議來操作redis-benchmark:Redis效能測試工具,測試Redis在你的系統及你的配置下的讀寫效能redis-stat:Redis狀態偵查工具,可以檢測Redis目前狀態參數及延遲狀況6.啟動和停止Redis編譯後產生的可執行檔     redis-server                 ----  Redis 伺服器     redis-cli                    ----  Redis命令列用戶端     redis-server   是Redis的伺服器,啟動Redis即運行redis-serverredis-cli      是Redis內建的Redis命令列用戶端,學習Redis的重要工具啟動Redis       1.直接啟動      -- 運行redis-server即可啟動redis                     注意:           Redis伺服器預設會使用6379連接埠,通過--port參數可以自訂使用的連接埠號碼           eg:               redis-server --port 6380      停止Redis       redis-cli shutdown       Redis有可能正在將記憶體中的資料同步到硬碟中,強行終止Redis進程可能會導致資料丟失,正確的做法是向Redis發送shutdown命令當Redis收到shutdown命令後,會先斷開所有用戶端串連,然後根據配置執行持久化,最後完成退出


2.Redis配置和常用命令
1.Redis配置
redis.conf設定檔:引用#是否作為守護進程運行daemonize yes#配置pid的存放路徑及檔案名稱,預設為當前路徑下pidfile redis.pid#Redis預設監聽連接埠port 6379#用戶端閑置多少秒後,中斷連線timeout 300#日誌顯示層級loglevel verbose#指定日誌輸出的檔案名稱,也可指定到標準輸出連接埠logfile stdout#設定資料庫的數量,預設串連的資料庫是0,可以通過select N來串連不同的資料庫databases 16#儲存資料到disk的策略#當有一條Keys資料被改變是,900秒重新整理到disk一次save 900 1#當有10條Keys資料被改變時,300秒重新整理到disk一次save 300 10#當有1w條keys資料被改變時,60秒重新整理到disk一次save 60 10000#當dump  .rdb資料庫的時候是否壓縮資料對象rdbcompression yes#dump資料庫的資料儲存的檔案名稱dbfilename dump.rdb#Redis的工作目錄dir /home/falcon/redis-2.0.0/###########  Replication ######################Redis的複製配置# slaveof <masterip> <masterport># masterauth <master-password>############## SECURITY ############ requirepass foobared############### LIMITS ###############最大用戶端串連數# maxclients 128#最大記憶體使用量率# maxmemory <bytes>########## APPEND ONLY MODE ##########是否開啟日誌功能appendonly no# 重新整理日誌到disk的規則# appendfsync alwaysappendfsync everysec# appendfsync no################ VIRTUAL MEMORY ############是否開啟VM功能vm-enabled no# vm-enabled yesvm-swap-file logs/redis.swapvm-max-memory 0vm-page-size 32vm-pages 134217728vm-max-threads 4############# ADVANCED CONFIG ###############glueoutputbuf yeshash-max-zipmap-entries 64hash-max-zipmap-value 512#是否重設Hash表activerehashing yes

常規操作命令 01exits key              //測試指定key是否存在,返回1表示存在,0不存在02del key1 key2 ....keyN //刪除給定key,返回刪除key的數目,0表示給定key都不存在03type key               //返回給定key的value類型。返回 none 表示不存在key,string字元類型,list 鏈表類型 set 無序集合類型...04keys pattern           //返回匹配指定模式的所有key,下面給個例子05randomkey              //返回從當前資料庫中隨機播放的一個key,如果當前資料庫是空的,返回空串06rename oldkey newkey   //原子的重新命名一個key,如果newkey存在,將會被覆蓋,返回1表示成功,0失敗。可能是oldkey不存在或者和newkey相同07renamenx oldkey newkey //同上,但是如果newkey存在返回失敗08dbsize                 //返回當前資料庫的key數量09expire key seconds     //為key指定到期時間,單位是秒。返回1成功,0表示key已經設定過到期時間或者不存在10ttl key                //返回設定過到期時間的key的剩餘到期秒數 -1表示key不存在或者沒有設定過到期時間11select db-index        //通過索引選擇資料庫,預設串連的資料庫所有是0,預設資料庫數是16個。返回1表示成功,0失敗12move key db-index      //將key從當前資料庫移動到指定資料庫。返回1成功。0 如果key不存在,或者已經在指定資料庫中13flushdb                //刪除當前資料庫中所有key,此方法不會失敗。慎用14flushall               //刪除所有資料庫中的所有key,此方法不會失敗。更加慎用string 類型資料操作命令 01set key value         //設定key對應的值為string類型的value,返回1表示成功,0失敗02setnx key value       //同上,如果key已經存在,返回0 。nx 是not exist的意思03get key               //擷取key對應的string值,如果key不存在返回nil04getset key value      //原子的設定key的值,並返回key的舊值。如果key不存在返回nil05mget key1 key2 ... keyN            //一次擷取多個key的值,如果對應key不存在,則對應返回nil。下面是個實驗,首先清空當前資料庫,然後設定k1,k2.擷取時k3對應返回nil06mset key1 value1 ... keyN valueN   //一次設定多個key的值,成功返回1表示所有的值都設定了,失敗返回0表示沒有任何值被設定07msetnx key1 value1 ... keyN valueN //同上,但是不會覆蓋已經存在的key08incr key              //對key的值做加加操作,並返回新的值。注意incr一個不是int的value會返回錯誤,incr一個不存在的key,則設定key為109decr key              //同上,但是做的是減減操作,decr一個不存在key,則設定key為-110incrby key integer    //同incr,加指定值 ,key不存在時候會設定key,並認為原來的value是 011decrby key integer    //同decr,減指定值。decrby完全是為了可讀性,我們完全可以通過incrby一個負值來實現同樣效果,反之一樣。12append key value      //給指定key的字串值追加value,返回新字串值的長度。下面給個例子13substr key start end  //返回截取過的key的字串值,注意並不修改key的值。下標是從0開始的,接著上面例子list 類型資料操作命令 01lpush key string          //在key對應list的頭部添加字串元素,返回1表示成功,0表示key存在且不是list類型02rpush key string          //同上,在尾部添加03llen key                  //返回key對應list的長度,key不存在返回0,如果key對應類型不是list返回錯誤04lrange key start end      //返回指定區間內的元素,下標從0開始,負值表示從後面計算,-1表示倒數第一個元素 ,key不存在返回空列表05ltrim key start end       //截取list,保留指定區間內元素,成功返回1,key不存在返回錯誤06lset key index value      //設定list中指定下標的元素值,成功返回1,key或者下標不存在返回錯誤07lrem key count value      //從key對應list中刪除count個和value相同的元素。count為0時候刪除全部08lpop key                  //從list的頭部刪除元素,並返回刪除元素。如果key對應list不存在或者是空返回nil,如果key對應值不是list返回錯誤09rpop                      //同上,但是從尾部刪除10blpop key1...keyN timeout //從左至右掃描返回對第一個非空list進行lpop操作並返回,比如blpop list1 list2 list3 0 ,如果list不存在list2,list3都是非空則對list2做lpop並返回從list2中刪除的元素。如果所有的list都是空或不存在,則會阻塞timeout秒,timeout為0表示一直阻塞。當阻塞時,如果有client對key1...keyN中的任意key進行push操作,則第一在這個key上被阻塞的client會立即返回。如果逾時發生,則返回nil。有點像unix的select或者poll11brpop                     //同blpop,一個是從頭部刪除一個是從尾部刪除12rpoplpush srckey destkey  //從srckey對應list的尾部移除元素並添加到destkey對應list的頭部,最後返回被移除的元素值,整個操作是原子的.如果srckey是空或者不存在返回nilset 類型資料操作命令 01sadd key member                //添加一個string元素到,key對應的set集合中,成功返回1,如果元素以及在集合中返回0,key對應的set不存在返回錯誤02srem key member                //從key對應set中移除給定元素,成功返回1,如果member在集合中不存在或者key不存在返回0,如果key對應的不是set類型的值返回錯誤03spop key                       //刪除並返回key對應set中隨機的一個元素,如果set是空或者key不存在返回nil04srandmember key                //同spop,隨機取set中的一個元素,但是不刪除元素05smove srckey dstkey member     //從srckey對應set中移除member並添加到dstkey對應set中,整個操作是原子的。成功返回1,如果member在srckey中不存在返回0,如果key不是set類型返回錯誤06scard key                      //返回set的元素個數,如果set是空或者key不存在返回007sismember key member           //判斷member是否在set中,存在返回1,0表示不存在或者key不存在08sinter key1 key2...keyN        //返回所有給定key的交集09sinterstore dstkey key1...keyN //同sinter,但是會同時將交集存到dstkey下10sunion key1 key2...keyN        //返回所有給定key的並集11sunionstore dstkey key1...keyN //同sunion,並同時儲存並集到dstkey下12sdiff key1 key2...keyN         //返回所有給定key的差集13sdiffstore dstkey key1...keyN  //同sdiff,並同時儲存差集到dstkey下14smembers key                   //返回key對應set的所有元素,結果是無序的sorted set 類型資料操作命令 01zadd key score member        //添加元素到集合,元素在集合中存在則更新對應score02zrem key member              //刪除指定元素,1表示成功,如果元素不存在返回003zincrby key incr member      //增加對應member的score值,然後移動元素並保持skip list保持有序。返回更新後的score值04zrank key member             //返回指定元素在集合中的排名(下標),集合中元素是按score從小到大排序的05zrevrank key member          //同上,但是集合中元素是按score從大到小排序06zrange key start end         //類似lrange操作從集合中去指定區間的元素。返回的是有序結果07zrevrange key start end      //同上,返回結果是按score逆序的08zrangebyscore key min max    //返回集合中score在給定區間的元素09zcount key min max           //返回集合中score在給定區間的數量10zcard key                    //返回集合中元素個數11zscore key element           //返回給定元素對應的score12zremrangebyrank key min max  //刪除集合中排名在給定區間的元素13zremrangebyscore key min max //刪除集合中score在給定區間的元素hash 類型資料操作命令 01hset key field value       //設定hash field為指定值,如果key不存在,則先建立02hget key field             //擷取指定的hash field03hmget key filed1....fieldN //擷取全部指定的hash filed04hmset key filed1 value1 ... filedN valueN //同時設定hash的多個field05hincrby key field integer  //將指定的hash filed 加上給定值06hexists key field          //測試指定field是否存在07hdel key field             //刪除指定的hash field08hlen key                   //返回指定hash的field數量09hkeys key                  //返回hash的所有field10hvals key                  //返回hash的所有value11hgetall                    //返回hash的所有filed和value


3.redis在Java中的使用1.maven依賴:
<!-- Redis依賴 --><dependency>    <groupId>redis.clients</groupId>    <artifactId>jedis</artifactId>    <version>2.7.0</version></dependency><!-- Spring整合Redis依賴 --><dependency>    <groupId>org.springframework.data</groupId>    <artifactId>spring-data-redis</artifactId>    <version>1.5.0.RELEASE</version></dependency>

2.用戶端執行個體
properties檔案基本配置redis.pool.maxActive=100redis.pool.maxIdle=20redis.pool.maxWait=3000redis.ip=localhostredis.port=6379


import java.util.ResourceBundle;import com.alibaba.fastjson.JSON;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;import redis.clients.jedis.JedisPoolConfig;import redis.clients.jedis.ShardedJedis;import redis.clients.jedis.ShardedJedisPool;public class RedisClient {public  static  JedisPool jedisPool; // 池化管理jedis連結池    static {        //讀取相關的配置    ResourceBundle resourceBundle = ResourceBundle.getBundle("redis");    int maxActive = Integer.parseInt(resourceBundle.getString("redis.pool.maxActive"));    int maxIdle = Integer.parseInt(resourceBundle.getString("redis.pool.maxIdle"));    int maxWait = Integer.parseInt(resourceBundle.getString("redis.pool.maxWait"));        String ip = resourceBundle.getString("redis.ip");    int port = Integer.parseInt(resourceBundle.getString("redis.port"));        JedisPoolConfig config = new JedisPoolConfig();      //設定最大串連數    config.setMaxTotal(maxActive);    //設定最大空閑數    config.setMaxIdle(maxIdle);    //設定逾時時間    config.setMaxWaitMillis(maxWait);        //初始化串連池    jedisPool = new JedisPool(config, ip, port);   }    /**   * 向緩衝中設定字串內容   * @param key key   * @param value value   * @return   * @throws Exception   */  public static boolean  set(String key,String value) throws Exception{    Jedis jedis = null;    try {      jedis = jedisPool.getResource();      jedis.set(key, value);      return true;    } catch (Exception e) {      e.printStackTrace();      return false;    }finally{      jedisPool.returnResource(jedis);    }  }    /**   * 向緩衝中設定對象   * @param key    * @param value   * @return   */  public static boolean  set(String key,Object value){    Jedis jedis = null;    try {      String objectJson = JSON.toJSONString(value);      jedis = jedisPool.getResource();      jedis.set(key, objectJson);      return true;    } catch (Exception e) {      e.printStackTrace();      return false;    }finally{      jedisPool.returnResource(jedis);    }  }    /**   * 刪除緩衝中得對象,根據key   * @param key   * @return   */  public static boolean del(String key){    Jedis jedis = null;    try {      jedis = jedisPool.getResource();      jedis.del(key);      return true;    } catch (Exception e) {      e.printStackTrace();      return false;    }finally{      jedisPool.returnResource(jedis);    }  }    /**   * 根據key 擷取內容   * @param key   * @return   */  public static Object get(String key){    Jedis jedis = null;    try {      jedis = jedisPool.getResource();      Object value = jedis.get(key);      return value;    } catch (Exception e) {      e.printStackTrace();      return false;    }finally{      jedisPool.returnResource(jedis);    }  }    /**   * 根據key 擷取對象   * @param key   * @return   */  public static <T> T get(String key,Class<T> clazz){    Jedis jedis = null;    try {      jedis = jedisPool.getResource();      String value = jedis.get(key);      return JSON.parseObject(value, clazz);    } catch (Exception e) {      e.printStackTrace();      return null;    }finally{      jedisPool.returnResource(jedis);    }  }  //private Jedis jedis;  //非切片的用戶端串連//private JedisPool jedisPool; //非切片串連池//private ShardedJedis shardedJedis; //切片的資料庫連接//private ShardedJedisPool shardedJedisPool; // 切片串連池////public RedisClient() {//initialPool();//initialShardedPool();//shardedJedis = shardedJedisPool.getResource();//jedis = jedisPool.getResource();//}/////*// * 初始化非切片池// *///private void initialPool() {////池基本配置//JedisPoolConfig config = new JedisPoolConfig();//config.setMaxIdle(5);//config.set//}////private void initialShardedPool() {//shardedJedisPool ////}}

測試代碼package com.jay.demo6.redis.test;import org.junit.Test;public class RedisDemoTest {/* * 向Redis中添加需要緩衝的資料 */@Testpublic void setUserCache() {// 向緩衝中添加儲存對象UserDO user1 = new UserDO();user1.setId(1111);user1.setSex(true);user1.setPhone("1783797435");user1.setEmail("[email protected]");// 調用方法處理boolean resultCache = RedisClient.set("user1", user1);if (resultCache) {System.out.println("向緩衝中儲存對象成功。");} else {System.out.println("向緩衝中儲存對象失敗。");}}/* *從Reids中擷取緩衝的資料 */@Testpublic void getUserCahce(){UserDO user1 = RedisClient.get("user1",UserDO.class);if(user1!=null){System.out.println(user1.toString());}}}
</pre><pre code_snippet_id="637583" snippet_file_name="blog_20150407_12_3514709" name="code" class="html">package com.jay.demo6.redis.test;public class UserDO {    private int id;    private boolean sex;    private String name;    private String phone;    private String email;    public UserDO() {        super();    }    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public boolean isSex() {        return sex;    }    public void setSex(boolean sex) {        this.sex = sex;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getPhone() {        return phone;    }    public void setPhone(String phone) {        this.phone = phone;    }    public String getEmail() {        return email;    }    public void setEmail(String email) {        this.email = email;    }    @Override    public String toString() {        return "UserDO [id=" + id + ", sex=" + (sex?"男":"女") + ", name=" + name                + ", phone=" + phone + ", email=" + email + "]";    }}




Redis學習記錄之Java中的初步使用

聯繫我們

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