標籤: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中的初步使用