Redis入門01
Redis入門
1.概述
1.1 NoSQL
Not-Only SQL( 泛指非關係型的資料庫),作為關係型資料庫的補充。
不依賴業務邏輯方式儲存,而以簡單的key-value模式儲存
- 對資料高併發的讀寫
- 海量資料的讀寫
- 高可擴充套件性
1.2 Redis
Redis--------開源的key-value儲存系統
- 支援儲存的value型別,包括string(字串)、list(連結串列)、set(集合)、zset(sorted set --有序集合)和hash(雜湊型別)
- 資料型別都支援push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的
- 在此基礎上,Redis支援各種不同方式的排序
- 為了保證效率,資料都是快取在記憶體中
- Redis會週期性的把更新的資料寫入磁碟或者把修改操作寫入追加的記錄檔案
- 並且在此基礎上實現了master-slave(主從)同步
應用場景
- 配合關係型資料庫做快取記憶體
- 高頻資料降低IO
- 分散式架構session共享
- 資料結構儲存持久化資料
1.3 安裝
預設安裝目錄 /usr/local/bin
- redis-benchmark:效能測試工具,可以在自己本子執行,看看自己本子效能如何
- redis-check-aof:修復有問題的AOF檔案,rdb和aof後面講
- redis-check-dump:修復有問題的dump.rdb檔案
- redis-sentinel:Redis叢集使用
- redis-server:Redis伺服器啟動命令
- redis-cli:客戶端,操作入口
啟動
- 前臺啟動 --- redis-server
- 後臺啟動 --- redis-server /home/redis.conf --- 根據配置檔案
用客戶端訪問:redis-cli
多個埠訪問:redis-cli -p埠號
單例項關閉:redis-cli shutdown
進入終端後再關閉:shutdown
多例項指定埠關閉:redis-cli -p 6379 shutdown
1.4 介紹
Redis是單執行緒+多路IO複用技術
多路複用:用一個執行緒來檢查多個檔案描述符(Socket)的就緒狀態
2.資料型別
2.1 Redis鍵key
- set 設定鍵 —值
- keys *檢視當前庫所有key
- exists key判斷某個key是否存在
- type key 檢視你的key是什麼型別
- del key 刪除指定的key資料
- unlink key 根據value選擇非阻塞刪除 僅將keys從keyspace元資料中刪除,真正的刪除會在後續非同步操作
- expire key 10 ( 秒鐘)為給定的key設定過期時間
- ttl key 檢視還有多少秒過期,-1表示永不過期,-2表示已過期
- select命令切換資料庫 0-15
- dbsize檢視當前資料庫的key的數量
- flushdb清空當前庫
- flushall刪除全部庫
2.2 字串
Redis最基本的型別
String型別是二進位制安全的 --- 可以包含任何資料。比如jpg圖片或者序列化的物件
value最多可以是512M
常用命令
- set
新增鍵值對 - key不存在時,可以將key-value新增資料庫
- key存在時,可以將key-value新增資料庫,與NX引數互斥
- key的超時秒數/毫秒數
- get
查詢對應鍵值 - append
將給定的 追加到原值的末尾 - strlen
獲得值的長度 - setnx
只有在 key 不存在時 設定 key 的值 - incr
儲存的數字值增1,只能對數字值操作,如果為空,新增值為1 - decr
數字值減1,同上;如果為空,新增值為-1 - incrby / decrby
<步長> 儲存的數字值增減自定義步長 - mset
... 同時設定一個或多個 key-value對 - mget
... 同時獲取一個或多個 value - msetnx
... - 當且僅當所有給定 key 都不存在
- 原子性,有一個失敗則都失敗
- getrange
<起始位置><結束位置> 獲得值的範圍 - setrange
<起始位置> 用 覆寫 所儲存的字串值 - setex
<過期時間> 設定鍵值的同時,設定過期時間,單位秒 - getset
<new_value> 設定了新值同時獲得舊值
底層
簡單動態字串
預分配冗餘空間的方式來減少記憶體的頻繁分配
2.3 列表
簡單的字串列表,按照插入順序排序 --- 操作頭部或尾部
底層實際是個雙向連結串列,對兩端的操作效能很高
常用命令 ---此時key為設定的列表名
- lpush/rpush
.... 從左邊/右邊插入一個或多個值 - lpop/rpop
從左邊/右邊吐出一個值 ----key也會刪除 - rpoplpush
從 列表右邊吐出一個值,插到 列表左邊 - lrange
按照索引下標獲得元素 (0左邊第一個,-1右邊第一個) - lindex
按照索引下標獲得元素(從左到右) - llen
獲得列表長度 - linsert
before 在 的後面插入 插入值 - lrem
從左邊刪除n個value(從左到右) - lset
將列表key下標為index的值替換成value
底層
- 資料量比較多 ---- 快速連結串列quickList
- 列表元素較少的情況使用一塊連續的記憶體儲存 ---- ziplist壓縮列表
- 普通的連結串列需要的附加指標空間太大,會比較浪費空間
- Redis將連結串列和ziplist結合起來組成了quicklist --- 快速的插入刪除
2.4 集合Set
set是可以自動排重
string型別的無序集合
底層其實是一個value為null的hash表 --- 新增,刪除,查詢的複雜度都是O(1)
常用命令
- sadd
加入到集合 key 中 重複的元素將被忽略 - smembers
取出該集合的所有值 - sismember
判斷集合 是否為含有該 值,有1,沒有0 - scard
返回該集合的元素個數 - srem
.... 刪除集合中某些元素 - spop
隨機從該集合中吐出一個值 - srandmember
隨機從該集合中取出n個值----不會從集合中刪除 - smove
- sinter
返回兩個集合的交集元素 - sunion
返回兩個集合的並集元素 - sdiff
返回兩個集合的差集元素(key1中的,不包含key2中的)
底層
Set資料結構是dict字典,字典是用雜湊表實現
所有的value都指向同一個內部值
2.5 雜湊Hash
string型別的field和value的對映表 ---- 特別適合用於儲存物件 ---- Map<String,Object>
例如 使用 ID 為key,對映一個Hash,Hash中儲存屬性field和value
既不需要重複儲存資料,也不會帶來序列化和併發修改控制的問題
常用命令
- hset
給 集合中的 鍵賦值 - hget
從 集合 取出 value - hmset
... 批量設定hash的值 - hexists
檢視雜湊表 key 中,給定域 field 是否存在 - hkeys
列出該hash集合的所有field - hvals
列出該hash集合的所有value - hincrby
為雜湊表 key 中的域 field 的值加上增量 1 -1 - hsetnx
設定雜湊表 key 中的field為 value ,當且僅當域 field 不存在時
底層
ziplist(壓縮列表),hashtable(雜湊表)
當field-value長度較短且個數較少時,使用ziplist,否則使用hashtable
2.6 有序集合Zset
沒有重複元素的字串集合
有序集合的每個成員都關聯了一個評分(score)---評分可以是重複
按照從最低分到最高分的方式排序
常用命令
- zadd
… 加入到有序集 key 當中 - zrange
[WITHSCORES] - 返回有序集 key 中,下標在
之間的元素 - WITHSCORES,同時返回分數到結果集
- 返回有序集 key 中,下標在
- zrangebyscore key min max [WITHSCORES] [limit offset count]
- 所有 score 值介於 min 和 max 之間(包括等於)
- 按 score 值遞增 --- 從小到大
- zrevrangebyscore key min max [WITHSCORES] [limit offset count]
- 從大到小排列
- zincrby
元素的score加上增量 - zrem
刪除該集合下,指定值的元素 - zcount
統計該集合,分數區間內的元素個數 - zrank
返回該值在集合中的排名,從0開始
底層
hash+跳錶
- hash的作用就是關聯元素value和權重score
- 跳躍表的目的在於給元素value排序
跳錶
跳躍表效率堪比紅黑樹,實現遠比紅黑樹簡單
第0層為全表內容,其上層為間隔一定數量的元素連線而成,並能連線到下一層的相同元素;
同理往上可有多層;
查詢時先從頂層確定一個大範圍,再降到下一層繼續尋找更細分的分段;
依次細分,直至到底層定位到具體位置 ---- 類似二分
3.配置檔案
3.1 Units 單位
配置大小單位
開頭定義了一些基本的度量單位,只支援bytes
大小寫不敏感
3.2 INCLUDES 包含
公用的配置檔案提取出來
3.3 網路配置
bind
- 預設情況bind=127.0.0.1只能接受本機的訪問請求
- 不寫的情況下,無限制接受任何ip地址的訪問
protect-mode
- 本機訪問保護模式設定
- 開啟後,沒有設定密碼時只能本地訪問
port
- 埠號 預設 6379
tcp-backlog
- 設定tcp的backlog -----是一個連線佇列
- backlog佇列總和=未完成三次握手佇列 + 已經完成三次握手佇列
- 高併發環境下高backlog值來避免慢客戶端連線問題
timeout
- 一個空閒的客戶端維持多少秒會關閉,0表示關閉該功能。即永不關閉
tcp-keepalive
- 對訪問客戶端的一種心跳檢測,每個n秒檢測一次
- 單位為秒,如果設定為0,則不會進行Keepalive檢測,建議設定成60
3.4 GENERAL
daemonize
- 是否為後臺程序,設定為yes -----守護程序,後臺啟動
pidfile
- 存放pid檔案的位置 ----- 每個例項會產生一個不同的pid檔案
loglevel
- 日誌記錄級別:debug、verbose、notice、warning,預設為notice
- 生產環境選擇notice 或者warning
logfile
- 日誌檔名稱
databases 16
- 設定庫的數量 預設16
- 預設資料庫為0號 ------- SELECT
命令
3.5 SECURITY
設定密碼----requirepass
- 訪問密碼的檢視、設定和取消
- 在命令中設定密碼------臨時---------重啟redis伺服器,密碼還原
- 配置檔案中進行設定 -------永久設定
3.6 LIMITS
maxclients
- 設定redis同時可以與多少個客戶端進行連線
- 預設情況下為10000個客戶端 ----超過時拒絕新的連線請求------返回 max number of clients reached
maxmemory
- 必須設定------設定redis可以使用的記憶體量
- 到達記憶體使用上限,redis將會試圖移除內部資料,移除規則可以通過maxmemory-policy來指定
- 無法移除或設定了“不允許移除”---------返回錯誤資訊-------無記憶體申請的指令,仍然會正常響應
maxmemory-policy
- volatile-lru:使用LRU演算法移除key,只對設定了過期時間的鍵;(最近最少使用)
- allkeys-lru:在所有集合key中,使用LRU演算法移除key
- volatile-random:在過期集合中移除隨機的key,只對設定了過期時間的鍵
- allkeys-random:在所有集合key中,移除隨機的key
- volatile-ttl:移除那些TTL值最小的key,即那些最近要過期的key
- noeviction:不進行移除。針對寫操作,只是返回錯誤資訊
maxmemory-samples
- 設定樣本數量 --- redis預設會檢查這麼多個key並根據 LRU 選擇
- 一般設定3到7的數字,數值越小樣本越不準確,但效能消耗越小
4.Redis釋出和訂閱
Redis 釋出訂閱 (pub/sub) 是一種訊息通訊模式:傳送者 (pub) 傳送訊息,訂閱者 (sub) 接收訊息。
Redis 客戶端可以訂閱任意數量的頻道。
- SUBSCRIBE channel1
- publish channel1 hello
釋出的訊息沒有持久化
5.Redis新資料型別
5.1 Bitmaps
實現對位的操作
實際上它就是字串---------可以對字串的位進行操作
每個單元只能儲存0和1-----------偏移量
單獨提供了一套命令
- setbit
- getbit
獲取Bitmaps中某個偏移量的值 - bitcount
[start end] 統計字串從start位元組到end位元組位元值為1的數量 - bitop and(or/not/xor)
[key…] 取and交集/or並集/ not非 /xor異或 儲存在destkey
5.2 HyberLogLog
Redis HyperLogLog用來做基數統計----------求集合中不重複元素個數
計算基數所需的空間總是固定的、並且是很小的。
每個 HyperLogLog 鍵只需要花費 12 KB 記憶體,可以計算接近 2^64 個不同元素的基數。
- pfadd
< element> [element ...] 新增指定元素 ---- 近似基數發生變化,則返回1,否則返回0 - pfcount
[key ...] 計算近似基數 - pfmerge
[sourcekey ...] HLL合併後的結果儲存在另一個HLL中
5.3 Geospatial
GEO,Geographic,地理資訊的縮寫
元素的2維座標,在地圖上就是經緯度
- geoadd
< longitude> [longitude latitude member...] 新增地理位置 - geopos
[member...] 獲得指定地區的座標值 - geodist
[m|km|ft|mi ] 獲取兩個位置之間的直線距離---指定單位 - georadius
< longitude> radius m|km|ft|mi 以給定的經緯度為中心,找出某一半徑內的元素
6.Jedis
引入
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.2.0</version>
</dependency>
//IP + 埠號
Jedis jedis = new Jedis("192.168.102.128", 6379);
//測試
String test = jedis.ping();
System.out.println(test);
//操作
Set<String> keys = jedis.keys("*");
keys.forEach(System.out::println);
jedis.set("name", "123");
jedis.get("name");
jedis.close();//關閉連線