Redis進(jìn)階知識(shí)1:事務(wù)、整合Java和配置文件

事務(wù)

Redis事務(wù)可以一次執(zhí)行多個(gè)命令表谊。三個(gè)特點(diǎn):

  1. Redis單條命令保證原子性钞护,但Redis事務(wù)不保證原子性
  2. 事務(wù)的所有命令都會(huì)被序列化爆办,在執(zhí)行過(guò)程中难咕,會(huì)按照順序執(zhí)行。
  3. 所有命令在事務(wù)中距辆,沒(méi)有直接執(zhí)行余佃,只有在發(fā)起執(zhí)行命令的時(shí)候才會(huì)執(zhí)行。

Redis事務(wù)順序:開(kāi)啟事務(wù)(multi) ==> 命令入隊(duì) ==> 執(zhí)行事務(wù)(exec

  • 開(kāi)啟跨算、執(zhí)行事務(wù)(multi爆土、exec)
127.0.0.1:6379> multi           #mutli開(kāi)啟事務(wù)
OK
127.0.0.1:6379> set k1 v1       #命令入隊(duì)
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> get k2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> exec            #執(zhí)行事務(wù)
1) OK
2) OK
3) "v2"
4) OK
127.0.0.1:6379> keys *
1) "k2"
2) "k3"
3) "k1"
  • 放棄事務(wù)(discard)
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> get k2
QUEUED
127.0.0.1:6379> discard     #中途放棄事務(wù),事務(wù)不執(zhí)行
OK
127.0.0.1:6379> get k1
(nil)
  • 編譯型異常

語(yǔ)法錯(cuò)誤诸蚕,事務(wù)中所有命令都不會(huì)執(zhí)行步势。

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> getset k3       #命令錯(cuò)誤氧猬,不存在該命令,所有命令都不會(huì)執(zhí)行
(error) ERR wrong number of arguments for 'getset' command
127.0.0.1:6379> set k4 v4
QUEUED
127.0.0.1:6379> set k5 v5
QUEUED
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> keys *
(empty list or set)
  • 運(yùn)行時(shí)異常

邏輯錯(cuò)誤立润,其他命令可以正常執(zhí)行狂窑,錯(cuò)誤命令拋出異常。

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> incr k1     # 此時(shí)執(zhí)行命令失敗桑腮,但不影響其他命令執(zhí)行
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> set k4 v4
QUEUED
127.0.0.1:6379> get k4
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) (error) ERR value is not an integer or out of range
4) OK
5) OK
6) "v4"
127.0.0.1:6379> keys *
1) "k4"
2) "k2"
3) "k3"
4) "k1"
  • 事務(wù)的悲觀鎖和樂(lè)觀鎖(watch)
  1. 悲觀鎖:假定任何時(shí)候都會(huì)出問(wèn)題泉哈,無(wú)論做什么都會(huì)加鎖。
  2. 樂(lè)觀鎖:假定任何時(shí)候都不會(huì)出問(wèn)題破讨,只在要出錯(cuò)時(shí)加鎖丛晦。樂(lè)觀鎖一般通過(guò)添加字段version實(shí)現(xiàn),更新數(shù)據(jù)時(shí)比較version提陶,以此表明在此期間是否有人修改過(guò)數(shù)據(jù)烫沙。大部分軟件包括Redis都采用的是樂(lè)觀鎖機(jī)制,因?yàn)楸^鎖效率太低隙笆。

不加樂(lè)觀鎖時(shí):

###進(jìn)程1
127.0.0.1:6379> unwatch     #不監(jiān)視任何資源
OK
127.0.0.1:6379> get money
"100"
127.0.0.1:6379> get out
"0"
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby money 20
QUEUED
127.0.0.1:6379> incrby out 20       #此時(shí)在執(zhí)行exec命令前執(zhí)行進(jìn)程2锌蓄,再執(zhí)行事務(wù)
QUEUED
127.0.0.1:6379> exec
1) (integer) 180
2) (integer) 20

###進(jìn)程2
127.0.0.1:6379> get money
"100"
127.0.0.1:6379> get out
"0"
127.0.0.1:6379> set money 200
OK

加樂(lè)觀鎖時(shí):

###進(jìn)程1
127.0.0.1:6379> get money
"200"
127.0.0.1:6379> get out
"0"
127.0.0.1:6379> watch money     #樂(lè)觀鎖監(jiān)視money,即獲取money的version
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby money 20
QUEUED
127.0.0.1:6379> incrby out 20       #此時(shí)在執(zhí)行exec命令前執(zhí)行進(jìn)程2撑柔,再事務(wù)
QUEUED
127.0.0.1:6379> exec
(nil)


###進(jìn)程2
127.0.0.1:6379> get money
"200"
127.0.0.1:6379> get out
"0"
127.0.0.1:6379> set money 100
OK

Jedis:使用Java操作Redis

使用Java操作Redis的中間件瘸爽。

  1. 導(dǎo)入依賴(lài)
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.2.0</version>
        </dependency>
  1. Jedis中所有命令郭蕉,都和Redis中一樣捻悯。
        Jedis jedis = new Jedis("localhost",6379);
        System.out.println(jedis.ping());
        System.out.println(jedis.set("k1","k2"));   //OK
        System.out.println(jedis.get("k1"));        //k2
  1. Jedis中事務(wù)操作
        Jedis jedis = new Jedis("localhost",6379);
        jedis.flushDB();
        Transaction multi = jedis.multi();
        try {
            multi.set("k1","v1");
            multi.set("k2","v2");

            multi.exec();   //執(zhí)行事務(wù)
        } catch (Exception e) {
            multi.discard();    //放棄事務(wù)
            e.printStackTrace();
        } finally {
            System.out.println(jedis.get("k1"));
            System.out.println(jedis.get("k2"));
            jedis.close();      //關(guān)閉連接
        }

Spring Boot整合Redis

  1. Spring Boot 2.X之后夸赫,將原來(lái)使用的Jedis替換成lettuce车海。
  2. lettuce采用netty,實(shí)例可以在多個(gè)線程中共享刻蚯,不存在線程不安全的情況淑蔚,更像NIO模式锈遥。而Jedis采用的是直連峻凫,多個(gè)線程操作的話渗鬼,是不安全的。

步驟:

  1. 導(dǎo)入依賴(lài)
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
  1. 連接配置
        //yml連接Redis
        spring:
          redis:
            host: 127.0.0.1
            port: 6379

        //使用Redis
        @Autowired
        private RedisTemplate redisTemplate;
  1. 操作數(shù)據(jù)
        //對(duì)各個(gè)數(shù)據(jù)類(lèi)型進(jìn)行操作
        ValueOperations valueOperations = redisTemplate.opsForValue();
        ListOperations listOperations = redisTemplate.opsForList();
        SetOperations setOperations = redisTemplate.opsForSet();
        HashOperations hashOperations = redisTemplate.opsForHash();
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();
        GeoOperations geoOperations = redisTemplate.opsForGeo();
        HyperLogLogOperations hyperLogLogOperations = redisTemplate.opsForHyperLogLog();
    
        //獲取連接對(duì)象
        RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
        connection.flushAll();
        connection.flushDb();

redis.conf配置文件

  1. 配置文件 unit單位對(duì)大小寫(xiě)不敏感
  2. 綁定網(wǎng)絡(luò)
bind 127.0.0.1  #綁定ip
protected-mode yew #保護(hù)模式
port 6379   #端口
  1. Redis默認(rèn)不是以守護(hù)進(jìn)程的方式運(yùn)行荧琼,可以通過(guò)配置參數(shù)乍钻,啟用守護(hù)進(jìn)程
daemonize yes   #默認(rèn)為no,yes啟用守護(hù)進(jìn)程
  1. 日志配置
loglevel notice #日志等級(jí)
logfile ""  #日志文件的位置
  1. 持久化及rdb配置:在規(guī)定時(shí)間內(nèi)铭腕,執(zhí)行固定次操作,就會(huì)持久化到文件 .rdb和.aof
save 900 1  #900秒內(nèi)多糠,至少有1個(gè)key進(jìn)行了修改累舷,就會(huì)進(jìn)行持久化操作。
save 300 10 #300秒內(nèi)夹孔,至少有10個(gè)key進(jìn)行了修改被盈,就會(huì)進(jìn)行持久化操作析孽。
save 60 10000   #60秒內(nèi),至少有10000個(gè)key進(jìn)行了修改只怎,就回進(jìn)行持久化操作袜瞬。

stop-writes-on-bgsave-error yes #持久化操作如果出錯(cuò),是否繼續(xù)工作身堡。yes表示繼續(xù)邓尤。

rdbcompression yes  #是否壓縮.rdb文件,壓縮需要消耗CPU資源

rdbchecksum yes #保存.rdb文件時(shí)是否進(jìn)行校驗(yàn)贴谎。

dir ./  #.rdb文件保存的目錄
  1. 安全
requirepass foobared    #登錄redis默認(rèn)沒(méi)有密碼汞扎,可設(shè)置登錄密碼
  1. 限制
maxClients 10000    #設(shè)置連接客戶端最大數(shù)量

maxmemory <bytes>   #設(shè)置redis最大內(nèi)存容量

maxmemory-policy noeviction #內(nèi)存達(dá)到上限后的處理策略
        #volatile-lru:只對(duì)設(shè)置了過(guò)期時(shí)間的key進(jìn)行LRU算法,redis默認(rèn)采用此策略
        #allkeyds-lru:刪除LRU算法的key
        #volatile-random:隨機(jī)刪除即將過(guò)期的key
        #allkeys-random:隨機(jī)刪除
        #volatile-ttl:刪除即將過(guò)期的
        #noeviction:永不過(guò)期擅这,返回錯(cuò)誤
  1. aof配置
appendonly no   #aof默認(rèn)不開(kāi)啟澈魄,使用rdb方式持久化。在大部分情況下仲翎,rdb完全夠用痹扇。

appendfilename "appendonly.aof" #aof文件名

appendfsync everysec    #每秒執(zhí)行一次同步,但可能會(huì)丟失1s的數(shù)據(jù)
            #always     #每次修改都同步溯香,會(huì)消耗性能
            #no         #不同步
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鲫构,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子逐哈,更是在濱河造成了極大的恐慌芬迄,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昂秃,死亡現(xiàn)場(chǎng)離奇詭異禀梳,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)肠骆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)算途,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蚀腿,你說(shuō)我怎么就攤上這事嘴瓤。” “怎么了莉钙?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵廓脆,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我磁玉,道長(zhǎng)停忿,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任蚊伞,我火速辦了婚禮席赂,結(jié)果婚禮上吮铭,老公的妹妹穿的比我還像新娘。我一直安慰自己颅停,他們只是感情好谓晌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著癞揉,像睡著了一般纸肉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上烧董,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天毁靶,我揣著相機(jī)與錄音,去河邊找鬼逊移。 笑死预吆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的胳泉。 我是一名探鬼主播拐叉,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼扇商!你這毒婦竟也來(lái)了凤瘦?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤案铺,失蹤者是張志新(化名)和其女友劉穎蔬芥,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體控汉,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡笔诵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了姑子。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乎婿。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖街佑,靈堂內(nèi)的尸體忽然破棺而出谢翎,到底是詐尸還是另有隱情,我是刑警寧澤沐旨,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布森逮,位于F島的核電站,受9級(jí)特大地震影響磁携,放射性物質(zhì)發(fā)生泄漏吊宋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望璃搜。 院中可真熱鬧,春花似錦鳞上、人聲如沸这吻。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)唾糯。三九已至,卻和暖如春鬼贱,著一層夾襖步出監(jiān)牢的瞬間移怯,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工这难, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舟误,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓姻乓,卻偏偏與公主長(zhǎng)得像嵌溢,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蹋岩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355