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