Nosql:Not-Only SQL(泛指非關系型數據庫),作為關系型數據庫的補充
作用:應對基于海量用戶和海量數據前提下的數據處理問題
redis:C語言開發的一個開源的高性能鍵值對數據庫
特征:
1、數據之間沒有必然的關聯關系
2、內部采用單線程機制工作
3、高性能
4、多數據類型支持(string、list、hash、set、sorted_set)
5、支持持久化(可以進行數據災難恢復)
redis應用:
1、為熱點數據加速查詢(熱點商品、熱點新聞等)
2、任務隊列(秒殺、搶購、購票排隊等)
3、即時信息查詢(各類排行榜、網站訪問統計等)
4、時效性信息控制(驗證碼控制)
5、分布式數據共享(分布式集群架構中的session共享)
6、消息隊列
7、分布式鎖
數據類型相關命令:
string:字符串
命令 | 說明 |
---|---|
set [key] [value] | 添加、修改數據 |
get [key] | 獲取數據 |
del [key] | 刪除數據 |
mset [key1] [value1] [key2] [value2] ... | 添加、修改多個數據 |
mget [key1] [key2] ... | 獲取多個數據 |
strlen [key] | 獲取數據字符個數(字符串長度) |
append [key] [value] | 追加信息到原信息尾部(如果原來信息存在就追加,否則新建) |
incr [key] | 數據自增1 |
incrby [key] [increment] | 數據增加指定整數范圍 |
incrbyfloat [key] [increment] | 數據增加指定小數范圍 |
decr [key] | 數據自減1 |
decrby [key] [increment] | 數據減去自定范圍整數 |
setex [key] [seconds] [value] | 設置數據具有制定的生命周期(秒) |
psetex [key] [milliseconds] [value] | 設置數據具有制定的生命周期(毫秒) |
hash:哈希表結構
命令 | 說明 |
---|---|
hset [key] [field] [vaule] | 添加、修改數據 |
hget [key] [field] | 獲取數據 |
hgetall [key] | 獲取全部數據 |
hdel [key] [field1] [field2] ... | 刪除數據 |
hlen [key] | 獲取哈希表中字段的數量 |
hexists [key] [field] | 哈希表中是否存在該字段(返回存在的個數) |
hkeys [key] | 獲取哈希表中所有字段名 |
hvals [key] | 獲取哈希表中所有字段值 |
hincrby [key] [field] [increment] | 設置指定字段的數值數據增加指定范圍的值(整數) |
hincrbyfloat [key] [field] [increment] | 設置指定字段的數值數據增加指定范圍的值(小數) |
hsetnx [key] [field] [value] | 存在字段不更新,不存在新增 |
list:有序的雙向鏈表
命令 | 說明 |
---|---|
lpush [key] [value1] [value2] ... | 添加、修改數據(左) |
rpush [key] [value1] [value2] ... | 添加、修改數據(右) |
lrange [key] [start] [stop] | 從左邊獲取數據,start(從0)開始,stop(-1代表倒1位置)結束 |
lindex [key] [index] | 從左邊讀取index位置的數據,index從0開始 |
llen [key] | 獲取數據個數 |
lpop [key] | 從左邊獲取一個數據并移除 |
rpop [key] | 從右邊獲取一個數據并移除 |
blpop [key1] [key2] ... [timeout] | 規定時間內從左邊獲取并移除數據,timeout秒級 |
brpop [key1] [key2] ... [timeout] | 規定時間內從右邊獲取并移除數據,timeout秒級 |
lrem [key] [count] [value] | 從左移除指定數據,count移除個數,value移除的數據 |
set:數據不重復
命令 | 說明 |
---|---|
sadd [key] [member1] [member2] ... | 添加數據 |
smembers [key] | 獲取全部數據 |
srem [key] [member1] [member2] ... | 刪除數據 |
scard [key] | 獲取集合數據總量 |
sismember [key] [member] | 判斷集合中是否包含指定數據,返回個數 |
srandmember [key] [count] | 隨機從集合中抽取count個數據,原集合不變 |
spop [key] | 隨機獲取集合中的某個數據,并移出集合 |
sinter [key1] [key2] | 求兩個集合的交集 |
sunion [key1] [key2] | 求兩個集合的并集 |
sdiff [key1] [key2] | 求兩個集合的差集,有順序的,key1 - key2的差集 |
sinterstore [key3] [key1] [key2] | 求(key1,key2)兩個集合的交集,并存儲到key3中 |
sunionstore [key3] [key1] [key2] | 求(key1,key2)兩個集合的并集,并存儲到key3中 |
sdiffstore [key3] [key1] [key2] | 求(key1,key2)兩個集合的差集,并存儲到key3中 |
smove [source] [destination] [member] | 把數據member從集合source移動到集合destination中 |
sorted_set:有序的set集合
命令 | 說明 |
---|---|
zadd [key] [score1] [member1] [score1] [member1] ... | 添加(多個)數據,按照score排序 |
zrange [key] [start] [stop] [withscores] | 獲取數據(升序),withscores會展示score值,start、stop為索引 |
zrevrange [key] [start] [stop] [withscores] | 獲取數據(降序) |
zrem [key] [member1] [member2] ... | 刪除(多個)數據 |
zrangebyscore [key] [min] [max] [withscores] [limit] | 按條件升序獲取,min < score值 < max,limit限制條數 |
zrevrangebyscore [key] [max] [min] [withscores] [limit] | 按條件降序獲取 |
zremrangebyrank [key] [start] [stop] | 根據索引范圍刪除 |
zremrangebyscore [key] [min] [max] | 根據score值范圍刪除 |
zcard [key] | 獲取集合數據總量 |
zcount [key] [min] [max] | 獲取指定的score值范圍中的數據條數 |
zinterstore [destination] [keynumber] [key1] [key2] ... | 集合交集,keynumber為要操作的集合個數 |
zunionstore [destination] [keynumber] [key1] [key2] ... | 集合并集,keynumber為要操作的集合個數 |
zrank [key] [member] | 獲取指定數據的索引(升序) |
zrevrank [key] [member] | 獲取指定數據的索引(降序) |
zscore [key] [member] | 獲取指定數據的score值 |
zincrby [key] [increment] [member] | 給指定的member數據的score值增加increment |
key通用操作:
命令 | 說明 |
---|---|
del [key] | 刪除指定key |
exists [key] | 獲取key是否存在 |
type [key] | 獲取key的類型 |
expire [key] [second] | 為指定key設置有效期,秒級 |
pexpire [key] [milliseconds] | 為指定key設置有效期,毫秒級 |
ttl [key] | 獲取key的有效時間(秒),返回-2說明key不存在,返回-1說明key存在 |
pttl [key] | 獲取key的有效時間(毫秒) |
persist [key] | 切換key從時效性轉換為永久性 |
rename [key] [newkey] | 為key改名,newkey如果已存在會覆蓋原先的值 |
renamenx | 為key改名,newkey如果已存在不會改名 |
sort | 排序 |
key查詢模式規則:
keys pattern
db基本操作:
命令 | 說明 |
---|---|
select [index] | 切換數據庫(0-16) |
ping | 返回pong說明數據庫是連通的 |
quit | 退出 |
move [key] [dbindex] | 數據移動 |
dbsize | 當前庫中key的總量 |
flushdb | 清除當前庫的數據 |
flushall | 清除所有庫的數據 |
redis持久化:
1、rdb:以快照的形式記錄數據
save:保存命令
bgsave:后臺保存,會開啟子進程進行數據保存
save?[second] [count]:自動保存,在second(秒)時間內,改變count次
2、aof:記錄歷史命令,后臺會重寫
重寫的作用:
??1)、降低磁盤占用量,提高磁盤利用率
??2)、提高持久化效率,降低持久化寫時間,提高IO性能
??3)、降低數據恢復用時,提高數據恢復效率
重寫規則:
1、已超時的數據不再寫入
2、忽略無效指令,只保留最終數據的寫入命令
3、對同一數據的多條寫命令合并為一條命令(list,set,hash,zset指令一次性最多寫入64個元素)
bgrewriteaof:手動重寫
redis事務:
multi:開啟事務(設定事務的開啟位置,此命令執行后,后續的所有命令均加入到該事務中)
exec:執行事務(設定事務的結束位置,同時執行事務。與multi成對使用)
discard:取消事務(終止當前事務,發生在multi之后)
redis監控鎖:
watch?[key1] [key2]?...?:對key添加監視鎖,在執行exec前如果key發生變化,終止事務執行
unwatch:取消對所有key的監視
redis:分布式鎖(公共鎖):
setnx lock-[key]?value:設置公共鎖
del lock-[key]:釋放鎖
expire lock-[key] [second]:為鎖key添加時間限定,到時不釋放,自動釋放鎖(秒)
pexpire lock-[key] [milliseconds]:為鎖key添加時間限定,到時不釋放,自動釋放鎖(毫秒)
redis刪除策略:
1、定時刪除:用時間換空間
??好:節約內存,無占用
??壞:不分時段占用CPU資源,頻度高
2、惰性刪除:訪問某個key時,判斷該key是否過期,過期則清除
??好:延時執行,CPU利用率高
??壞:內存占用嚴重
3、定期刪除:每隔一定的時間,掃描一定數量的key,并清除其中過期的key。
redis同時使用惰性刪除和定期刪除這兩種過期策略
redis逐出策略:
相關配置
maxmemory:最大可使用內存
maxmemory-samples:每次選取待刪除的數據個數
哨兵模式:
定義:監控主從結構中各個redis服務器工作過程,當master出現故障時,通過投票機制選出新的master,并將所有的slave連接到新的master
工作原理:
1、監控master和各個slave
2、各個哨兵之間互通信息
3、當一個哨兵發現master出現故障,會通知其他哨兵復核,超出一半的哨兵發現master故障,會投票選出一個哨兵進行故障處理,選出一臺slave作為新master,通知其他slave連接到新的master
緩存預熱:系統啟動前,提前將相關的緩存數據直接加載到緩存系統,避免在用戶請求的時候,直接查詢數據庫,再將數據進行緩存的問題。讓用戶直接查詢事先被預熱的緩存數據。
緩存雪崩:一段時間內,大量的緩存數據過期,請求直接訪問數據庫,導致數據庫服務器造成大量壓力。
解決:
1、熱點數據使用永久key
2、為key設置不同的有效期
緩存擊穿:單個key數據過期瞬間,數據訪問量較大,大量對數據庫訪問,導致對數據庫服務器造成壓力。
解決:
1、熱點數據使用永久key
2、為key設置不同的有效期
緩存穿透:大量訪問不存在的數據,對數據庫服務器造成壓力。
解決:
1、返回結果為null也進行緩存,有效時間短
2、采用布隆過濾器
布隆過濾器:二進制數組,key經過多個hash函數得出的值就是數組的索引,索引對應位置的值會設置為1。新的key經過同樣步驟得出索引值,如果對應位置的值不全是1,說明這個key不存在,直接過濾掉。
問題:存在誤判。不同的值hash后可能結果一致,會導致不存在的key判斷為存在。
如何保證redis和數據庫數據一致性
1、先更新數據庫,再刪除redis(下次讀取時重新加載)
2、更新redis,同步更新數據庫(兩步操作在同一個事務中)
3、更新redis,發送消息同步到數據庫(redis掛了,未同步數據容易丟失)
4、更新數據庫,Canal監聽Binglog,通過MQ更新redis
5、延遲雙刪,更新數據庫前后刪除redis(第二次刪除延遲500ms)
6、分布式鎖,加鎖,更新數據庫和刪除緩存,釋放鎖