1. 程式人生 > >Redis與java結合使用

Redis與java結合使用

Redis  開源免費的高效能key-value資料庫 內建資料庫

特點:
1、redis支援資料持久話,可以將記憶體中資料儲存在磁碟中,重啟的時候可以再次載入進行使用。
2、Redis不僅僅支援簡單的key-value型別的資料,同時還提供listset,zset,hash等資料結構的儲存。
3、Redis支援資料的備份。
2、Redis的優勢
效能極高
Redis能讀的速度是110000次/s,寫的速度是81000次/s
豐富的資料型別
Redis支援二進位制型別儲存,Strings,Lists,Hashes,Sets及Ordered Sets資料型別操作。
原子
Redis的所有操作都是原子性的,同時Redis還支援幾個操作全並後的原子性執行。
豐富的特性
Redis還支援publish/subscribe 釋出訂閱模式 通知key值過期等特性。
3
、Redis的安裝 redis-servcer.exe redis伺服器 redis-cli.exe redis命令列客戶端 redis-benchmar.exe redis效能測試工具 redis-check-aof.exe AOF檔案修復工具 redis.windows.conf 4、Redis簡單的測試 啟動Redis伺服器 執行 redis-server.exe redis.windows.conf 啟動Redis客戶端 另開啟一個視窗 redis-cli.exe shutdown關閉伺服器 客戶端常用命令 Auth 命令用於檢測給定密碼和配置檔案中的密碼是否相符 Ping 命令使用客戶端向Redis伺服器傳送一個Ping,如果伺服器運作正常的話,會返回一個PONG 通常用於測試與伺服器連線是否生效,或者用於測量延遲值。 QUIT命令用於關閉與當前客戶端與redis服務的連線 一旦所有等待中的回覆 順利的寫入到客戶端,連線就會被關閉。 Select
命令用於切換到指定的資料庫 資料庫索引號index用數字值指定,以0作為索引值。 5、Redis配置引數介紹 redis.window.conf檔案中配置項如下 1、Redis預設不是守護程序的方式執行,可以通過該配置項修改,使用yes啟用守護程序(window版本中不支援) daemonize no 2)當Redis以守護程序方式執行時,Redis預設會把pid寫入/var/run/redis.pid檔案,可以通過pidfile指定(windows版本中不支援) pidfile /var/run/redis.pid 3)指定Redis監聽埠,預設埠為6379 port 6379 4)繫結的主機地址 bind 127.0
.0.1 5)當客戶端閒置多長時間後關閉連線,如果指定為0,表示關閉該功能 timeout 300 6)指定日誌記錄級別,Redis總共支援四個級別:debug、verbose、notice、warning,預設為notice(redis版本不同會有所區別) loglevel notice 7)日誌記錄方式,預設為標準輸出 logfile stdout 8)設定資料庫的數量,預設資料庫的index為0,可以使用SELECT <dbid>命令在連線上指定資料庫id databases 16 9)指定在多長時間內,有多少次更新操作,就將資料同步到資料檔案,可以多個條件配合 save <seconds> <changes> Redis預設配置檔案中提供了三個條件: save 900 1 save 300 10 save 60 10000 分別表示900秒(15分鐘)內有1個更改,300秒(5分鐘)內有10個更改以及60秒內有10000個更改。 10)指定儲存至本地資料庫時是否壓縮資料,預設為yes,Redis採用LZF壓縮,如果為了節省CPU時間,可以關閉該選項,但會導致資料庫檔案變的巨大 rdbcompression yes 11)指定redis的本地資料庫檔名,預設值為dump.rdb dbfilename dump.rdb 12)指定redis本地資料庫存放目錄,預設是./ 可以根據自己的情況更改 dir ./ 13)設定當本機為slav服務時,設定master服務的IP地址及埠,在Redis啟動時,它會自動從master進行資料同步 slaveof <masterip> <masterport> 14)當master服務設定了密碼保護時,slav服務連線master的密碼 masterauth <master-password> 15)設定Redis連線密碼,如果配置了連線密碼,客戶端在連線Redis時需要通過AUTH <password>命令提供密碼,預設關閉 requirepass briup 16)設定同一時間最大客戶端連線數,預設無限制,Redis可以同時開啟的客戶端連線數為Redis程序可以開啟的最大檔案描述符數,如果設定 maxclients 0,表示不作限制。當客戶端連線數到達限制時,Redis會關閉新的連線並向客戶端返回max number of clients reached錯誤資訊 maxclients 128 17)指定Redis最大記憶體限制,Redis在啟動時會把資料載入到記憶體中,達到最大記憶體後,Redis會先嚐試清除已到期或即將到期的Key,當此方法處理後,仍然到達最大記憶體設定,將無法再進行寫入操作,但仍然可以進行讀取操作。Redis新的vm機制,會把Key存放記憶體,Value會存放在swap區 maxmemory <bytes> 18)指定是否在每次更新操作後進行日誌記錄,Redis在預設情況下是非同步的把資料寫入磁碟,如果不開啟,可能會在斷電時導致一段時間內的資料丟失。因為 redis本身同步資料檔案是按上面save條件來同步的,所以有的資料會在一段時間內只存在於記憶體中。預設為no appendonly no 19)指定更新日誌檔名,預設為appendonly.aof appendfilename appendonly.aof 20)指定更新日誌條件,共有3個可選值 no:表示等作業系統進行資料快取同步到磁碟(快) always:表示每次更新操作後手動呼叫fsync()將資料寫到磁碟(慢,安全) everysec:表示每秒同步一次(折衷,預設值) appendfsync everysec 21)指定是否啟用虛擬記憶體機制,預設值為no 簡單的介紹一下,VM機制將資料分頁存放,由Redis將訪問量較少的頁即冷資料swap到磁碟上,訪問多的頁面由磁碟自動換出到記憶體中(在後面的文章我會仔細分析Redis的VM機制) vm-enabled no 22)虛擬記憶體檔案路徑,預設值為/tmp/redis.swap,不可多個Redis例項共享 vm-swap-file /tmp/redis.swap 23)將所有大於vm-max-memory的資料存入虛擬記憶體,無論vm-max-memory設定多小,所有索引資料都是記憶體儲存的(Redis的索引資料 就是keys),也就是說,當vm-max-memory設定為0的時候,其實是所有value都存在於磁碟。預設值為0 vm-max-memory 0 24)Redis swap檔案分成了很多的page,一個物件可以儲存在多個page上面,但一個page上不能被多個物件共享,vm-page-size是要根據儲存的 資料大小來設定的,作者建議如果儲存很多小物件,page大小最好設定為32或者64bytes;如果儲存很大大物件,則可以使用更大的page,如果不 確定,就使用預設值 vm-page-size 32 25)設定swap檔案中的page數量,由於頁表(一種表示頁面空閒或使用的bitmap)是在放在記憶體中的,,在磁碟上每8個pages將消耗1byte的記憶體。 vm-pages 134217728 26)設定訪問swap檔案的執行緒數,最好不要超過機器的核數,如果設定為0,那麼所有對swap檔案的操作都是序列的,可能會造成比較長時間的延遲。預設值為4 vm-max-threads 4 27)設定在向客戶端應答時,是否把較小的包合併為一個包傳送,預設為開啟 glueoutputbuf yes 28)指定在超過一定的數量或者最大的元素超過某一臨界值時,採用一種特殊的雜湊演算法 hash-max-zipmap-entries 64 hash-max-zipmap-value 512 29)指定是否啟用重置雜湊,預設為開啟(後面在介紹Redis的雜湊演算法時具體介紹) activerehashing yes 30)指定包含其它的配置檔案,可以在同一主機上多個Redis例項之間使用同一份配置檔案,而同時各個例項又擁有自己的特定配置檔案 include /path/to/local.conf 7.Redis支援的資料型別 string(字串) hash(雜湊) list(列表) set(集合) zset(sorted set:有序集合) 1)string(字串) string是redis最基本的型別,一個key對應一個value。 string型別是二進位制安全的。意思是redis的string可以包含任何資料。比如jpg圖片或者序列化的物件 。 string型別是Redis最基本的資料型別,一個鍵最大能儲存512MB。 例如: 127.0.0.1:6379> SET name "briup" OK 127.0.0.1:6379> GET name "briup" //刪除 127.0.0.1:6379> del name (integer) 1 注意:value中的雙引號要不要都可以 2)hash(雜湊) Redis hash 是一個鍵值對集合。 Redis hash 是一個string型別的field和value的對映表,hash特別適合用於儲存物件。 例如: 127.0.0.1:6379> HMSET user username briup password 123 OK 127.0.0.1:6379> HGETALL user 1) "username" 2) "briup" 3) "password" 4) "123" 127.0.0.1:6379> hget user username "briup" //刪除 127.0.0.1:6379> del user (integer) 1 例子中使用了 hash 資料型別儲存了包含使用者資訊的使用者物件。 每個 hash 可以儲存 231次方個 鍵值對(40多億)。 注意:命令不區分大小寫 3)list(列表) Redis 列表是簡單的字串列表,按照插入順序排序。你可以新增一個元素導列表的頭部(左邊)或者尾部(右邊)。 127.0.0.1:6379> lpush mylist briup (integer) 1 127.0.0.1:6379> lpush mylist hello (integer) 2 127.0.0.1:6379> lpush mylist world (integer) 3 127.0.0.1:6379> lrange mylist 0 0 1) "world" 127.0.0.1:6379> lrange mylist 0 1 1) "world" 2) "hello" 127.0.0.1:6379> lrange mylist 0 2 1) "world" 2) "hello" 3) "briup" //刪除 127.0.0.1:6379> del mylist (integer) 1 列表最多可儲存 231次方個元素 (每個列表可儲存40多億) 4)set(集合) Redis的Setstring型別的無序集合。 集合是通過雜湊表實現的,所以新增,刪除,查詢的複雜度都是O(1)。 sadd 命令 新增一個string元素到,key對應的set集合中,成功返回1,如果元素已經存在則返回0,key對應的set不存在返回錯誤。 例如: 127.0.0.1:6379> sadd myset hello (integer) 1 127.0.0.1:6379> sadd myset world (integer) 1 127.0.0.1:6379> sadd myset briup (integer) 1 127.0.0.1:6379> sadd myset briup (integer) 0 127.0.0.1:6379> smembers myset 1) "hello" 2) "world" 3) "briup" //刪除 127.0.0.1:6379> del myset (integer) 1 集合中最大的成員數為231次方(每個集合可儲存40多億個成員)。 5)zset(有序集合) Redis中 zset 和 set 一樣也是string型別元素的集合,且不允許重複的成員。 不同的是每個元素都會關聯一個double型別的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。 zset的成員是唯一的,但分數(score)卻可以重複。 zadd 命令 新增元素到集合,元素在集合中存在則更新對應score 例如: 127.0.0.1:6379> zadd myzset 2 briup (integer) 1 127.0.0.1:6379> zadd myzset 0 hello (integer) 1 127.0.0.1:6379> zadd myzset 1 world (integer) 1 127.0.0.1:6379> zadd myzset 1 gogo (integer) 1 127.0.0.1:6379> zrangebyscore myzset 0 4 1) "hello" 2) "gogo" 3) "world" 4) "briup" //刪除 127.0.0.1:6379> del myzset (integer) 1 講到這裡了 8.Redis對key的操作命令 DEL 命令用於刪除已存在的鍵。不存在的 key 會被忽略。 EXISTS 命令用於檢查給定 key 是否存在。 Expire 命令用於設定 key 的過期時間。key 過期後將不再可用。 Expireat 命令用於以時間戳(unix timestamp)格式設定 key 的過期時間。key 過期後將不再可用。 PEXPIREAT 命令用於設定 key 的過期時間,單位是毫秒。key 過期後將不再可用 PERSIST 命令用於移除給定 key 的過期時間,使得 key 永不過期。 Keys 命令用於查詢所有符合給定模式 pattern 的 key,可以使用*萬用字元 MOVE 命令用於將當前資料庫的 key 移動到給定的資料庫 db 當中。 預設Redis中有16個數據庫,下標分別為0-15,預設使用的是0(select 0) 通過select可以切換資料庫 例如: select 3 Pttl 命令以毫秒為單位返回 key 的剩餘過期時間。 TTL 命令以秒為單位返回 key 的剩餘過期時間。 RANDOMKEY 命令從當前資料庫中隨機返回一個 key 。 Rename 命令用於修改 key 的名稱 。 rename msg my_msg Renamenx 命令用於在新的 key 不存在時修改 key 的名稱 。 renamenx username name 只要新的名字在redis中不存在的時候才會修改成功 Type 命令用於返回 key 所儲存的值的型別。 9)Redis對字串(String)的操作命令 SET 命令用於設定給定 key 的值。如果 key 已經儲存其他值, SET 就覆寫舊值,且無視型別。 Get 命令用於獲取指定 key 的值。如果 key 不存在,返回 nil 。如果key 儲存的值不是字串型別,返回一個錯誤。 Getrange 命令用於獲取儲存在指定 key 中字串的子字串。字串的擷取範圍由 start 和 end 兩個偏移量決定(包括 start 和 end 在內)。 Getset 命令用於設定指定 key 的值,並返回 key 舊的值。 Mset 命令用於同時設定一個或多個 key-value 對。 Mget 命令返回所有(一個或多個)給定 key 的值。 如果給定的 key 裡面,有某個 key 不存在,那麼這個 key 返回特殊值 nil 。 Setex 命令為指定的 key 設定值及其過期時間。如果 key 已經存在, SETEX 命令將會替換舊的值。 Psetex 命令以毫秒為單位設定 key 的生存時間。 Setnx(SET if Not eXists) 命令在指定的 key 不存在時,為 key 設定指定的值。 Msetnx 命令用於所有給定 key 都不存在時,同時設定一個或多個 key-value 對。 Setrange 命令用指定的字串覆蓋給定 key 所儲存的字串值,覆蓋的位置從偏移量 offset 開始。 Strlen 命令用於獲取指定 key 所儲存的字串值的長度。當 key 儲存的不是字串值時,返回一個錯誤。 Incr 命令將 key 中儲存的數字值增一。 如果 key 不存在,那麼 key 的值會先被初始化為 0 ,然後再執行 INCR 操作。 如果值包含錯誤的型別,或字串型別的值不能表示為數字,那麼返回一個錯誤。 本操作的值限制在 64 位(bit)有符號數字表示之內。 Incrby 命令將 key 中儲存的數字加上指定的增量值。 如果 key 不存在,那麼 key 的值會先被初始化為 0 ,然後再執行 INCRBY 命令。 如果值包含錯誤的型別,或字串型別的值不能表示為數字,那麼返回一個錯誤。 本操作的值限制在 64 位(bit)有符號數字表示之內。 Incrbyfloat 命令為 key 中所儲存的值加上指定的浮點數增量值。 如果 key 不存在,那麼 INCRBYFLOAT 會先將 key 的值設為 0 ,再執行加法操作。 Decr 命令將 key 中儲存的數字值減一。 如果 key 不存在,那麼 key 的值會先被初始化為 0 ,然後再執行 DECR 操作。 如果值包含錯誤的型別,或字串型別的值不能表示為數字,那麼返回一個錯誤。 本操作的值限制在 64 位(bit)有符號數字表示之內。 Decrby 命令將 key 所儲存的值減去指定的減量值。 如果 key 不存在,那麼 key 的值會先被初始化為 0 ,然後再執行 DECRBY 操作。 如果值包含錯誤的型別,或字串型別的值不能表示為數字,那麼返回一個錯誤。 本操作的值限制在 64 位(bit)有符號數字表示之內。 Append 命令用於為指定的 key 追加值。 如果 key 已經存在並且是一個字串, APPEND 命令將 value 追加到 key 原來的值的末尾。 如果 key 不存在, APPEND 就簡單地將給定 key 設為 value ,就像執行 SET key value 一樣。 11)Redis對雜湊(Hash)的操作命令 Hset 命令用於為雜湊表中的欄位賦值 。 如果雜湊表不存在,一個新的雜湊表被建立並進行 HSET 操作。 如果欄位已經存在於雜湊表中,舊值將被覆蓋。 Hsetnx 命令用於為雜湊表中不存在的的欄位賦值 。 如果雜湊表不存在,一個新的雜湊表被建立並進行 HSET 操作。 如果欄位已經存在於雜湊表中,操作無效。 如果 key 不存在,一個新雜湊表被建立並執行 HSETNX 命令。 Hmset 命令用於同時將多個 field-value (欄位-值)對設定到雜湊表中。 此命令會覆蓋雜湊表中已存在的欄位。 如果雜湊表不存在,會建立一個空雜湊表,並執行 HMSET 操作 Hget 命令用於返回雜湊表中指定欄位的值。 Hmget 命令用於返回雜湊表中,一個或多個給定欄位的值。 如果指定的欄位不存在於雜湊表,那麼返回一個 nil 值。 Hgetall 命令用於返回雜湊表中,所有的欄位和值。 Hexists 命令用於檢視雜湊表的指定欄位是否存在。 Hlen 命令用於獲取雜湊表中欄位的數量。 Hdel 命令用於刪除雜湊表 key 中的一個或多個指定欄位,不存在的欄位將被忽略。 Hkeys 命令用於獲取雜湊表中的所有欄位名。 Hvals 命令返回雜湊表所有欄位的值。 Hincrby 命令用於為雜湊表中的欄位值加上指定增量值。 增量也可以為負數,相當於對指定欄位進行減法操作。 如果雜湊表的 key 不存在,一個新的雜湊表被建立並執行 HINCRBY 命令。 如果指定的欄位不存在,那麼在執行命令前,欄位的值被初始化為 0 。 對一個儲存字串值的欄位執行 HINCRBY 命令將造成一個錯誤。 本操作的值被限制在 64 位(bit)有符號數字表示之內。 Hincrbyfloat 命令用於為雜湊表中的欄位值加上指定浮點數增量值。 如果指定的欄位不存在,那麼在執行命令前,欄位的值被初始化為 012)Redis對列表(List)的操作命令 Lpush 命令將一個或多個值插入到列表頭部。 如果 key 不存在,一個空列表會被建立並執行 LPUSH 操作。 當 key 存在但不是列表型別時,返回一個錯誤。 Lpushx 將一個或多個值插入到已存在的列表頭部,列表不存在時操作無效。 Lpop 命令用於移除並返回列表的第一個元素。 Llen 命令用於返回列表的長度。 如果列表 key 不存在,則 key 被解釋為一個空列表,返回 0 。 如果 key 不是列表型別,返回一個錯誤。 Lindex 命令用於通過索引獲取列表中的元素。你也可以使用負數下標,以 -1 表示列表的最後一個元素, -2 表示列表的倒數第二個元素,以此類推。 Lrange 返回列表中指定區間內的元素,區間以偏移量 START 和 END 指定。 其中 0 表示列表的第一個元素, 1 表示列表的第二個元素,以此類推。 你也可以使用負數下標,以 -1 表示列表的最後一個元素, -2 表示列表的倒數第二個元素,以此類推。 Linsert 命令用於在列表的元素前或者後插入元素。 當指定元素不存在於列表中時,不執行任何操作。 當列表不存在時,被視為空列表,不執行任何操作。 如果 key 不是列表型別,返回一個錯誤。 例如:LINSERT list before hello go 在名字為list的列表中,往元素hello之前插入資料go Lset 通過索引來設定元素的值。當索引引數超出範圍,或對一個空列表進行 LSET 時,返回一個錯誤。 Ltrim 對一個列表進行修剪(trim),就是說,讓列表只保留指定區間內的元素 ,不在指定區間之內的元素都將被刪除。下標 0 表示列表的第一個元素,以 1 表示列表的第二個元素,以此類推。 你也可以使用負數下標,以 -1 表示列表的最後一個元素, -2 表示列表的倒數第二個元素,以此類推。 Lrem 根據引數 COUNT 的值,移除列表中與引數 VALUE 相等的元素。 COUNT 的值可以是以下幾種: count > 0 : 從表頭開始向表尾搜尋,移除與 VALUE 相等的元素,數量為 COUNT 。 count < 0 : 從表尾開始向表頭搜尋,移除與 VALUE 相等的元素,數量為 COUNT 的絕對值。 count = 0 : 移除表中所有與 VALUE 相等的值。 Rpush 命令用於將一個或多個值插入到列表的尾部(最右邊)。 Rpushx 命令用於將一個或多個值插入到已存在的列表尾部(最右邊)。如果列表不存在,操作無效 Rpop 命令用於移除並返回列表的最後一個元素。 Rpoplpush 命令用於移除列表的最後一個元素,並將該元素新增到另一個列表並返回。 Blpop 命令移出並獲取列表的第一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。 Brpop 命令移出並獲取列表的最後一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。 Brpoplpush 命令從列表中彈出一個值,將彈出的元素插入到另外一個列表中並返回它; 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。 13)Redis對集合(Set)的操作命令 Sadd 命令將一個或多個成員元素加入到集合中,已經存在於集合的成員元素將被忽略。 假如集合 key 不存在,則建立一個只包含新增的元素作成員的集合。 當集合 key 不是集合型別時,返回一個錯誤。 Scard 命令返回集合中元素的數量。 Sdiff 命令返回給定集合之間的差集。不存在的集合 key 將視為空集。 Sdiffstore 命令將給定集合之間的差集儲存在指定的集合中。如果指定的集合 key 已存在,則會被覆蓋。 Sinter 命令返回給定所有給定集合的交集。 不存在的集合 key 被視為空集。 當給定集合當中有一個空集時,結果也為空集(根據集合運算定律)。 Sinterstore 命令將給定集合之間的交集儲存在指定的集合中。如果指定的集合已經存在,則將其覆蓋。 Sismember 命令判斷成員元素是否是集合的成員。 Smembers 命令返回集合中的所有的成員。 不存在的集合 key 被視為空集合。 Smove 命令將指定成員 member 元素從 source 集合移動到 destination 集合 SMOVE 是原子性操作。 如果 source 集合不存在或不包含指定的 member 元素,則 SMOVE 命令不執行任何操作,僅返回 0 。否則, member 元素從 source 集合中被移除,並新增到 destination 集合中去。 當 destination 集合已經包含 member 元素時, SMOVE 命令只是簡單地將 source 集合中的 member 元素刪除。 當 source 或 destination 不是集合型別時,返回一個錯誤。 Spop 命令用於移除並返回集合中的一個隨機元素。 Srandmember 命令用於返回集合中的一個隨機元素。 從 Redis 2.6 版本開始, Srandmember 命令接受可選的 count 引數: 如果 count 為正數,且小於集合基數,那麼命令返回一個包含 count 個元素的陣列,陣列中的元素各不相同。如果 count 大於等於集合基數,那麼返回整個集合。 如果 count 為負數,那麼命令返回一個數組,陣列中的元素可能會重複出現多次,而陣列的長度為 count 的絕對值。 該操作和 SPOP 相似,但 SPOP 將隨機元素從集合中移除並返回,而 Srandmember 則僅僅返回隨機元素,而不對集合進行任何改動。 Srem 命令用於移除集合中的一個或多個成員元素,不存在的成員元素會被忽略。 當 key 不是集合型別,返回一個錯誤。 在 Redis 2.4 版本以前, SREM 只接受單個成員值。 Sunion 命令返回給定集合的並集。不存在的集合 key 被視為空集。 Sunionstore 命令將給定集合的並集儲存在指定的集合 destination 中。 Sscan 命令用於迭代集合鍵中的元素。 14)Redis對有序集合(sorted set)的操作命令 Zadd 命令用於將一個或多個成員元素及其分數值加入到有序集當中。 如果某個成員已經是有序集的成員,那麼更新這個成員的分數值,並通過重新插入這個成員元素,來保證該成員在正確的位置上。 分數值可以是整數值或雙精度浮點數。 如果有序集合 key 不存在,則建立一個空的有序集並執行 ZADD 操作。 當 key 存在但不是有序集型別時,返回一個錯誤。 Zcard 命令用於計算集合中元素的數量。 Zcount 命令用於計算有序集合中指定分數區間的成員數量。 Zincrby 命令對有序集合中指定成員的分數加上增量 increment 可以通過傳遞一個負數值 increment ,讓分數減去相應的值,比如 ZINCRBY key -5 member ,就是讓 member 的 score 值減去 5 。 當 key 不存在,或分數不是 key 的成員時, ZINCRBY key increment member 等同於 ZADD key increment member 。 當 key 不是有序集型別時,返回一個錯誤。 分數值可以是整數值或雙精度浮點數。 Zinterstore 命令計算給定的一個或多個有序集的交集,其中給定 key 的數量必須以 numkeys 引數指定,並將該交集(結果集)儲存到 destination 。 預設情況下,結果集中某個成員的分數值是所有給定集下該成員分數值之和。 Zlexcount 命令在計算有序集合中指定字典區間內成員數量。 Zrange 返回有序集中,指定區間內的成員。 其中成員的位置按分數值遞增(從小到大)來排序。 具有相同分數值的成員按字典序(lexicographical order )來排列。 如果你需要成員按值遞減(從大到小)來排列,請使用 ZREVRANGE 命令。 下標引數 start 和 stop 都以 0 為底,也就是說,以 0 表示有序集第一個成員,以 1 表示有序集第二個成員,以此類推。 你也可以使用負數下標,以 -1 表示最後一個成員, -2 表示倒數第二個成員,以此類推 Zrangebylex 通過字典區間返回有序集合的成員。 Zrangebyscore 返回有序集合中指定分數區間的成員列表。有序整合員按分數值遞增(從小到大)次序排列。 具有相同分數值的成員按字典序來排列(該屬性是有序集提供的,不需要額外的計算)。 預設情況下,區間的取值使用閉區間 (小於等於或大於等於),你也可以通過給引數前增加 ( 符號來使用可選的開區間 (小於或大於)。 Zrank 返回有序集中指定成員的排名。其中有序整合員按分數值遞增(從小到大)順序排列。 Zrem 命令用於移除有序集中的一個或多個成員,不存在的成員將被忽略。 當 key 存在但不是有序集型別時,返回一個錯誤。 Zremrangebylex 命令用於移除有序集合中給定的字典區間的所有成員。 Zremrangebyrank 命令用於移除有序集中,指定排名(rank)區間內的所有成員 Zremrangebyscore 命令用於移除有序集中,指定分數(score)區間內的所有成員。 Zrevrange 命令返回有序集中,指定區間內的成員。 其中成員的位置按分數值遞減(從大到小)來排列。 具有相同分數值的成員按字典序的逆序(reverse lexicographical order)排列。 除了成員按分數值遞減的次序排列這一點外, ZREVRANGE 命令的其他方面和 ZRANGE 命令一樣。 Zrevrangebyscore 返回有序集中指定分數區間內的所有的成員。有序整合員按分數值遞減(從大到小)的次序排列。 具有相同分數值的成員按字典序的逆序(reverse lexicographical order )排列。 除了成員按分數值遞減的次序排列這一點外, ZREVRANGEBYSCORE 命令的其他方面和 ZRANGEBYSCORE 命令一樣。 Zrevrank 命令返回有序集中成員的排名。其中有序整合員按分數值遞減(從大到小)排序。 排名以 0 為底,也就是說, 分數值最大的成員排名為 0 。 使用 ZRANK 命令可以獲得成員按分數值遞增(從小到大)排列的排名。 Zscore 命令返回有序集中,成員的分數值。 如果成員元素不是有序集 key 的成員,或 key 不存在,返回 nil 。 Zunionstore 命令計算給定的一個或多個有序集的並集,其中給定 key 的數量必須以 numkeys 引數指定,並將該並集(結果集)儲存到 destination 。 預設情況下,結果集中某個成員的分數值是所有給定集下該成員分數值之和 。 Zscan 命令用於迭代有序集合中的元素(包括元素成員和元素分值) 15)Redis中的事務 multi命令 和 exec命令 例如: 127.0.0.1:6379> multi OK 127.0.0.1:6379> set name tom QUEUED 127.0.0.1:6379> set age 20 QUEUED 127.0.0.1:6379> set dob 2016-11-11 QUEUED 127.0.0.1:6379> exec 1) OK 2) OK 3) OK 例如: 127.0.0.1:6379> multi OK 127.0.0.1:6379> set name tom QUEUED 127.0.0.1:6379> set age 20 QUEUED 127.0.0.1:6379> seta dob 2016-11-11 (error) ERR unknown command 'seta' 127.0.0.1:6379> exec (error) EXECABORT Transaction discarded because of previous errors. 127.0.0.1:6379> get name (nil) 127.0.0.1:6379> get age (nil) 127.0.0.1:6379> get dob (nil) 例如: 127.0.0.1:6379> multi OK 127.0.0.1:6379> set name tom QUEUED 127.0.0.1:6379> set age 20 QUEUED 127.0.0.1:6379> hget name age QUEUED 127.0.0.1:6379> exec 1) OK 2) OK 3) (error) WRONGTYPE Operation against a key holding the wrong kind of value 127.0.0.1:6379> get name "tom" 127.0.0.1:6379> get age "20" Redis的事務中的錯誤分倆種: 語法錯誤 這種情況需要區分Redis的版本,Redis 2.6.5之前的版本會忽略錯誤的命令,執行其他正確的命令,2.6.5之後的版本會忽略這個事務中的所有命令,都不執行 執行錯誤 執行錯誤表示命令在執行過程中出現錯誤,比如用hget命令獲取string的值 這種錯誤在命令執行之前Redis是無法發現的,所以在事務裡這樣的命令會被Redis接受並執行。如果事務裡有一條命令執行錯誤,其他命令依舊會執行 Jedis是Redis官方首選的Java客戶端開發包 相關jar包 jedis-2.9.0jar commons-pool2-2.4.2.jar Jedis物件的使用 整個過程類似之前使用Connection物件一樣,一個Jedis物件就是一個數據庫連線物件,資料庫是Redis記憶體資料庫 1、建立JEdis物件 Jedis jedis = new Jedis(); 或者: Jedis jedis = new Jedis("127.0.0.1",6379); 或者: Jedis jedis = new Jedis(new URI("redis://:[email protected]:6379/0")); 注意:這裡最後一個0代表的時候index為0的資料庫,同時這種方式必須要求有密碼 2)使用Jedis物件 使用Jedis的API對redis進行操作,Jedis中的方法名和Redis中命令名基本上一模一樣,所以只要瞭解Redis中命令的作用,那麼Jedis中對應的方法的作用也是一樣的. 3)關閉Jedis物件 每個Jedis物件在內部都會建立一個Socket和Redis伺服器連線,所以Jedis物件使用完畢後可以進行關閉。 所以在使用junit進行基本的jedis操作測試的時候,可以編寫如下程式碼: 意思是,在單元測試方法執行之前,junit先呼叫使用了@Before註解的方法,然後再呼叫使用了@Test註解的方法,最後再呼叫使用了@After註解的方法 JedisPool連線池的使用 在不同執行緒中使用相同的Jedis例項會發生併發錯誤。但是建立太多的Jedis例項也不好,因為這意味著建立很多Socket連線,也會導致不必要的錯誤發生。單一的Jedis例項不是執行緒安全的,為了避免這些問題,可以使用JEdisPool,JedisPool是一個執行緒安全的網路連線池,可以使用JedisPool建立一個可靠的Jedis例項,可以從池中拿到Jedis的例項。 1)建立JedisPool JedisPool pool = new JedisPool(); 或者 JedisPool pool = new JedisPool("127.0.0.1",6379); 或者 JedisPoolConfig config = new JedisPoolConfig(); //設定最大連線數 config.setMaxTotal(80); //設定最大空閒數 config.setMaxIdle(20); //設定超時時間 config.setMaxWaitMillis(3000); JedisPool jedisPool = new JedisPool(config, "127.0.0.1", 6379); 2)使用JedisPool獲得Jedis物件 JedisPool pool = new JedisPool(); Jedis jedis = pool.getResource(); 3)從JedisPool獲得的Jedis物件再使用後呼叫close方法即可 通過檢視原始碼可知,close方法內部會把這個jedis物件進回收 public void close(){ if (this.dataSource != null) { if (this.client.isBroken()) this.dataSource.returnBrokenResource(this); else this.dataSource.returnResource(this); }else{ this.client.close(); } } 10、使用JEdis儲存java物件 Jedis繼承了BinaryJedis類 Jedis中的方法基本上都是String型別,BinaryJedis類中的方法引數基本上都是byte[]型別的,所以Jedis物件也可以呼叫哪些可以接受byte[]型別的方法,而且java中任何可以被序列化的物件都可以轉換為位元組陣列。 1、建立工具類 SerializingUtils 負責把物件和byte[]之間進行轉換 2)建立工具類JedisUtils 把Jedis對Redis的操作進行封裝,使其更加方便使用,例如可以直接存/取java物件,要求物件實現序列化介面,同時也可以使用之前的Jedis相關方法 11、Redis和Mybatis結合 注意 JEdis是用來操作Redis的 mybatis分為一級快取和二級快取 一級快取 又叫本地快取 是PerpetualCache型別的永久快取,儲存在執行器中BaseExecutor,而執行器又在SqlSession DefaultSqlSession中,所以一級快取的生命週期與SqlSession是相同的。 二級快取,又稱為自定義快取,實現了Cache 介面的類都可以作為二級快取,所以可配置如Encache等的第三方快取。二級快取以namespace名稱空間為其唯一標識,被儲存在Configuration核心配置物件中。 所以我們可以自定義快取類,實現mybatis提供的快取介面Cache,其中方法使用Jedis實現,將快取配置為Mybatis的二級快取提供者。 mybatis中配置的 <settings> <!-- 開啟二級快取 --> <setting name="cacheEnabled" value="true"/> </settings> 需要快取的mapper.xml中配置的 <cache type="com.briup.cache.MybatisRedisCache"></cache> Jedis相關配置檔案和工具類 src下面的config.properties 封裝Jedis的工具類 JedisUtils.java SerializingUtils.java 封裝MyBatis的工具類 MyBatisSqlSessionFactory.java