Redis事務
1.Redis事務本質:一組命令的集合愤惰,加入隊列崔兴,然后執(zhí)行叹谁,執(zhí)行完事務結束稀蟋。
redis事務:
①開啟事務:multi
②命令入隊:set key1 v1 set key2 v2 .埂陆。苛白。get...
③執(zhí)行事務:exec
取消事務:discard,所有事務中入隊的命令都不會執(zhí)行
注意:如果在②時候命令錯誤焚虱,exec所有的命令都不會被執(zhí)行购裙,如果是命令沒錯運行出錯的話,其他命令可以執(zhí)行鹃栽。
watch用來監(jiān)控事務:
可以用來做樂觀鎖操作躏率,如果exec執(zhí)行之前,另外一個事務對money進行操作并且執(zhí)行完了,此時這里再exec的話就會執(zhí)行失敗薇芝。
如何解決蓬抄?
首先放棄watch監(jiān)視 unwatch,即解鎖夯到,再重新watch嚷缭,如果再失敗就再解鎖再加鎖,有種自旋鎖的味道黄娘。
jedis 操作事務:
SpringBoot整合Redis
SpringBoot 2.x之后默認不用jedis峭状,替換為lettuce?
jedis:采用直連逼争,多線程操作不安全优床,如何避免?使用jedis pool
lettuce:采用netty誓焦,實例可以多線程共享胆敞,不存在線程安全問題,可以減少線程數據杂伟。
源碼分析:
在導入starter包后會發(fā)現底層還是用的lettuce進行操作的移层,雖然也有jedis的實現,但是并沒用
可以用spring自帶的RedisTemplate也可以自己定義赫粥,自己定義則自帶的就會失效:
观话,這里定義了一個jackson序列化的方法。
redis.conf了解:
bind 127.0.0.1 綁定的ip
protected-mode no 保護模式
port 端口
通用:GENERAL
daemonize yes
pidfile /var/run/redis_6379.pid
# Specify the server verbosity level.
# This can be one of:
# debug (a lot of information, useful for development/testing)
# verbose (many rarely useful info, but not a mess like the debug level)
# notice (moderately verbose, what you want in production probably) 生產環(huán)境
# warning (only very important / critical messages are logged)
loglevel notice
logfile "" 日志文件位置名
databases 16 默認16個數據庫
快照:SNAPSHOTTING
save 900 1 900s內 如果至少有一個key進行修改越平,則持久化
save 300 10 300s內 至少10個key就行操作频蛔,則進行持久化
save 60 10000 。秦叛。晦溪。同理
stop-writes-on-bgsave-error yes 持久化出錯繼續(xù)工作
rdbcompression yes 是否壓縮RDB文件,需要消耗一些cpu資源
rdbchecksum yes 保存RDB文件時挣跋,自動檢查校驗
dir ./ rdb文件保存路徑
REPLICATION 主從復制
安全:SECURITY
設置redis密碼
MEMORY MANAGEMENT
maxmemory <bytes> redis配置最大的內存容量
maxmemory-policy noeviction 內存達到上限時的處理策略
1三圆、volatile-lru:只對設置了過期時間的key進行LRU(默認值)
2、allkeys-lru : 刪除lru算法的key
3避咆、volatile-random:隨機刪除即將過期key
4舟肉、allkeys-random:隨機刪除
5、volatile-ttl : 刪除即將過期的
6牌借、noeviction : 永不過期度气,返回錯誤
AOF:APPEND ONLY MODE
appendonly no 默認不開啟,默認rdb模式膨报,一般情況下rdb就夠用了
appendfilename "appendonly.aof"
# appendfsync always 每次修改都會同步
appendfsync everysec 默認每秒執(zhí)行一次
# appendfsync no 不同步
RDB持久化
在指定時間間隔內將內存中的數據集體寫入磁盤,父進程會fork一個子進程講內存內同寫入rdb文件,主進程是不進行ID操作的现柠。
最后一次持久化的話:如果宕機就會缺失一些數據院领。
rdb的dump.rdb文件什么時候產生?
save時够吩,redis關閉時比然,flushall時
AOF 追加
將我們所有命令記錄下來,除了讀操作周循,redis重新執(zhí)行命令强法,會很慢,默認不開啟湾笛。
如果開啟了aof饮怯,aof文件有錯誤則是啟動不了redis的,此時可以用redis目錄下的redis-check-aof可以進行修復嚎研,命令:redis-check-aof --fix appendonly.aof
Redis發(fā)布訂閱
Redis發(fā)布訂閱(pub/sub)是一種消息通信模式蓖墅。
發(fā)布者+頻道
測試:
原理:通過SUBSCRIBE命令訂閱某頻道后,redis-server里維護了一個字典临扮,字典就是一個個頻道论矾,字典的值是一個鏈表,鏈表中保存了所有訂閱這個channel的客戶端杆勇,SUBSCRIBE命令的關鍵就是將客戶端添加到給定的channel中的訂閱鏈表中贪壳。
通過PUBLISH命令向訂閱者發(fā)送消息,redis-server會使用給定的頻道作為鍵蚜退,在它所維護的channel中查找記錄了訂閱這個頻道的所有客戶端鏈表闰靴,遍歷這個鏈表,將消息發(fā)送給所有訂閱者关霸。
Redis集群
正常最少需要一主二從传黄。
環(huán)境配置:只配從庫,不用配置主庫队寇。
通過info replication查看主從信息膘掰,
復制3個redis.conf,并修改
①端口
②pid名字
③log文件名
④dump.rdb名字
修改完畢之后 通過 redis-server set/redis6379.conf 啟動各個redis佳遣。
如何配置從機识埋?
比如有6379/6380/6381三個服務
在6380中執(zhí)行slaveof 127.0.0.1 6379 意思就是找6379這個作為自己的老大,這個是通過命令配置的零渐,是暫時的窒舟,其實應該在redis.conf文件中配置(replicaof <masterip> <masterport>)。
主機寫從機讀取诵盼。
如果主機斷了惠豺,可以通過slaveof no one 讓自己變成主機银还,如果此時與哪來的老大又回來了,那也沒用了洁墙。
哨兵模式
與上述手動切換主從的繁瑣流程蛹疯,redis使用sentinel哨兵模式來智能化選舉老大。
如何開啟热监?
在bin目錄下有一個redis-sentinel捺弦,如我們上面說的最少三個進程來完成主從,那么哨兵也需要最少三個孝扛。
①.在redis.conf同級目錄下新建哨兵的配置sentinel.conf列吼,多個就配置多個
sentinel monitor myredis 127.0.0.1 6379 1 myredis是被監(jiān)控的名稱,1代表主機掛了苦始,slave投票讓誰接替主機
②.啟動哨兵
redis-sentinel
Redis緩存穿透和雪崩
①.穿透(查不到)如何解決:BloomFilter或者在緩存中加一個空對象寞钥,不讓查詢進入數據庫查詢
緩存擊穿(量太大):指的是一個key非常熱點,不停的高并發(fā)集中一個點訪問;
如何解決盈简?設置永不過期/加互斥鎖
②.緩存雪崩:某個時間段緩存集中過期失效凑耻;
如何解決?多搭建幾臺redis異地多活/限流降級/數據預熱(先訪問一邊加載到緩存中)