第三章:Redis命令
字串
Redis字串可以儲存三種類型的值:位元組串,整數,浮點數。
使用者可以通過給定一個任意的數值,對儲存著整數或者浮點數的字串執行自增或者自減操作,有需要的時候,Redis還會將整數轉換成浮點數。
Redis中的自增和自減命令
INCR: INCR key-name 將鍵儲存的值加上1
DECR: DECR key-name 將鍵儲存的值減去1
INCRBY : INCRBY key-name amount 將鍵儲存的值加上整數amount
DECRBY : DECRBY key-name amount 將鍵儲存的值減去整數amount
INCRBYFLOAT : INCRBYFLOAT key-name amount 將鍵儲存的值加上浮點數amount (這個在redis2.6或者以上的版本可用)
java程式碼示例如下:
public class Chapter03 { public static void main(String[] args) { String key = "string-key"; Jedis jedis = new Jedis("localhost"); System.out.println(jedis.get(key)); System.out.println(jedis.incr(key)); System.out.println(jedis.incrBy(key, 15)); System.out.println(jedis.decrBy(key, 5)); System.out.println(jedis.get(key)); System.out.println(jedis.set(key, "13")); System.out.println(jedis.incr(key)); } }
Redis處理子串和二進位制位的命令
APPEND: APPEND key-name value 將值value追加到給定鍵當前儲存的值的末尾
GETRANGE: GETRANGE key-name start end 獲取一個由偏移量start至偏移量end範圍內所有字元組成的子串,包括start和end在內
SETRANGE: AETRANGE key-name offset value 將從start偏移量開始的子串設定為給定值
GETBIT : GETBIT key-name offset 將位元組串看做是二進位制位串,並返回位串中偏移量為offset的二進位制位的值
SETBIT: SETBIT key-name offset value 將位元組串看作是二進位制位串,並將位串中偏移量為offset的二進位制位的值設定為value
BITCOUNT : BITCOUNT key-name [start end] 統計二進位制位串裡面值為1的二進位制位的數量,如果給定了可選的start偏移量和end偏移量,那麼只對偏移量指定範圍內的二進位制位進行統計
BITOP : BITOP opration dest-key key-name [key-name ...] 對一個或者多個二進位制位串執行包括並、或、異或、非在內的任意一種按位運算操作,並將計算得出的結果儲存在dest-key鍵裡面。
注意:
在使用setrange 或者 setbit命令對字串進行寫入時,如果字串當前的長度不能滿足寫入的要求,那麼Redis會自動使用空位元組null將字串擴充套件至所需的長度,然後執行寫入或者更新操作。
在使用getrange讀取字串的時候,超出字串末尾的二進位制會被視為空串,使用getbit讀取二進位制位串的時候,超出字串末尾的二進位制會被視為0
java示例:
String key = "new-string-key";
Jedis jedis = new Jedis("localhost");
System.out.println(jedis.append(key, "hello "));
System.out.println(jedis.append(key, "world!"));
System.out.println(jedis.substr(key, 3, 7));
System.out.println(jedis.setrange(key, 0, "H"));
System.out.println(jedis.setrange(key, 6, "W"));
System.out.println(jedis.get(key));
System.out.println(jedis.setrange(key, 11, ", how are you?"));
System.out.println(jedis.get(key));
System.out.println(jedis.setbit("another-key", 2, "1"));
System.out.println(jedis.setbit("another-key", 7, "1"));
System.out.println(jedis.get("another-key"));
列表
一些常用的列表命令:
RPUSH : RPUSH key-name value [value ...] 將一個或者多個值推入列表的右端
LPUSH : LPUSH key-name value [value ...] 將一個或者多個值推入列表的左端
RPOP : RPOP key-name 移除並返回列表最右端的元素
LPOP : LPOP key-name 移除並返回列表最左端的元素
LINDEX : LINDEX key-name start end 返回列表從start偏移量到end偏移量範圍內的所有元素,包括start和end元素在內
LTRIM : LTRIM key-name start end 對列表進行修剪,只保留start偏移量到end偏移量範圍內的元素,包括start和end元素在內。
java程式碼示例:
String key = "list-key";
Jedis jedis = new Jedis("localhost");
System.out.println(jedis.rpush(key, "last"));
System.out.println(jedis.lpush(key, "first"));
System.out.println(jedis.rpush(key, "new last"));
System.out.println(jedis.lrange(key, 0, -1));
System.out.println(jedis.lpop(key));
System.out.println(jedis.lpop(key));
System.out.println(jedis.lrange(key, 0, -1));
System.out.println(jedis.rpush(key, "a","b","c"));
System.out.println(jedis.lrange(key, 0, -1));
System.out.println(jedis.ltrim(key, 2, -1));
System.out.println(jedis.lrange(key, 0, -1));
阻塞式的列表彈出命令以及在列表之間移動元素的命令
BLPOP : BLPOP key-name [key-name ...] timeout 從第一個非空佇列中彈出位於最左端的元素或者在timeout秒之內阻塞並等待可彈出的元素出現
BRPOP : BRPOP key-name [key-name ...] timeout 從第一個非空佇列中彈出位於最右端的元素或者在timeout秒之內阻塞並等待可彈出的元素出現
RPOPLPUSH : RPOPLPUSH source-key dest-key 從source-key列表中彈出位於最右端的元素,然後將這個元素推入dest-key列表的最左端,並向用戶返回這個元素
BRPOPLPUSH: BRPOPLPUSH source-key dest-key timeout 從source-key列表中彈出位於最右端的元素,然後將這個元素推入dest-key列表的最左端,並向用戶返回這個元素,如果source-key為空,那麼在timeout秒之內阻塞並等待可以彈出的元素出現
對於阻塞彈出命令和彈出並推入命令,最常見的用例就是訊息傳遞和任務佇列。
java程式碼示例:
String key = "list";
Jedis jedis = new Jedis("localhost");
System.out.println(jedis.rpush(key, "item1"));
System.out.println(jedis.rpush(key, "item2"));
System.out.println(jedis.rpush("list2", "item3"));
System.out.println(jedis.brpoplpush("list2", key, 1));
System.out.println(jedis.brpoplpush("list2", key, 1));
System.out.println(jedis.lrange(key, 0, -1));
System.out.println(jedis.brpoplpush(key, "list2", 1));
System.out.println(jedis.blpop(1, key,"list2"));
System.out.println(jedis.blpop(1, key,"list2"));
System.out.println(jedis.blpop(1, key,"list2"));
System.out.println(jedis.blpop(1, key,"list2"));
集合
常用的集合命令
SADD : SADD key-name item [item ...] 將一個或多個元素新增到集合中,並返回被新增元素當中原本並不存在於集合裡面的元素數量
SREM : SREM key-name item [item ...] 從集合裡面移除一個或者多個元素,並返回被移除元素的數量
SISMEMBER : SISMEMBER key-name item 檢查元素item是否存在於集合key-name裡
SCARD : SCARD key-name 返回集合包含的元素的數量
SMEMBERS : SMEMBERS key-name 返回集合包含的所有元素
SRANDMEMBER:SRANDMEMBER key-name [count] 從集合中隨機返回一個或者多個元素,當count為正數時,命令返回的隨機元素不會重複,當count是負數時,命令返回的隨機元素可能出現重複
SPOP : SPOP key-name 隨機移除集合中的一個元素,並返回被移除的元素
SMOVE : SMOVE source-key dest-key item 如果集合source-key包含元素item,那麼從集合source-key裡面移除元素item,並將元素item新增到集合dest-key中,如果Item被移除成功,命令返回1.否則返回0..
java程式碼示例
String key = "set-key";
Jedis jedis = new Jedis("localhost");
System.out.println(jedis.sadd(key, "a","b","c"));
System.out.println(jedis.srem(key, "c","d"));
System.out.println(jedis.srem(key, "c","d"));
System.out.println(jedis.scard(key));
System.out.println(jedis.smembers(key));
System.out.println(jedis.smove(key, "set-key2","a"));
System.out.println(jedis.smove(key, "set-key2","c"));
System.out.println(jedis.smembers("set-key2"));
用於組合和處理多個集合的Redis命令
SDIFF : SDIFF key-name [key-name ...] 返回存在於第一個集合、但是不存在其他集合的元素
SIDFFSTORE: SDIFFSTORE dist-key key-name [key-name ...] 將那些存在於第一個集合但是並不存在於其他集合中的元素儲存到dest-key鍵裡面
SINTER : SINTER key-name [key-name ...] 返回那些同時存在於所有集合中的元素
SINTERSTORE : SINTERSTORE dest-key key-name [key-name ...] 將那些同時存在於所有集合的元素儲存到dest-key鍵裡面
SUNION : SUNION key-name [key-name ...] 返回那些至少存在於一個集合中的元素
SUNIONSTORE : SUNIONSTORE dest-key key-name [key-name ...] 將那些至少存在於一個集合中的元素儲存到dest-key鍵裡面
java程式碼示例:
String key1 = "skey1";
String key2 = "skey2";
Jedis jedis = new Jedis("localhost");
System.out.println(jedis.sadd(key1, "a","b","c","d"));
System.out.println(jedis.sadd(key2, "c","d","e","f"));
System.out.println(jedis.sdiff(key1,key2));
System.out.println(jedis.sinter(key1, key2));
System.out.println(jedis.sunion(key1, key2));
雜湊
雜湊常用的操作命令
HMGET : HMGET key-name key [key ... ]從雜湊中獲取一個或者多個鍵的值
HMSET : HMSET key-name key value [key value ...] 為雜湊裡面的一個或多個鍵設定值
HDEL : HDEL key-name key [key ...] 刪除雜湊裡面的一個或者多個鍵值對,返回成功找到並刪除的鍵值對數量
HLEN : HLEN key-name 返回雜湊包含的鍵值對數量
java程式碼示例:
String key = "hash-key";
Jedis jedis = new Jedis("localhost");
Map<String, String> map = new HashMap<String, String>();
map.put("k1", "v1");
map.put("k2", "v2");
map.put("k3", "v3");
System.out.println(jedis.hmset(key,map ));
System.out.println(jedis.hmget(key, "k2","k3"));
System.out.println(jedis.hlen(key));
System.out.println(jedis.hdel(key, "k1","k3"));
其他的雜湊命令
HEXISTS : HEXISTS key-name key 檢查給定鍵是否存在於雜湊中
HKEYS : HKEYS key-name 獲取雜湊包含的所有鍵
HVALS: HVALS key-name 獲取雜湊包含的所有值
HGETALL : HGETALL key-name 獲取雜湊包含的所有鍵值對
HINCRBY : HINCRBY key-name key increment 將鍵key儲存的值加上整數 increment
HINCRBYFLOAT: HINCRBYFLOAT key-name key increment 將鍵key儲存的值加上浮點數increment
java程式碼示例:
String key = "hash-key2";
Jedis jedis = new Jedis("localhost");
Map<String, String> map = new HashMap<String, String>();
map.put("short", "hello");
map.put("long", "1000");
System.out.println(jedis.hmset(key,map ));
System.out.println(jedis.hkeys(key));
System.out.println(jedis.hexists(key, "num"));
System.out.println(jedis.hincrBy(key, "num", 10));
System.out.println(jedis.hexists(key, "num"));
有序集合
常用的有序集合命令
ZADD : ZADD key-name score member [score member ...] 將帶有給定分值的成員新增到有序集合裡面
ZREM : ZREM key-name member[member ...] 從有序集合中移除給定的成員,並返回被移除成員的數量
ZCARD : ZCARD key-name 返回有序集合包含的成員數量
ZINCRBY : ZINCRBY key-name increment member 將member 成員的分值加上increment
ZCOUNT: ZCOUNT key-name min max 返回分值介於min 和max 之間的成員數量
ZRANK : ZRANK key-name member 返回成員member在有序集合中的排名
ZSCORE : ZSCORE key-name member 返回成員member的分值
ZRANGE : ZRANGE key-name start stop [withscores] 返回有序集合中排名介於start 和stop之間的成員,如果給定了可選的withsxores選項,那麼命令會將成員的分支也一併返回
java程式碼示例:
String key = "zset-key";
Jedis jedis = new Jedis("39.105.6.169");
Map<String, Double> map = new HashMap<String, Double>();
map.put("a", 3D);
map.put("b", 2D);
map.put("c", 1D);
System.out.println(jedis.zadd(key, map));
System.out.println(jedis.zcard(key));
System.out.println(jedis.zincrby(key, 3,"c"));
System.out.println(jedis.zscore(key, "b"));
System.out.println(jedis.zrank(key, "c"));
System.out.println(jedis.zcount(key, 0, 3));
System.out.println(jedis.zrem(key, "b"));
System.out.println(jedis.zrangeByScoreWithScores(key, 0, 4));
有序集合的範圍型資料獲取命令和範圍型資料刪除命令以及並集命令和交集命令
釋出和訂閱
釋出與訂閱的特點是訂閱者listener負責訂閱頻道channel,傳送者publisher負責向頻道傳送二進位制字串訊息,每當有訊息被髮送給頻道時,頻道的所有訂閱者都會收到訊息。
釋出和訂閱的命令
SUBSCRIBE channel [ channel ... ] 訂閱給定的一個或者多個頻道
UNSUBSCRIBE [channel ] [channel ....] 退訂給定的一個或者多個頻道,如果執行時沒有給定任何頻道,那麼退訂所有頻道。
PUBLISH channel message 向給定頻道傳送訊息
PSUBSCRIBE pattern [pattern ...] 訂閱與給定模式相匹配的所有頻道
PUNSUBSCRIBE [pattern [pattern ...] ] 退訂給定的模式,如果執行時沒有給定任務合適,那麼退訂所有模式
簡單的一個實現:
自定義一個訂閱者,監聽頻道的內容並列印:
public class MyJedisPubSub extends JedisPubSub{
@Override
public void onMessage(String s, String s1){
System.out.println("頻道:"+s+"傳送了訊息:"+s1);
}
}
定義一個釋出類,傳送訊息給頻道
public class MyPublisher {
public static void main(String[] args) {
Jedis jedis = new Jedis("localhost");
jedis.publish("channel", "你好啊");
}
}
測試類:
public class Chapter03 {
static final String CHANNEL_NAME = "channel";
public static void main(String[] args) {
Jedis jedis = new Jedis("localhost");
jedis.subscribe(new MyJedisPubSub(), CHANNEL_NAME);
}
}
基本的redis事務
Redis的事務要用到multi命令和exec命令,被multi命令和exec命令包圍的所有命令會一個接著一個的執行,直到所有的命令都執行完畢。當一個事務執行完畢,Redis才會處理其他客戶端的命令。
public class TranThread {
public static void main(String[] args) throws InterruptedException {
for(int i = 0; i<3 ; i++){
new Thread(new Runnable() {
@Override
public void run() {
Transaction transaction = JedisUtil.getJedis().multi();
transaction.incr("trans");
transaction.incrBy("trans", -1);
System.out.println(transaction.exec());;
}
}).start();
}
Thread.sleep(10000);
}
}
鍵的過期時間
用於處理過期時間的命令
persist key-name 移除鍵的過期時間
ttl key-name 檢視給定鍵距離過期還有多少秒
expire key-name seconds 讓給定鍵在指定的秒數後過期
pttl key-name 檢視給定鍵距離過期時間還有多少毫秒
expireat key-name timestamp 讓指定鍵的過期時間設定為給定的unix時間戳
pexpire key-name milliseconds 讓給定鍵在指定的毫秒數之後過期
pexpireat key-name timestamp-milliseconds 將一個毫秒級精度的UNIX時間戳設定給定鍵的過期時間
Jedis jedis =JedisUtil.getJedis();
jedis.set("key", "value");
System.out.println(jedis.get("key"));
jedis.expire("key", 2);
Thread.sleep(2000);
System.out.println(jedis.get("key"));
jedis.set("key", "value1");
jedis.expire("key", 100);
System.out.println(jedis.ttl("key"));