Redis
一:初識Redisredis
一、Redis 是什麼? 數據庫
一款開源的基於C語言的內存的鍵值對存儲數據庫,支持多種數據結構如:Set、hash、List、Zset、等,高性能的內存數據庫。編程
二、Redis 特性 速度快 (10W Ops、單線程)
持久化 (可異步保存到磁盤,斷電後不丟失數據)
多種數據結構
支持多種編程語言
功能豐富
簡單
主從複製
高可用、分佈式json
三、應用場景 緩存
緩存、計數器、消息隊列、排行榜、社交網絡、實時系統、會話存儲、服務器
四、安裝 官方地址:https://redis.io/download
$ wget http://download.redis.io/releases/redis-5.0.4.tar.gz
$ tar xzf redis-5.0.4.tar.gz
$ cd redis-5.0.4
$ make
運行服務端
$ src/redis-server
客戶端訪問
$ src/redis-cli
備註: 能夠創建一個軟鏈接以備後續升級: ln -s redis-5.0.4 redis網絡
五、啓動方式 簡單啓動 sh 、動態參數啓動、配置文件啓動
默認端口:6379
中止方式爲:shoutdown 這樣Redis能夠保存相關操做後再進行關閉。
指定修改後的conf啓動:/opt/software/redis-5.0.4/src/redis-server /opt/software/redis-5.0.4/redis.conf
配置文件修改:
關閉默認本地訪問:#bind 127.0.0.1
關閉守護進程:protected-mode no
設置訪問密碼:requirepass password
本機訪問 src/redis-cli 鏈接後輸入驗證:auth root數據結構
六、Redis經常使用配置 app
daemonize 是否守護進程(no/yes)修改爲yes 能夠進行日誌記錄
port 設置對外訪問端口默認:6379
logfile: 日誌名稱,記錄日誌
dir:Redis工做目錄異步
七、通用命令
keys * (獲取全部key)、
dbsize(獲取數據庫大小)、
exists key(判斷當前key是否存在)
del key[key] (刪除key)
expire key seconds(設置過時時間)
type key (判斷類型)
ttl key(查詢剩餘過時時間)
persist key (去除過時時間)
scan循環遍歷
flushall 清除全部key value
八、名詞:
往返延遲:①客戶端向服務器發送指令;②服務端接收指令,存儲到執行隊列;③服務器開始執行指令;④服務器返回執行結果;整個系列中的總耗時稱之爲往返延遲。
2、數據類型
一、String
key key1 value val{類型能夠是:字符、數字(整數、浮點數)、bits、json、xml}
單個最大512MB。儘可能控制在100kb
一、1:經常使用操做 i
ncr key :自增1; 若是key不存在增長後值爲 1;
decr key :自減1: 若是key 不存在自減後爲 -1;
incrby key k:key增長k;若是不存在增長後爲k;
decrby key k:key減去k:若是不存在自減後爲-k;
setnx key value :當key不存在時進行新增;成功返回1,失敗返回0
set key value xx :當key存在時進行從新賦值,相似更新操做
mset key1 value1 key2 value2 key3 value3 : 批量設置值
mget key1 key2 key3 : 批量取值
getset key:先返回原有值;在進行更新值
append :追加操做,若是鍵不存在會先增長後返回
strlen :獲取字符串長度(注意中文兩個字節)
incrbyfloat:增長對應key浮點數
getrange:獲取指定字符串下標的值
setrange:設置指定字符串下標的值,相似替換操做
[總結]
①:Redis內部編碼
int:用於長度小於64位有符號整數表示的字符串<數字類型的字符串>
embstr: 用於長度小於等於44字節的字符串;這種類型的編碼在內存使用和性能方面更有效率
raw:用於長度大於44字節的字符
②:字符串能夠存儲普通的字符、整數、浮點數;若是存入的value 能夠被轉換爲整數或浮點數,則可使用incr、decr、incrby、decrby;若是對字符進行增減,則會返回錯誤異常,若是值爲空則當作0處理。
③:getrange key start end 當範圍值strlen key超出當前長度,則直接返回字符末端。
④:setrange key index value 當在指定index上對應一個長度value則只修改指定index,若是value長度不爲1則覆蓋其指定位置後其它value,超出部分會直接替換進去。
二、hash 哈希
2.一、經常使用操做
hget key field : 獲取 鍵map中指定字段的屬性值
hset key field value: 設置 鍵map中指定字段的屬性值;當map中的field已存在時使用重複field可覆蓋value
hdel key field : 刪除 鍵map中指定字段的屬性值
hgetall key : 獲取key哈希表全部屬性包含:字段名、字段屬性值<注意不要濫用:redis是單線程>
hkeys key : 獲取key中全部字段名稱
hvals key : 獲取key中全部值
hexists key field : 判斷指定列表中某個字段是否存在
hlen:計算指定key哈希的長度;注意返回字段屬性長度
hmset key1 field1 value1 field2 value2 field3 value3:批量設置值
hmget key1 field1 field2 :批量取值
hsetnx key value :當key不存在時進行新增;成功返回1,失敗返回0
hset key value xx :當key存在時進行從新賦值,相似更新操做
hincrby 自增
hincrbyfloat 浮點數增長
三、list列表
三、1:經常使用操做
’rpush keylist value1 value2 value3 : 從當前列表的value右側開始插入數據 ===>>>value一、value二、value3
lpush keylist value1 value2 vlaue3 : 從當前列表的value左側開始插入數據 ===>>>value三、value二、value1
linsert keylist befor|after value newValue :在當前列表value值以前插入仍是以後插入數據
lpop keylist : 從左邊刪除一個元素
rpop keylist : 從右邊刪除一個元素
lrem keylist 0|1|-1 value: 刪除列表中值等與value的相同元素;0 全部;1從左到右;-1從右到左
ltrim keylist start end : 列表修剪,只保留當前keylist中start到end之間的元素,其中start與end會被保留
lrande keylist start end : 獲取列表從右到左指定範圍內的值,包含start與end對應座標值會返回
lindex keylist index : 獲取指定下標的值
llen keylist : 獲取列表長度
lset keylist index newValue: 更新指定下標值
備註:0~ -1 範圍內返回的是整個列表。
四、set無序集合
特色:集合不容許重複,集合內元素無序,支持集合間操做(交集、並集、差集)
集合排序分值相等會按照名稱進行排序;key不能夠重複,value 能夠重複(重複後會替換原有值)
四、1:經常使用操做 sadd key element(多個元素):增長元素
srem key element :刪除元素
scard key: 計算集合元素個數
sismember key: 判斷值是否存在
srandmember key: 從集合中隨機取出一個或多個元素;參數:[count] 當count爲正數隨機返回元素不會重複;當count爲負數時隨機返回元素可能會出現重複值
smembers key: 取出集合全部元素
spop key:從集合中隨機移除一個元素,並返回被移除的元素
smove key1 key2: 若是key1中存在element那麼從key1中移除element,並將element添加至key2中成功返回1;失敗返回0
四、2:集合間操做 sinter key1 [key2,key3...]: 求交集;返回同時存在第一個集合,而又存在於其它集合中的元素。
sinterstore desc_key1 key1[key2,key3...]: 求交集;將同時存在全部集合中的元素,存儲到desc_key1集合中。
sdiff :求差集
sdiffstore desc_key1 key1[key2,key3...]: 求差集;將只存key而不存在其它集合中的元素,存儲到desc_key1集合中。
sunion :求並集
sunionstore desc_key1 key1[key2,key3...]: 求並集;將至少存在一個元素中的值,存儲到desc_key1集合中。(不含重複值)
五、sorted set有序集合
特色:不容許重複,集合內元素有序。存在分值排序。形式 key score element;集合排序分值相等會按照名稱進行排序;
key不能夠重複,value 能夠重複(重複後會替換原有值)
五、1:經常使用操做
zadd key score element: 增長元素score 能夠重複
zrem key element :從指定集合中移除指定元素,並返回移除個數。
zscore key element:獲取指定集合中元素的分數
zincerby key increscore element:自增,自減分值
zcard key :返回集合元素個數
zrank key element: 獲取元素排名;排名規則是根據分支score 從小到大--->>>0-100排序規則。
zrange key start end :獲取指定範圍內排名的值:指定範圍內排序規則是升序。從低到高
zrangebyscore key minScore maxScore 獲取指定分數內的元素值,從低到高
zcount key minScore MAxScore 獲取指定分數內的元素個數
zremrangebyrank key start end :移除指定集合中排名介於start至end之間的全部成員 zremrangebyrankkey 0 -4<減去第四個>
zremrangebyscore key minScore maxScore : 移除指定集合中分數介於minScore至maxScore之間的全部成員
五、2:其它操做
zrevrank key element: 獲取指定集合key中指定元素element的排名;排名從高到低
zrevrange key start end :獲取指定範圍內排名的值:指定範圍內排序規則是升序。從高到低
zrevrangebyscore key minScore maxScore 獲取指定分數內的元素值,從高到低
zinsterstore desc_key1 key1[key2,key3] :對指定集合進行交集運算,key返回一個新的集合
zunionstore desc_key1 key1[key2,key3] :對指定集合進行並集運算,key返回一個新的集合
六、HyperLogLog 惟一計數
特色:當數據量達到千萬等級別的時使用HyoerLogLog所消耗的內存較小
六、1:經常使用操做 pfadd key value: 增長元素
pfcount key : 獲取key 去重複值統計
pfmerge newKey key1 key2 :合併兩個key 產生彙總集合。
六、2:其它操做
七、geo 地理位置
特色:存儲基於地理信息座標的集合
七、1:經常使用操做
e maxScore 獲取指定分數內的元素值,從高到低
zunionstore 有序集合合併
八、pipeline : 批量執行,能夠一次性執行一批get/set 命令;pipeline只適用於單節點
conn.pipelined(true|false); true 使用事務執行;false不開啓事務執行
示例:
public void updateTokenPipeline(Jedis conn, String token, String user, String item) {
long timestamp = System.currentTimeMillis() / 1000;
Pipeline pipe = conn.pipelined(false);
pipe.multi();
pipe.hset("login:", token, user);
pipe.zadd("recent:", timestamp, token);
if (item != null){
pipe.zadd("viewed:" + token, timestamp, item);
pipe.zremrangeByRank("viewed:" + token, 0, -26);
pipe.zincrby("viewed:", -1, item);
}
pipe.exec();
}
九、過時時間:
persist key:移除過時時間 ttl key //查看給定鍵距離過時還有多少秒 查詢結果 -1 沒有設置過時時間;-2 已通過期
expire "key" time:設置過時時間《單位:秒》
expireat key timestamp :將給定的鍵的過時時間設置爲unix時間戳
pttl key: 查看給定鍵過時時間還有多少毫秒
pexpire key milliseconds :讓給定鍵在指定的毫秒後過時
pexpireat key : 將一個毫秒級的unix時間戳設置爲給定的過時時間
當鍵的值被:set、getset、*store在內的命令,鍵的過時時間會被清除。
當被一個重名的key,會沖掉過時時間。
十、排序sort
sort key [BY pattern]
[LIMIT offset count] //限制排序返回數量 offset開始下標 count返回數量
[GET pattern [GET pattern ...]]
[ASC|DESC] //ASC 默認升序 | desc 降序
[ALPHA] //費字符排序
[STORE destination] //按照權重排序
十一、發佈與訂閱
subscribe channel [channel ...] 訂閱給定的一個或多個頻道
unsubscribe channel [channel ...] 退訂一個或多個頻道
publish channel message 向給定的一個頻道發送消息
psubscribe pattern [pattern ...] 訂閱與給定模式匹配的全部頻道
punsubscribe pattern [pattern ...] 退訂給定模式,若是執行時沒有給定任何模式,那麼退訂全部模式
十二、事務概念
redis的基本事務涉及到MULTI(開始)、EXEC(結束);還有WATCH、UNWATCH、DISCARD
執行流程:MULTI : 逐條操做;EXEC 結束;當redis接收到multi命令時會將以後的每一條操做都存放到隊列中去;直到接收到exec結束;
開始執行每條操做;遇到錯誤所有回滾
3、持久化
一、快照(Snapshotting)
能夠在某一時刻將全部數據所有寫入硬盤
二、只追加文件(AOF)
只有當執行寫入命令才進行磁盤寫入。
0、RDB 快照
RDB持久化方式;redis在本地生成一份RDB二進制文件,當須要恢復數據,或持久化到數據庫時,可以使用RDB文件進行。
1.一、生成RDB文件的三種方式:
save: 在執行數據返回前首先保存至本地RDB文件中,而後進行結果返回。(同步執行),數據量較大容易形成單線程阻塞。執行策略,當本地已經存在RDB文件時,生成一份新的文件,以後替換舊的RDB文件。
bgsave: 執行完Redis操做直接返回,異步進行更新本地RDB文件。(異步執行),生成一個fork()子進程執行保存。
自動:定時進行更新本地RDB文件。須要知足下列條件之一後執行:
配置 seconds changes
save 900s 1條
save 300s 10條
save 60s 1000條
修改配置: redis.conf dbfilename dump.rdb 修改默認文件名 dir ./ 修改默認存儲文件夾 stop-writes-on-bgsave-erroe yes --------------------------------------------------------------未完待續,20190706