Redis學習小結--windows下安裝、基本資料型別、持久化及Jedis
Redis:REmote DIctionary Server 遠端字典伺服器
是一個開源免費,ANSI C編寫,遵守BSD協議,支援網路, Key-Value分散式記憶體DB,基於記憶體執行,支援持久化NoSql DB,資料結構伺服器,提供多種語言的API
一:在Window下安裝
s1:下載 Redis-x64-xxx.zip壓縮包,解壓到D盤後,將資料夾重新命名為 redis;
s2:cmd,切換到安裝目錄D盤下:cd /workTools/redis, 執行:redis-server.exe redis.windows.conf 開啟服務端
(別關閉該視窗)
s3:另開一個cmd, 切換到redis目錄下執行 redis-cli.exe -h 127.0.0.1 -p 6379 連線
測試能否使用:方法一:設定鍵值對 set myKey abc
取出鍵值對 get myKey
方法二: Ping命令 檢視服務是否執行 > ping //連線正常返回 PONG (#還可用不斷的ping來測量延遲值)
二:特點:
支援資料持久化,可以將記憶體中資料寫入磁碟
支援資料的備份,即master-slave模式的備份
工作模式:
redis:單程序、阻塞
mem多程序,非阻塞。
Redis在同一時刻只能處理一個請求,後來的請求需要排隊等待
優點:無需處理併發問題,降低系統複雜度
缺點:不適合快取大尺寸物件(超過100kb)
(說明:Memcache是記憶體物件快取系統,設計目標為通過緩解資料庫的壓力來加快web應用的響應速度
redis應用場景更豐富,Memcache僅適合作為快取使用
)
三:Redis支援的鍵值資料型別
字串(String)、字串列表(list)、雜湊(hash)、字串集合(set)、有序字串集合(zset,sorted set)
1.Key定義注意點:
不要過長(過長消耗記憶體、降低查詢效率)
不要過短 (可讀性)
統一的命名規範
Keys的通用操作
顯示所有的key: keys *
查詢以字串str開頭的key : keys str?
刪除多個key: del key1 key2 key3 ...
判斷key是否存在,存在返回1不存在返回0 : exists key
對key進行重新命名 : rename key newkey
設定過期的時間: expire key times(秒)
剩餘時間: ttl key
檢視型別 : type key
2.String
在redis中以二進位制方式操作
字串value最多可以容納資料長度為512M
賦值 set key value
取值 get key
修改 getset key1 value2
刪除 del key
增加 incr key (將指定key對應的value值增加1,若無該key,則初始化一個預設為0增加1,若value不為整型,則報錯)
減少 decr key (將指定key對應的value值減1,若無該key,則初始化一個預設為0減1)
增加n incrby key n
減少n decrby key n
新增字串,返回長度 append key str (key不存在則初始化有個,長度為str的長度)
3.Hash:
String Key和String Value的map容器;
一個Hash可以儲存 2^32 -1(=4294967295)個鍵值對
特別適合用於儲存物件
設定值:hset hashname key1 val1
設定多個值:hmset hashname key1 val1 key2 val2 = hset hashname key1 val1 key2 val2
獲取單個key值:hget hashname key1
獲取多個key值:hmget hashname key1 key2
獲取全部 hgetall hashname
刪除單個/多個key值:hdel hashname key1 key2
增加n hincrby hashname key1 n
判斷是否存在 hexists hashname key
包含key的多少 hlen hashname
獲取所有key hkeys hashname
獲取所有key hvals hashname
4.list
最多可儲存 2^32 - 1 元素
儲存list常用命令:
兩端新增 左側插入:lpush key value1 value2 value3 ...
右側插入:rpush key value1 value2 value3
檢視列表 lrange key start end (可從0或負數開始結束)
兩端彈出 左邊彈出 lpop key
右邊彈出 rpop key
獲取列表元素個數 llen key
key存在才插入左側 lpushx key value
key存在才插入右側 rpushx key value
刪除 lrem key (+_)startN spevalue (
lrem list 2 3 從頭到尾,刪除2個3
lrem list -2 1 從尾到頭,刪除2個1
lrem list 0 2 刪除所有2
)
設定某個下標對應value lset key n value
在第一個b之前插入11 linsert list before b 11
在第一個b之後插入22 linsert list after b 22
取出mylist1的右邊的一個元素放入mylist2的左邊第一個元素前 rpoplpush mylist1 mylist2
rpoplpush list1 list2 將 list1右邊的值丟擲,壓入到list2左邊
應用場景:訊息佇列中,lpush生產者,rpop消費者,
當消費者rpoo一條資料的時候,發發生了錯誤,那麼會導致取出的訊息丟失,那麼使用rpoplpush-先取出主佇列,並插入備份佇列,再去處理資料 就可以避免訊息丟失
5.set
String型別的無序集合
不允許出現重複的元素
運用場景:跟蹤一些唯一性資料、用於維護資料物件之間的關聯關係。
其具有的交集,並集,差集運算是非常高效的,基於這個特點我們可以維護資料物件之間的關聯關係,比如說從SQL型的資料庫中取出資料,然後直接使用redis進行快取,進行一些快速的運算。
新增: sadd key value1 value2 value3 ... (成功返回1,如果元素已經在集合中返回0,key對應的set不存在返回錯誤。)
刪除: srem key value1 value2 ....
檢視所有:smembers key
某value是否存在: sismember key value
差集(注意key的順序):sdiff key1 key2
交集:sinter key1 key2
並集(會去重):sunion key1 key2
數量: scard key
隨機一個元素 :srandmember key
將兩個集合的差集存入新集合:sdiffstore newKey key1 key2
將兩個集合的交集存入新集合: sinterstore newKey key1 key2
將兩個集合的並集存入新集合: sunionstore newKey key1 key2
6.Sorted-Set (Zset)
與Set的區別:sorted-set:每個成員都有一個double型別的分數與之關聯,成員唯一,分數可重複
Sorted-Set中的成員在集合中的位置是有序的
適合儲存帶分數成績之類的資料。
應用場景:如大型遊戲線上積分排行榜;構建索引資料
新增 zadd sortName scord1 value1 scord2 value2
查分數 (scord1): zscore sortname value
具體成員數:zcard sortname
刪除:zrem sortname value1 value2..
按範圍刪除 zremrangebyrank sortName 0 4
zremrangebyscore sortName 80 100
顯示所有元素(按分數升序):zrange sortname 0 -1
顯示所有元素及對應分數(按分數升序) zrange sortname 0 -1 withscores
顯示所有元素及對應分數(按分數降低序) zrevrange sortname 0 -1 withscores
顯示分數在0到100之間的2個元素及對應分數 zrangebyscore sortname 0 100 withscores limit 0 2
給某元素(value)加分數(socre) zincrby sortname score value
某個分數區間的元素個數 zcount sortname 80 90
四:多資料庫
select n:選擇資料庫,預設連線0號資料庫, 一個redis最多有16個例項,從0開始
move key n:把key移動到n號資料庫
支援事務
multi: 開啟事務
exec: 執行
discard: 回滾
redis在事務中所有命令都將被序列化順序執行,事務執行期間 redis不會再為其他的客戶端 提供任何的服務 從而保證事務中所有的命令被原子化執行 ,那麼和關係型資料庫中事務相比 ,redis 中如果某個命令執行失敗 ,它後面的命令還會被執行。
五:redis持久化(資料從記憶體同步到硬碟)
RDB方式 預設支援,不需要配置,指定時間間隔將記憶體資料集快照寫入磁碟
優勢:
1.資料庫只包含一個檔案,通過檔案備份策略,定期配置,恢復系統災難
2.壓縮檔案轉移到其他介質上
3.效能最大化,redis開始持久化時,分叉出程序,由子程序完成持久化的工作,避免伺服器程序執行I/O操作,啟動效率高
劣勢:
1.無法高可用:系統一定在定時持久化之前宕機,資料還沒寫入,資料已經丟失
2.通過fock分叉子程序完成工作,資料集大的時候,伺服器需要停止幾百毫秒甚至1秒
AOF方式 以日誌的形式記錄伺服器處理的每一個操作,在redis伺服器啟動之初會讀取該檔案,重新構建資料庫,保證啟動後資料庫中的資料是完整的
優勢:
1.同步:
a.每秒同步:非同步完成,效率高,一旦系統宕機,修改的資料丟失
b.每修改同步:每分鐘發生的變化記錄到磁碟中,效率低,安全
c.不同步
2.日誌寫入操作採用追加模式append
a.系統宕機,不影響已存在的內容
b.寫入一半資料,若系統崩潰,下次啟動redis,redis-check-aof工具解決資料一致性
3.如果日誌過大,自動重寫機制,修改的資料寫入到到磁碟檔案,建立新檔案,記錄產生的修改命令,重寫切換時,保證資料安全
4.格式清晰的日誌檔案,完成資料的重建
六:Jedis
是redis官方首選的Java客戶端開發包
commons-pool2-2.3.jar
jedis-2.7.0.jar
public class RedisJava {
public static void main(String[] args) {
//連線本地的Redis服務
Jedis jedis = new Jedis("127.0.0.1");
System.out.println("連線成功");
//檢視服務是否執行
System.out.println("服務正在執行:"+jedis.ping());
//設定redis字串資料
jedis.set("key_run", "run_ok");
//獲取儲存的資料並輸出
System.out.println("redis儲存的字串為:"+jedis.get("key_run"));
//儲存資料到列表中
jedis.lpush("list_key", "list_value1");
jedis.lpush("list_key", "list_value2");
jedis.lpush("list_key", "list_value3");
//獲取儲存的資料並輸出
List<String> list = jedis.lrange("list_key", 0, 2);
for(int i=0; i<list.size(); i++) {
System.out.println("列表項為:" + list.get(i));
}
//獲取資料並輸出
Set<String> keys = jedis.keys("*");
Iterator<String> it = keys.iterator();
while(it.hasNext()) {
String key = it.next();
System.out.println(key);
}
}
}