1.介紹Jedis
Jedis 是 Redis 的 java 版本客戶端,使用Jedis可以連接 Redis的數據庫,Jedis連接方式有三種Jedis/JedisPool 連接、ShardedJedis/ShardedJedisPool 連接、JedisCluster 連接,今天主要講解用 Java 代碼連接 Jedis 連接池
1.1連接Jedis/JedisPool
首先在Redis 中加入username 如圖
下面是連接Jedis的具體過程
public class JedisTest { //通過java程序訪問redis數據庫 @Test //獲得單一的jedis對象操作數據庫 public void test1() { //1.獲得連接對象 Jedis jedis = new Jedis("192.168.199.2", 6379); //2.獲取數據 String username = jedis.get("username"); System.out.println(username); //3.存儲 jedis.set("addr", "北京"); System.out.println(jedis.get("addr")); }
//結果zhr
北京
//通過jedis的pool獲得jedis連接對象 @Test public void test2() { //0.創建池子的配置對象 JedisPoolConfig poolconfig = new JedisPoolConfig(); poolconfig.setMaxIdle(30);//最大閑置個數 poolconfig.setMinIdle(10);//最小閑置個數 poolconfig.setMaxTotal(50);//最大連接數 //1.創建一個redis的連接池 JedisPool pool = new JedisPool(poolconfig,"192.168.199.2", 6379); //2.從池子中獲取redis的連接資源 Jedis jedis = pool.getResource(); //3.操作數據庫 jedis.set("haha","123"); System.out.println(jedis.get("haha")); //4.關閉資源 jedis.close(); pool.close(); } }
//123
1.2封裝JedisPool工具
新建一個 redis.properties
redis.maxIdle=30 redis.minIdle=10 redis.maxTotal=100 redis.url=192.168.199.2 redis.port=6379
創建一個 JedisPoolUtils 工具方便以后開發使用
package com.zhr.jedis; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; public class JedisPoolUtils { private static JedisPool pool; static { //加載配置文件 InputStream in = JedisPoolUtils.class.getClassLoader().getResourceAsStream("redis.properties"); Properties pro = new Properties(); try { pro.load(in); } catch (IOException e) { e.printStackTrace(); } //獲得池子對象 JedisPoolConfig poolconfig = new JedisPoolConfig(); poolconfig.setMaxIdle(Integer.parseInt(pro.get("redis.maxIdle").toString()));//最大閑置個數 poolconfig.setMinIdle(Integer.parseInt(pro.get("redis.minIdle").toString()));//最小閑置個數 poolconfig.setMaxTotal(Integer.parseInt(pro.get("redis.maxTotal").toString()));//最大連接數 pool = new JedisPool(poolconfig,pro.getProperty("redis.url"), Integer.parseInt(pro.get("redis.port").toString())); } //獲得jedis資源的方法 public static Jedis getJedis() { return pool.getResource(); } public static void main(String[] args) { Jedis jedis = getJedis(); System.out.println(jedis.get("haha")); } }
如果出現 JedisConnectionException 這個異常的小朋友問題在於沒有把防火牆打開
- 值得注意的問題是要使用Jedis需要開放端口 Centos7 開放的代碼是
firewall-cmd --zone=public --add-port=6379/tcp --permanent
- Centos7以下開放的代碼是
/sbin/iptables -I INPUT -p tcp --dport 6379 -j ACCEPT
/etc/rc.d/init.d/iptables save
2.Redis 數據結構及常用命令
Redis一共有五種數據類型如下
- 字符型(String)
- 哈希(hash)
- 字符串列表(list)
- 字符串集合(set)
- 有序字符串集合(sorted set)
Redis 還是一種高級的 key-valu e的存儲系統,所以對於key不要定義太長,不要超過1024字節,這樣消耗內存而且還降低查詢效率
2.1字符型String
字符型類型在 Redis 中采用二進制,這說明該類型存入和獲取的數據相同。在 Redis 中字符串類型的 Value 最多可以容納數據長度是512M
-
賦值: set key value
- 取值:get key/getset key value
- 刪除:del key
- 數值自增和自減: incr key/decr key
- 為key增加一個指定數值: incrby key increment
- 為key減少一個指定數值: decrby key decrement
- 拼湊字符串: append key value
具體操作如圖
這里我們需要注意的是getset key value這個命令和get key 這兩個命令的區別,前者是先獲取然后在重新設置返回的結果是獲取的結果也就是圖片出現的“lihai”實際已經賦值為5,incr、decr一個是自增、一個是自減、append key value 這個命令是在后面追加字符串返回的是字符串的結果,最后我們刪除del key因為已經沒有了再次get的時候就會nil為空
2.2哈希hash
Redis 中 Hash 類型可以看作是 map 的容器,所以該類型非常適合存儲對象的信息。
- 賦值: hset key field value 為指定的key設置field/value對
- 賦值: hmset key field value [field2 value2...] 設置key中多個filed/value
- 取值: hget key field
- 取值: hmget key fileds 獲取 key 中的多個filed 的值
- 取值: hgetall key 獲取 key 中所有的 filed-value
- 刪除: hdel key field[field...] 可以刪除一個或多個字段,返回值是被刪除的字段個數
- 刪除 del key 刪除整個list
- 增加數字: hincrby key field increment 設置key 中 filed 的值增加 increment
- 是否存在: hexists key field 判斷指定 key 中的 filed 是否存在
- field的數量: hlen key 獲取 key 所包含的 field 的數量
- 獲得所有的key :hkeys key
- 獲得所有的value :hvals key
具體操作如圖
這里需要注意的是增加數字increment 可以是正數和負數
2.3字符串列表list
在 Redis 中的 list 類型實際相當於雙向鏈表結構,可以在頭部(left)和尾部(right)添加新元素,在插入時,如果該鍵並不存在,Redis 會自動創建一個新的鏈表,如果鏈表中的元素全部被移除,那么該鍵也會被從數據庫中刪除,從元素插入和刪除的效率來看,在鏈表的兩頭插入和刪除元素,這樣的操作效率是非常高的。
- 頭部插入:lpush key values[value1 value2...] 在指定的key所在頭部插入所有的values,如果該 key 不存在,該命令在插入之前會創建一個與該 key 關聯的空鏈表。插入成功,返回元素的個數
- 尾部插入:rpush key values[value1 value2...]
- 獲得鏈表中從start 到 end元素的值:lrange key start end 若為-1則表示鏈表尾部元素,-2為倒數第二個
- 頭部彈出:lpop key 返回並彈出指定的key 關聯的鏈表中第一個元素,如果key 不存在 返回nil
- 尾部彈出:rpop key
- 獲得列表中元素格式:llen key
- lpushx key value:當參數中指定的 key 存在時,向關聯的list的頭部插入 value。如果不存在,將不進行插入
- rpushx key value:在該list的尾部添加
- lrem key cont value :刪除 coount 個值為 value 的元素,如果count大於0,從頭到尾遍歷並刪除,如果count 小於0,則從尾向頭遍歷並刪除。如果 count 等於0,則刪除鏈表中所有等於value 的元素
- lset key index value :設置鏈表中的index 的腳標的元素值,0代表鏈表的頭元素,-1代表鏈表的尾元素。角標不存在則拋異常
- linsert key before|after pivot value :在 pivot 元素前或者后插入 value 這個元素
- rpoplpush resource destination:將鏈表中的尾部元素彈出並添加到頭部(循環操作)
2.4字符串集合Set
在Redis 中,可以將 Set 類型看作為沒有排序的字符集合,Set 集合中不允許出現重復的元素
- sadd key values[value1 value2...]:向 set 中添加數據,如果該 key 的值已有則不會重復添加
- srem key members[member1 member2...]:刪除 set 中指定的成員
- smembers key:獲得 set 中所有的成員
- sismember key member:判斷參數中指定的成員是否在該 set 中,1表示存在,0表示不存在或key本身不存在
- sdiff key1 key2...:返回 key1 與 key2 中相差的成員,而且與key的順序有關。即返回差集。(A-B)
- sinter key1 key2 key3...:返回交集(A∩B)
- sunion key1 key2 key3...:返回並集(A∪B)
- scard key:獲取 set 中成員的數量
- srandmember key:隨機返回 set 中的一個成員
- sdiffsotre destination key1 key2...:將key1、key2相差的成員存儲在destination 上
- sintersotre destination key[key...]:將返回的交集存儲在 destination上
- sunionstore destination key[key...]:將返回的並集存儲在 destination 上
使用 Set 的時候要注意它的唯一性,比如用戶的ID 就是唯一的可以存放在Set 當中
2.5有序字符串集合Sorted Set
Sorted Set 和 Set極為相似,他們都是字符串集合,都不允許重復的成員出現在一個 Set中。它們之間主要的差別是 Sorted Set 中每一個成員都會有一個分數(score)與之關聯我們稱它為權重,Redis 也正是通過這個分數來進行從小到大的排序,要注意的是成員必須是唯一的,但分數是可以重復的。使用場景為游戲排名、微博熱點話題等
- zadd key score member score2 member2...:將所有成員以及該成員的分數存放到sorted set 中,如果該元素已經存在則會用新的分數替換原有的分數。返回值是新加入到集合中的元素個數,不包含之前已經存在的元素
- zscore key member:返回指定成員分數
- zcard key:獲取集合中的成員數量
- zrem key member[member...]:移除集合中指定的成員,可以指定多個成員
- zrange key start end [withscores]:獲得集合中腳標為start-end 的成員,[withscores]參數表明返回的成員包含其分數
- zrevrange key start stop [withscores]:照元素分數從大到小的順序返回索引從start 到 stop之間的所有元素(包括兩端的元素)
- zremrangebyrank key start stop:按照排名范圍刪除元素
- zremrangebyscore key min max:按照分數范圍刪除元素
- zrangebyscore key min max [withscores] [limit offset count]:返回分數在[min,max]的成員並按照分數從低到高排序。[withscores]:顯示分數:[limit offset count]:offset,表明從角標為offset的元素開始並返回count個成員
- zincrby key increment member:設置指定成員的增加分數。返回值是更改后的分數
- zcount key min max:獲取分數在[min,max]之間的成員
- zrank key menber:返回成員在集合中的排名(從小到大)
- zrevrank key member:返回成員在集合中的排名(從大到小)
有些不常用的到時候就來這里面查找就好了 請忽略手殘打錯字
3.keys通用操作
- keys pattern:獲取所有與pattern匹配的key,返回所有與該key匹配的。 *表示任意或一個或多個字符,?表示任意一個字符
- del key1 key2...:刪除指定的key
- exists key:判斷該key 是否存在,1代表存在,0代表不存在
- rename key newkey:為當前的key重命名
- expire key:設置過期時間,單位:秒
- ttl key:獲取該key 所剩的超時時間,如果沒有設置超時,返回-1.如果返回-2 表示超時不存在
- type key:獲取指定 key 的類型。該命令將以字符串的格式返回。返回字符串為 string、list、set、hash、zshet,如果 key 不存在返回none
4.Redis特性
一、Redis有多數據庫一共16個,下標從0到15,客戶端默認連接第0號數據庫,可以通過select選擇連接那個數據庫
- select num:切換數據庫
- move newkey 1:將當前庫的key移植到1號庫中
- ping :測試連接是否還存活 PONG為存活
- echo:在命令行打印一些內容
- quit:退出連接
- dbsize:返回當前數據庫中 key 的數目
- info:獲取服務器的信息和統計
- flushdb:刪除當前選擇數據庫中的所有 key
- flushall:刪除所有數據庫中的所有 key
二、消息訂閱與發布
- subscribe channel:訂閱頻道 eg:subscribe chat
- psubscribe channel*:批量訂閱頻道 eg:psubscribe z*,訂閱z開頭的頻道
- publish channel content:在指定頻道中發布消息,eg:publish chat 'haha'
三、事務
在事務執行期間,Redis 不會在為其它客戶端的請求提供任何服務,從而保證了事務中的所有命令被原子的執行,和關系型數據庫中的事務相比,在Redis 事務中如果有某一條命令執行失敗,其后的命令仍然會被繼續執行,在Redis中有三個事務的命令如下
- multi:開啟事務用於標記事務的開始,其后執行的命令都將被存入命令隊列,直到執行 exec 時,這些命令才會被原子的執行,類似與關系型數據庫中的:begin transaction
- exec:提交事務,類似與關系型數據庫中的:commit
- discard:事務回滾,類似與關系型數據庫中的:rollback