Java中使用Jedis操作Redis—Redis快速入門
這裡先說Java中使用Jedis操作Redis,稍後會整理Redis快速入門來詳細介紹Redis(跟著專案走會更容易理解)。
Java連線Redis:
在Java程式中使用Redis之前,我們需要先確保在機器上安裝了Redis服務及Java Redis驅動程式,並且你的機器上能夠正常使用Java環境。
1、Java的安裝配置參考-Java開發環境配置-(略)
2、安裝Redis服務
1)、下載Redis:
Redis 官網 :http://redis.io/
下載頁面:http://redis.io/download
官方文件:http://redis.io/documentation
Windows_64位 版本下載:https://github.com/ServiceStack/redis-windows/tree/master/downloads
2)、配置Redis:
下載完成後,在C盤【Program Files】目錄下新建資料夾【Redis】,右鍵解壓redis ZIP包,把所有檔案解壓到Redis資料夾中。
檔案介紹:
redis-benchmark.exe #基準測試
redis-check-aof.exe # aof
redischeck-dump.exe # dump
redis-cli.exe # 客戶端
redis-server.exe # 伺服器
redis.windows.conf # 配置檔案
3)、啟動Redis:
進入cmd作業系統視窗
使用【redis-server.exe redis.windows.conf
服務啟動成功狀態
啟動redis服務的doc視窗,不用關閉,因為服務需要一直執行,關閉服務,直接關閉視窗就行。
4)、測試Redis:
新開啟一個doc視窗,用自帶的客戶端工具進行測試命令【redis-cli.exe】,啟動redis客戶端,如下
3、下載Java redis驅動包(jedis.jar),確保下載最新驅動包,專案中引入jar包
1)、首先在專案下建立一個資料夾,儲存我們的jar包
在專案名上右擊,依次點選【new】-->【folder】,開啟新建資料夾視窗。
2)、輸入資料夾名稱【lib】,點選【ok】,我們通常在lib資料夾中存放從外部引入的jar包。
3)、找到我們要引入的jar包,拖進lib資料夾中或者複製,開啟選擇框,我們選擇預設的【copy fiels】,點選【OK】關閉。
4)、此時,專案中看到的jar包只是複製到專案下,還不能使用
再在專案名稱上右擊,依次選擇【Build Path】-->【Configure Build Path...】。
5)、在開啟的視窗中,先選擇【Libraries】頁,再從右邊的按鈕中點選【Add JARs...】
6)、在開啟的視窗中,我們依次展開本專案的lib資料夾,然後選擇我們剛才複製到專案中的jar包,然後點選【OK】關閉視窗。
7)、此時,我們在剛才開啟的【Libraries】頁可以看到我們引入的jar包的名稱,點選【OK】確認關閉視窗。
8)、現在,我們就可以在專案中使用這個jar包了。
Java連線到Redis伺服器:
參考以下示例程式碼:
package redis;
import redis.clients.jedis.Jedis;
public class RedisTest {
public static void main(String[] args) {
Jedis jedis = new Jedis("localhost");
System.out.println("Connection to server sucessfully");
System.out.println("Server is running:"+jedis.ping());
}
}
現在,編譯並執行上面的程式來測試與Redis伺服器的連線,可以根據需要更改路徑,假設jedis.jar的當前版本在當前路徑中可以使用。執行上面程式碼,將生成以下結果:
$javac RedisTest.java
$java RedisTest
Connection to server sucessfully
Server is running:PONG
各個功能函式示例
Redis Java字串示例
package redis;
import redis.clients.jedis.Jedis;
public class RedisStringTest {
public static void main(String[] args) {
//Connecting to Redis server on localhost
Jedis jedis = new Jedis("localhost");
System.out.println("Connection to server sucessfully");
//set the data in redis string
jedis.set("tutorial-name", "Redis tutorial");
//get the stored data and print it
System.out.println("Stored string in redis: "+jedis.get("tutorial-name"));
}
}
執行上面程式,將生成以下結果:
$javacRedisStringTest.java
$javaRedisStringTest
Connection to server sucessfully
Stored string in redis: Redis tutorial
Redis Java列表示例
package redis;
import java.util.List;
import redis.clients.jedis.Jedis;
public class RedisListTest {
public static void main(String[] args) {
//Connection to Redis server on localhost
Jedis jedis = new Jedis("localhost");
System.out.println("Connection to server sucessfully");
//store data in redis list
jedis.lpush("tutorial-list", "Redis");
jedis.lpush("tutorial-list", "Mongodb");
jedis.lpush("tutorial-list", "Mysql");
//get the stored data and print it
List<String> list = jedis.lrange("tutorial-list", 0, 5);
for(int i=0;i<list.size();i++){
System.out.println("List of storedin redis: "+list.get(i));
}
}
}
執行上面程式碼,將生成以下結果:
$javac RedisListTest.java
$java RedisListTest
Connection to server sucessfully
List of stored in redis: Mysql
List of stored in redis: Mongodb
List of stored in redis: Redis
Redis Java鍵示例
package redis;
import java.util.Iterator;
import java.util.Set;
import redis.clients.jedis.Jedis;
public class RedisKeyTest {
public static void main(String[] args) {
//Connection to Redis server on localhost
Jedis jedis = new Jedis("localhost");
System.out.println("Connection to server successfully");
//清空資料
System.out.println("清空庫中所有資料:"+jedis.flushDB());
//判斷key是否存在
System.out.println("判斷key999鍵是否存在:"+jedis.exists("key999"));
System.out.println("新增key001,value001鍵值對:"+jedis.set("key001", "value001"));
System.out.println("判斷key001是否存在:"+jedis.exists("key001"));
System.out.println("新增key002,value002鍵值對:"+jedis.set("key002", "value002"));
//輸出系統中所有的key
Set<String> keys = jedis.keys("*");
Iterator<String> it = keys.iterator();
while(it.hasNext()){
String key = it.next();
System.out.println("keys: "+key);
}
//刪除某個key,若key不存在,則忽略該命令。
System.out.println("系統中刪除key002: " +jedis.del("key002"));
System.out.println("判斷key002是否存在:"+jedis.exists("key002"));
}
}
執行上面程式,將生成下面結果:
Connection to server successfully
清空庫中所有資料:OK
判斷key999鍵是否存在:false
新增key001,value001鍵值對:OK
判斷key001是否存在:true
新增key002,value002鍵值對:OK
keys: key002
keys: key001
系統中刪除key002: 1
判斷key002是否存在:false
Redis快速入門
Redis是一個開源、高階的鍵值儲存和一個適用的解決方案,用於構建高效能,可擴充套件的Web應用程式。
Redis有三個主要特點,使它優越於其他鍵值資料儲存系統:
1、Redis將其資料庫完全儲存在記憶體中,僅使用磁碟進行持久化。
2、與其他鍵值資料儲存相比,Redis有一組相對豐富的資料型別。
3、Redis可以將資料複製到任意數量的從機中。
Redis優點:
1、異常快-Redis非常快,每秒可執行大約110000次的設定(set)操作,每秒大約可執行81000次的讀取/獲取(get)操作。
2、支援豐富的資料型別-Redis支援開發人員常用的大多數資料型別,例如列表、集合、排序集、雜湊等。這使得Redis很容易被用來解決各種問題,因為我們知道哪些問題可以更好地使用哪些資料型別來處理解決。
3、操作具有原子性-所有的Redis操作都是原子操作,這確保如果兩個客戶端併發訪問,Redis伺服器能接收更新的值。
4、多實用工具-Redis是一個多實用工具,可用於多種用例,如:快取,訊息佇列,應用程式中任何短期資料,例如web應用程式中的會話,網頁命中計數等。
Redis與其他鍵值儲存系統:
1、Redis是鍵值資料庫系統的不同進化路線,它的值可以包含更復雜的資料型別,可在這些資料型別上定義原子操作。
2、Redis是一個記憶體資料庫,但在磁碟資料庫上是持久的,因此它代表了一個不同的權衡,在這種情況下,在不能大於儲存器(記憶體)的資料集的限制下實現非常高的寫和讀速度。
3、記憶體資料庫的另一個優點,它與磁碟上的相同資料結構相比,複雜資料結構在記憶體中儲存表示更容易操作,因此,Redis可以做很少的內部複雜性。
Redis環境安裝與配置
Server端安裝
1、下載
Windows_64位 版本下載:https://github.com/ServiceStack/redis-windows/tree/master/downloads
2、安裝
1)、下載後,在C盤【Program Files】目錄下新建資料夾【Redis】,右鍵解壓redis ZIP包,把所有檔案解壓到Redis資料夾中。
幾個exe程式的功能:
redis-benchmark.exe:效能測試,用以模擬同時由N個客戶端傳送M個 SETs/GETs 查詢 (類似於 Apache 的ab 工具)
redis-check-aof.exe:更新日誌檢查
redis-check-dump.exe:本地資料庫檢查
redis-cli.exe:客戶端
redis-server.exe:服務端
2)、將路徑新增至系統環境變數
3)、cmd下啟動redis-server
注:由於此處未指定配置檔案,系統採用預設引數
3、下載對應的配置檔案
由上面cmd輸出可知當前版本,原頁面上開啟所有釋出版本,找到對應版本。
下載zip檔案,拷貝出redis.conf配置檔案至安裝目錄。
注:如果配置檔案的版本和當前exe程式的版本不匹配,很容易由於引數不一致導致server端無法啟動。
4、通過指定的配置檔案啟動服務
5、客戶端訪問測試
另啟動一個cmd視窗。
Redis配置
在Redis中,Redis的根目錄,有一個配置檔案(redis.conf)。當然我們可以通過Redis CONFIG命令獲取和設定所有的Redis配置。
語法:
以下是Redis中的CONFIG命令的基本語法
redis 127.0.0.1:6379> CONFIG GET CONFIG_SETTING_NAME
示例:
redis 127.0.0.1:6379> CONFIG GET loglevel
1) "loglevel"
2) "notice"
要獲取所有配置設定,請使用*代替CONFIG_SETTING_NAME
示例:
redis 127.0.0.1:6379> CONFIG GET *
1) "dbfilename"
2) "dump.rdb"
3) "requirepass"
4) ""
5) "masterauth"
......
編輯配置:
要更新配置,可以直接編輯redis.conf檔案,也可以通過CONFIG set命令更新配置。
語法:
以下是CONFIG SET命令的基本語法。
redis 127.0.0.1:6379> CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE
示例:
redis 127.0.0.1:6379> CONFIG SET loglevel "notice"
OK
redis 127.0.0.1:6379> CONFIG GET loglevel
1) "loglevel"
2) "notice"
Redis資料型別
Redis支援5中資料型別。
1、字串
Redis的字串是一個位元組序列。Redis的字串是二進位制安全的,這意味著它們的長度不由任何特殊的終止字元決定。因此,可以在一個字串中儲存高達512兆位元組的任何內容。
示例:
redis 127.0.0.1:6379> set name "zifuchuan.com"
OK
redis 127.0.0.1:6379> get name
"zifuchuan.com"
注:set和get是Redis命令,name是Redis中使用的鍵,zifuchuan.com是儲存在redis中的字串的值。Redis命令不區分大小寫,如set/SET/Set都是同一個命令。字串值的最大長度為512MB。
2、雜湊/雜湊
Redis雜湊/雜湊(Hashes)是鍵值對的集合。是字串欄位和字串值之間的對映。因此它們用於表示物件。
示例:
redis 127.0.0.1:6379> HMSET ukey username "gaosure" password "gaosure123" points 200
redis 127.0.0.1:6379> HMGET ukey username
1) "gaosure"
注:雜湊/雜湊資料型別用於儲存包含使用者的基本資訊的使用者物件。這裡的HMSET是Redis命令,ukey是鍵的名稱。
3、列表
Redis列表只是字串列表,按插入順序排序。可以向Redis列表的頭部或尾部新增元素。
示例:
redis 127.0.0.1:6379> lpush alist redis
(integer) 1
redis 127.0.0.1:6379> lpush alist mongodb
(integer) 2
redis 127.0.0.1:6379> lpush alist sqlite
(integer) 3
redis 127.0.0.1:6379> lrange alist 0 10
1) "sqlite"
2) "mongodb"
3) "redis"
注:列表的最大長度為2^32 - 1個元素(4294967295,每個列表可容納超過40億個元素)。
4、集合
Redis集合是字串的無序集合。在Redis中,您可以新增,刪除和測試成員存在的時間O(1)複雜性。
示例:
redis 127.0.0.1:6379> sadd yiibailist redis
(integer) 1
redis 127.0.0.1:6379> sadd yiibailist mongodb
(integer) 1
redis 127.0.0.1:6379> sadd yiibailist sqlite
(integer) 1
redis 127.0.0.1:6379> sadd yiibailist sqlite
(integer) 0
redis 127.0.0.1:6379> smembers yiibailist
1) "mongodb"
2) "redis"
3) "sqlite"
注:在上面的示例中,sqlite被添加了兩次,但是由於集合的唯一屬性,所以它只算新增一次。一個集合中的最大成員數量為2^32 - 1(即4294967295,每個集合中元素數量可達40億個)個。
5、可排序集合
Redis可排序集合類似於Redis集合,是不重複的字元集合。 不同之處在於,排序集合的每個成員都與分數相關聯,這個分數用於按最小分數到最大分數來排序的排序集合。雖然成員是唯一的,但分數值可以重複。
示例:
redis 127.0.0.1:6379> zadd yiibaiset 0 redis
(integer) 1
redis 127.0.0.1:6379> zadd yiibaiset 0 mongodb
(integer) 1
redis 127.0.0.1:6379> zadd yiibaiset 1 sqlite
(integer) 1
redis 127.0.0.1:6379> zadd yiibaiset 1 sqlite
(integer) 0
redis 127.0.0.1:6379> ZRANGEBYSCORE yiibaiset 0 1000
1) "mongodb"
2) "redis"
3) "sqlite"
注:因為 ‘sqlite‘ 的排序值是 1 ,其它兩個元素的排序值是 0 ,所以 ‘sqlite‘ 排在最後一個位置上。
Redis命令
Redis命令是用於Redis伺服器上執行一些操作。
要在Redis伺服器上執行命令,需要一個Redis客戶端。Redis客戶端在Redis包中有提供,這個包在前面安裝過程就有安裝。
Redis客戶端基本語法:redis-cli
要啟動Redis客戶端,請開啟終端並鍵入命令redis-cli。這樣講連線到本地的Redis伺服器,現在可以執行任何的Redis命令了。
連線到在本地機器上執行的Redis伺服器並執行PING命令,該命令檢查伺服器是否正在執行
在遠端伺服器上執行命令
要在遠端伺服器上執行命令,需要通過客戶端redis-cli連線到伺服器
語法:
redis-cli -h host -p port -a password
示例:
以下示例顯示如何連線到Redis遠端伺服器,在主機(host)127.0.0.1,埠(port)6379上執行,並使用密碼為 mypass。
redis-cli -h 127.0.0.1 -p 6379 -a "mypass"
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> PING
PONG
已在主機(host)上:
Redis鍵命令
Redis的鍵命令用於管理Redis中的鍵。以下是使用鍵命令的語法。
語法:
redis 127.0.0.1:6379> COMMAND KEY_NAME
示例:
redis 127.0.0.1:6379> SET akey redis
OK
redis 127.0.0.1:6379> DEL akey
(integer) 1
127.0.0.1:6379> GET akey
(nil)
注:在上面的例子中,DEL是Redis的刪除命令,而akey是鍵的名稱。如果鍵被刪除,則命令的輸出將為(integer) 1,否則為(integer) 0。
下表列出了與鍵相關的一些基本命令。
編號 | 命令 | 描述 |
1 | DEL key | 此命令刪除一個指定鍵(如果存在)。 |
2 | DUMP key |
此命令返回儲存在指定鍵的值的序列化版本。 |
3 | EXISTS key |
此命令檢查鍵是否存在。 |
4 | EXPIRE key seconds |
設定鍵在指定時間秒數之後到期/過期。 |
5 | EXPIREAT key timestamp |
設定在指定時間戳之後鍵到期/過期。這裡的時間是Unix時間戳格式。 |
6 | PEXPIRE key milliseconds |
設定鍵的到期時間(以毫秒為單位)。 |
7 | PEXPIREAT key milliseconds-timestamp |
以Unix時間戳形式來設定鍵的到期時間(以毫秒為單位)。 |
8 | KEYS pattern |
查詢與指定模式匹配的所有鍵。 |
9 | MOVE key db |
將鍵移動到另一個數據庫。 |
10 | PERSIST key |
刪除指定鍵的過期時間,得永生。 |
11 | PTTL key |
獲取鍵的剩餘到期時間。 |
12 | RANDOMKEY |
從Redis返回一個隨機的鍵。 |
13 | RENAME key newkey |
更改鍵的名稱。 |
14 | PTTL key |
獲取鍵到期的剩餘時間(以毫秒為單位)。 |
15 | RENAMENX key newkey | 如果新鍵不存在,重新命名鍵。 |
16 | TYPE key | 返回儲存在鍵中的值的資料型別。 |
Redis字串命令
Redis字串命令用於管理Redis中的字串值。以下是使用Redis字串命令的語法。
redis 127.0.0.1:6379> COMMAND KEY_NAME
示例:
redis 127.0.0.1:6379> SET mykey "redis"
OK
redis 127.0.0.1:6379> GET mykey
"redis"
在上面的例子中,SET和GET是redis中的命令,而mykey是鍵的名稱。
下表列出了一些用於在Redis中管理字串的基本命令。
編號 | 命令 | 描述說明 |
1 | SET key value |
此命令設定指定鍵的值。 |
2 | GET key |
獲取指定鍵的值。 |
3 | GETRANGE key start end |
獲取儲存在鍵上的字串的子字串。 |
4 | GETSET key value |
設定鍵的字串值並返回其舊值。 |
5 | GETBIT key offset |
返回在鍵處儲存的字串值中偏移處的位值。 |
6 | MGET key1 [key2..] |
獲取所有給定鍵的值。 |
7 | SETBIT key offset value |
儲存在鍵上的字串值中設定或清除偏移處的位。 |
8 | SETEX key seconds value |
使用鍵和到期時間來設定值。 |
9 | SETNX key value |
設定鍵的值,僅當鍵不存在時。 |
10 | SETRANGE key offset value |
在指定偏移處開始的鍵處覆蓋字串的一部分。 |
11 | STRLEN key |
獲取儲存在鍵中的值的長度。 |
12 | MSET key value [key value …] |
為多個鍵分別設定它們的值。 |
13 | MSETNX key value [key value …] |
為多個鍵分別設定它們的值,僅當鍵不存在時。 |
14 | PSETEX key milliseconds value |
設定鍵的值和到期時間(以毫秒為單位)。 |
15 | INCR key |
將鍵的整數值增加1。 |
16 | INCRBY key increment |
將鍵的整數值按給定的數值增加。 |
17 | INCRBYFLOAT key increment |
將鍵的浮點值按給定的數值增加。 |
18 | DECR key |
將鍵的整數值減1。 |
19 | DECRBY key decrement |
按給定數值減少鍵的整數值。 |
20 | APPEND key value |
將指定值附加到鍵。 |
Redis連線命令
下表列出了與Redis連線相關的一些基本命令。
序號 | 命令 | 說明 |