Redis 學習

持久化

持久化就是把內存中的數據寫到磁盤中,防止服務宕機致使內存數據丟失。java

Redis 提供了兩種持久化的機制:RDB(默認)、AOF機制。面試

RDB

RDB是Redis默認的持久化方式。按照必定的時間 將內存的數據以快照的形式保存到磁盤中,對應產生的數據文件爲 dump.rdb. 經過配置文件中的save參數來定義快照的週期。redis

它恢復時是將快照文件直接讀到內存裏。安全

Redis 會單獨 fork 一個子進程來進行持久化,會先將數據寫到一個臨時文件中,到持久化過程都結束了,再用這個臨時文件替換上次持久化好的文件。整個過程當中,主進程是不進行任何IO操做的。app

若是須要進行大規模的數據恢復,且對於數據恢復的完整性不是很是敏感,那RDB方式要比AOF方式更高效。RDB的缺點是最後一次持久化後的數據可能丟失。工具

AOF

AOF(Append Only File持久化),則是將Redis 每次執行的寫命令記錄到單獨的日誌文件中,當重啓Redis時 會從新從持久化的日誌文件中恢復數據。學習

AOF持久化(即Append Only File持久化),則是將Redis執行的每次寫命令記錄到單獨的日誌文件中,當重啓Redis會從新將持久化的日誌中文件恢復數據。
AOF保存的是 appendonly.aof 文件。開發工具

當兩種方式同時開啓時,數據恢復 Redis 會優先選擇 AOF 恢復。.net

事務

Redis事務的本質是:一組命令的集合。一個事務中的全部命令都會被序列化,在事務的執行過程當中會按照順序執行。線程

Redis事務沒有隔離級別的概念。

全部的命令在事務中,並無直接被執行,只有發起執行命令的時候纔會被執行 EXEC.

Redis 單條命令具備原子性,可是事務不保證原子性。

Redis事務的三個階段

  • 開啓事務 MULTI
  • 命令入隊
  • 執行事務EXEC

Redis事務的相關命令:

  • MULTI:開啓事務
  • EXEC:執行事務
  • DISCARD:取消事務
  • WATCH:監控,(樂觀鎖)
  1. Redis 不支持回滾
  2. 若是在一個事務中 命令出現錯誤(編譯異常),全部的命令都不會被執行
  3. 若是在一個事務中 運行錯誤(語法性錯誤),那麼正確的命令會被執行

Jedis

Jedis 是Redis官方推薦的 java連接開發工具,使用Java操做Redis的中間件。

SpringBoot整合Redis

在SpringBoot2.x 以後,原來使用的jedis 被替換爲了 lettuce

  • jedis:採用直連,多個線程操做,是不安全的,若是想要避免不安全,使用 jedis pool 鏈接。
  • lettuce:採用netty,實例能夠在多個線程中進行共享,不存在線程不安全的狀況。

自定義 RedisTemplete

@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory
                                                               factory) {
        // 咱們爲了本身開發方便,通常直接使用 <String, Object>
        RedisTemplate<String, Object> template = new RedisTemplate<String,
                Object>();
        template.setConnectionFactory(factory);
        // Json序列化配置
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new
                Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        // String 的序列化
        StringRedisSerializer stringRedisSerializer = new
                StringRedisSerializer();
        // key採用String的序列化方式
        template.setKeySerializer(stringRedisSerializer);
        // hash的key也採用String的序列化方式
        template.setHashKeySerializer(stringRedisSerializer);
        // value序列化方式採用jackson
        template.setValueSerializer(jackson2JsonRedisSerializer);
        // hash的value序列化方式採用jackson
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }
}

文章學習自:

相關文章
相關標籤/搜索