建設(shè)銀行網(wǎng)站預(yù)約取款長春網(wǎng)站建設(shè)方案咨詢
什么是redis?主要作用?
redis(remote dictionary server)遠程字典服務(wù):是一個開源的使用ANSI C語言編寫,支持網(wǎng)絡(luò)、可基于內(nèi)存可持久化的日志型、key-value數(shù)據(jù)庫,并提供多種語言的api
redis的數(shù)據(jù)存在內(nèi)存中,讀寫速度非常快,每秒可以超過10萬次讀寫操作。因此廣泛用于緩存,另外,redis也經(jīng)常用來做分布式鎖。
redis的基本數(shù)據(jù)類型
type key
:獲取key的類型
-
string
- 是redis最基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)類型,可以存儲圖片或者序列化的對象,值最大存儲為512M
- 應(yīng)用場景:共享session、計數(shù)器、限流等
- 內(nèi)部編碼:int/embstr(<=39字節(jié)字符串)/raw(>39字節(jié)字符串)
-
格式 功能 set key value 將key-value緩存到Redis中 get key 從redis中獲取key對應(yīng)的value del key 從Redis中刪除key incr key 將key對應(yīng)的value加1 decr key 將key對應(yīng)的value減1 setex key seconds value 將key-value緩存到Redis中并設(shè)置過期時間 setnx key value 將key-value緩存到redis中,若key存在,不做任何操作 ttl key 查看key的存活命時間 incrby key increment 給key對應(yīng)值加increment mset k1 v1 k2 v2… 批量添加key-value對到redis中 mget k1 k2 批量根據(jù)key獲取value append key value 在key對應(yīng)的value中拼接value setrange key offset value 從offset位置開始將key對應(yīng)的value,替換為指定value
-
hash
- hash類型是指v(值)本身又是一個鍵值對結(jié)構(gòu)
- 內(nèi)部編碼:ziplist、hashtable
- 應(yīng)用場景:緩存用戶信息等
- 注意:若開發(fā)使用hgetall,哈希元素比較多的話,可能導(dǎo)致redis阻塞,可以使用hscan.而如果只是獲取部分field,建議使用hmget
-
命令 功能 hset key field value 將field value緩存到redis的hash中,鍵值為key hget key field 從key對應(yīng)hash中獲取filed字段 hexists key field 判斷key對應(yīng)hash中是否存在field字段 hincrby key field increment 給key對應(yīng)hash中的field字段+increment hdel key field 刪除key對應(yīng)hash中的field字段 hkeys key 獲取key對應(yīng)hash中的所有field hvals key 獲取key對應(yīng)hash中的所有filed的val hgetall key 獲取key對應(yīng)hash中所有的filed和value
-
list
- 用來存儲多個有序的字符串,一個列表最多可以存儲2^32-1個元素
- 內(nèi)部編碼:ziplist、linkedlist
- 應(yīng)用場景:消息隊列,收藏文章列表
- lpush+lpop=stack
- lpush+rpop=queue
- lpsh+ltrim=capped collection(有序集合)
- lpush+brpop=message queue(消息隊列)
-
命令 功能 rpush key value 從右邊向key集合中添加value lrange key start end 從左邊開始獲取key集合,從start開始到end結(jié)束 lpush key value 從左邊向key集合添加value lpop key 彈出key集合最左邊的數(shù)據(jù) rpop key 彈出key集合最右邊的數(shù)據(jù) llen key 獲取key集合的長度 linsert key BEFORE|AFTER pivot element 操作key集合,在privot之前/后添加element lset key index value 操作key集合,更新索引index位置的值為value lrem key count value 操作key集合,刪除count個value值 ltrim key start end 操作key集合,截取start到end的列表值 lindex key index 操作key集合,獲取index位置的值 brpop key seconds 延遲seconds彈出
-
set
- 用來保存多個的字符串元素,但是不允許重復(fù)元素
- 內(nèi)部編碼:intset、hashtable
- 注意點:smembers和lrange、hgetall都屬于比較重的命令,若元素過多存在阻塞redis的可能性,可以使用sscan完成
- 應(yīng)用場景:社交需求、生成隨機數(shù)抽獎
-
命令 格式 sadd key members 向key集合中添加member元素 smembers key 遍歷key集合中所有元素 srem key members 刪除key集合中member元素 spop key count 從key集合中隨機彈出count個元素 sdiff key1 key2 返回key1中特有的元素(差集) sidiffstore dest key1 key2 將差集緩存到dest中 sinter key1 key2 返回key之間的交集 sinterstore dest key1 key2 將交集緩存到dest中 sunion key1 key2 返回并集 sunionstore dest key1 key2 將并集緩存到dest中 smove source dest member 將source集合中member元素移動到dest集合 sismember key member 判斷member是否存在于key集合中 srandmember key count 隨機獲取key集合中count個元素
-
zset
- 已排序的字符串集合,同時元素不能重復(fù)
- 內(nèi)部編碼:ziplist、skiplist
- 應(yīng)用場景:排行榜、點贊
-
命令 格式 zadd key score member 向key集合中添加member元素,分數(shù)為score zincrby key increment member 向key集合中member元素score+increment zrange key start end [withscores] 將key集合中元素升序排序,顯示分數(shù) zrevrange key start end [withscores] 將key集合中元素倒序排序,顯示分數(shù) zrank key member 返回member在key集合中的正序排名 zrevrank key member 返回member在key集合中的倒序排名 zcard key 返回key集合元素的個數(shù) zrangebysocre key min max withscores 按[min,max)分數(shù)范圍正序返回key集合中的元素,顯示分數(shù) zrevrangebyscore key min max withscores 按[min,max)分數(shù)范圍倒序返回key集合中的元素,顯示分數(shù) zrem key member 刪除key集合中的member元素以及分數(shù) zremrangebyscore key min max withscores 按[min,max)分數(shù)范圍刪除key集合中的元素 zremrangebyrank key start stop 刪除key集合中按照正序排列,索引在[min,max)分數(shù)范圍內(nèi)的元素 zcount key min max 按[min,max)分數(shù)范圍統(tǒng)計key集合中的元素個數(shù)
-
全局命令
命令 | 功能 |
---|---|
keys pattern | 按照pattern模式匹配key |
exists key | 判斷key是否存在 |
expire key seconds | 設(shè)置key的過期時間 |
persist key | 取消key的過期時間 |
select index | 切換數(shù)據(jù)庫,默認是第0個,共有0~15個 |
move key db | 從當前庫將key移動到指定DB庫 |
randomkey | 隨機返回一個key |
rename key newkey | 將key改名為newkey |
echo message | 打印message信息 |
dbsize | 查詢key個數(shù) |
info | 查看redis數(shù)據(jù)庫信息 |
config get * | 查看redis所有配置信息 |
flushdb | 清空當前數(shù)據(jù)庫 |
flushall | 清空所有數(shù)據(jù)庫 |
-
value設(shè)計
-
一般模式
-
是否需要排序,需要使用zset
-
緩存的數(shù)據(jù)是多個值還是單個值
-
多個值:是否允許重復(fù),允許使用list,不允許使用set
-
單個值:簡單值選擇string,對象值選擇hash
-
-
-
取巧模式
- 除去需要排序的需求使用zset外,其余都使用string
-
-
key設(shè)計
-
唯一性,常用緩存數(shù)據(jù)的主鍵作為key
-
可讀性,目的是為了確保見名知意
-
普通單值,如
userinfo:id1
-
表名:主鍵名:主鍵值:列名,如
userinfo:id:1:name
-
-
靈活性
-
時效性,redis key一定要設(shè)置過期時間
-
不設(shè)置過期時間,key就為永久有效,會一直占用內(nèi)存,當key的數(shù)量過多時,就容易達到服務(wù)器內(nèi)存上限,導(dǎo)致宕機,所以一般要設(shè)置過期時間
-
key的時效性設(shè)置,必須根據(jù)業(yè)務(wù)場景進行評估,設(shè)置合理的有效時間
-
-
###?事務(wù)
-
單個redis命令執(zhí)行是原子性的,但是redis沒有在事務(wù)上添加任何維持原子性的機制,所以redis的事務(wù)并不是原子性的
-
redis事務(wù)可以看為一組打包的批量執(zhí)行腳本,因為其不具有原子性,所以中間的某條指令失敗并不會導(dǎo)致之前的操作回滾,也不會導(dǎo)致后續(xù)操作失敗
-
redis事務(wù)可以一次執(zhí)行多個命令
-
批量操作在發(fā)送exec命令前被放入queue中緩存
-
接收到exec指令之后進入事務(wù)執(zhí)行,事務(wù)中任意指令出錯,不會導(dǎo)致其他指令失敗及回滾
-
在事務(wù)執(zhí)行過程中,其他客戶端提交的命令請求不會插入到該事務(wù)執(zhí)行的命令隊列中
-
持久化機制
-
快照方式(RDB,redis database)
-
將內(nèi)存數(shù)據(jù)以快照的方式寫入到二進制文件中,默認為dump.rdb
-
手動觸發(fā)
-
使用save命令:會阻塞當前redis服務(wù)器,直到rdb過程完成,若內(nèi)存數(shù)據(jù)過多,會造成長時間阻塞,影響其他命令的使用
-
使用bgsave:redis進程執(zhí)行fork指令創(chuàng)建子進程,由子進程實現(xiàn)rdb持久化
-
-
自動觸發(fā)
-
使用save相關(guān)配置,
save m n
,表示m秒內(nèi)數(shù)據(jù)集存在n次修改會自動觸發(fā)bgsave命令save 1000 19
,表示1000s內(nèi)若超過19個key被修改則發(fā)起快照保存
-
-
優(yōu)點
-
rdb快照文件是一個緊湊壓縮的二進制文件,常使用于備份、全量復(fù)制等場景
-
redis加載rdb恢復(fù)數(shù)據(jù)遠遠快于aof的方式
-
-
缺點
-
無法做到實時持久化,每次bgsave都需要fork一個子進程,頻繁執(zhí)行有時間成本
-
rdb快照容易一起兼容性問題
-
-
-
文件追加方式(AOF,append only file),不建議單獨使用
-
是一種獨立日志的方式記錄每次寫命令,重啟時在重新執(zhí)行aof文件中命令達到回復(fù)數(shù)據(jù)的目的,解決了數(shù)據(jù)持久化的實時性問題
-
默認未開啟,需要在配置文件中將
appendonly no
改為appendonly yes
-
文件同步策略
-
appendfsync always
:收到命令就立即寫到磁盤,效率慢,但是可以保證完全的持久化 -
appendfsync everysec
:每秒寫入磁盤一次 -
appendfsync no
:完全依賴操作系統(tǒng),一般同步周期是30s
-
-
優(yōu)點
-
數(shù)據(jù)安全性更高,配置合理最多損失1s的數(shù)據(jù)量
-
在不小心執(zhí)行flushall命令,也可以通過aof方式恢復(fù)(刪除最后一個命令即可)
-
當aof變的太大時,redis能夠在后臺自動重寫aof
-
-
缺點
-
相同數(shù)據(jù)量來說,aof文件體積大于rdb文件
-
aof比rdb持久化效率慢
-
-
-
混合持久化方式(4.0之后)
- 在寫入的時候,先將當前的數(shù)據(jù)以rdb的方式寫入文件開頭,再將后續(xù)的操作命令以aof的格式存入文件,就是以rdb做全量備份,aof作為增量備份,來提高備份的效率。這樣不僅能保證redis重啟時的速度,又可以防止數(shù)據(jù)丟失的風險
內(nèi)存淘汰機制
maxmemory參數(shù)設(shè)置內(nèi)存使用上限 ,0代表不設(shè)置上限
-
LRU:最近最少使用,從數(shù)據(jù)庫中刪除最近最少訪問的數(shù)據(jù)??梢岳斫鉃閺臄?shù)據(jù)庫中刪除最近最少訪問的數(shù)據(jù),長期不用的數(shù)據(jù),意味著再次訪問的概率也就很小了,淘汰的數(shù)據(jù)為最長時間未被使用的數(shù)據(jù),僅與時間相關(guān)
-
LFU:最不經(jīng)常使用,淘汰一段時間內(nèi),使用次數(shù)最少的數(shù)據(jù),與頻次和時間相關(guān)
-
TTL:Redis中設(shè)置了過期時間的數(shù)據(jù),當內(nèi)存不夠時,并且該數(shù)據(jù)即將過期,就會直接清除該數(shù)據(jù)
-
隨機淘汰
-
淘汰策略(通過maxmemory-policy配置)
-
volatile-lru:找出已經(jīng)設(shè)置過期時間的數(shù)據(jù)集,將最近最少使用的數(shù)據(jù)淘汰掉
-
volatile-ttl:找出已經(jīng)設(shè)置過期時間的數(shù)據(jù)集,將即將過期的數(shù)據(jù)淘汰掉
-
volatile-random:找出已經(jīng)設(shè)置過期時間的數(shù)據(jù)集,隨機淘汰數(shù)據(jù)
-
volatile-lfu:找出已經(jīng)設(shè)置過期時間的數(shù)據(jù)集,將一段時間內(nèi),使用次數(shù)最少的數(shù)據(jù)淘汰掉
-
allkeys-lru:與1類似,只不過為全體數(shù)據(jù)
-
allkeys-lfu:與4類似,只不過為全體數(shù)據(jù)
-
allkeys-random:與3類似,只不過為全體數(shù)據(jù)
-
no-enviction:什么都不做,直接報錯,通知內(nèi)存不足,可以保證數(shù)據(jù)不丟失(默認)
-