首頁 > 軟體

Springboot整合Redis與資料持久化

2022-07-28 14:03:38

Springboot整合Redis

有兩種儲存資料的方式:

方案1:在Redis存放一個物件 使用json序列化與反序列化

方案2:直接使用redis自帶序列化方式儲存物件

maven依賴

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
    </parent>
    <dependencies>
        <!-- 整合commons工具類 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
        <!-- 整合lombok 框架 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!-- fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.30</version>
        </dependency>
        <!-- SpringBoot-整合Web元件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
    </dependencies>

yml檔案設定

spring:
  redis:
    host: www.kaicostudy.com
    password: 123456
    port: 6379

使用json方式儲存

工具類程式碼

@Component
public class RedisUtils {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    public void setString(String key, String value) {
        setString(key, value, null);
    }
    public void setString(String key, String value, Long timeOut) {
        stringRedisTemplate.opsForValue().set(key, value);
        if (timeOut != null) {
            stringRedisTemplate.expire(key, timeOut, TimeUnit.SECONDS);
        }
    }
    public String getString(String key) {
        return stringRedisTemplate.opsForValue().get(key);
    }
}

控制層

@RestController
public class IndexController {
    @Autowired
    private RedisUtils redisUtils;
    @RequestMapping("/setRedis")
    public void setRedisKey(UserEntity userEntity) {
        redisUtils.setString("userEntity", JSONObject.toJSONString(userEntity));
    }
    @RequestMapping("/getRedis")
    public UserEntity setRedisKey() {
        String userEntityJson = redisUtils.getString("userEntity");
        UserEntity userEntity = JSONObject.parseObject(userEntityJson, UserEntity.class);
        return userEntity;
    }
}

儲存方式:

序列化方式儲存資料

注意需要序列化的物件一定要實現Serializable介面

工具類

@Componentpublic class RedisTemplateUtils {<!--{C}%3C!%2D%2D%20%2D%2D%3E--> @Resource private RedisTemplate<String, Object> redisTemplate; public void setObject(String key, Object object) {<!--{C}%3C!%2D%2D%20%2D%2D%3E--> redisTemplate.opsForValue().set(key, object); } public Object getObjet(String key) {<!--{C}%3C!%2D%2D%20%2D%2D%3E--> return redisTemplate.opsForValue().get(key); }}@Component
public class RedisTemplateUtils {
    @Resource
    private RedisTemplate<String, Object> redisTemplate;
    public void setObject(String key, Object object) {
        redisTemplate.opsForValue().set(key, object);
    }
    public Object getObjet(String key) {
        return redisTemplate.opsForValue().get(key);
    }
}

控制層測試

@RestController
public class IndexController {
    @Autowired
    private RedisTemplateUtils redisTemplateUtils;
    @RequestMapping("/setRedisSerializable")
    public void setRedisSerializable(UserEntity userEntity) {
        redisTemplateUtils.setObject("userEntity", userEntity);
    }
    @RequestMapping("/getRedisSerializable")
    public UserEntity getRedisSerializable() {
        UserEntity userEntity = (UserEntity) redisTemplateUtils.getObjet("userEntity");
        return userEntity;
    }
}

序列化儲存:

SpringBoot整合Redis的註解版本

詳細介紹見另一篇部落格:連結

MySQL與Redis一致性解決同步問題

方式1:直接清除Redis的快取,重新讀取資料庫即可

方式2:使用mq非同步訂閱mysql binlog實現增量同步

方式3:使用alibaba的canal 框架

Redis持久化機制

全量同步與增量同步

全量同步:就是每天定時(避開高峰期)或者採用一個週期實現將資料拷貝到一個地方也就是Rdb儲存。

增量同步:比如採用對行為的操作實現對資料的同步,也就是AOF。

全量與增量的比較:增量同步比全量同步更加消耗伺服器的記憶體,但是能夠更加的保證資料的同步。

RDB與AOF

Redis提供了兩種持久化的機制,分別為RDB、AOF實現,RDB採用定時(全量)持久化機制,但是伺服器因為某種原因宕機後可能資料會丟失,AOF是基於資料紀錄檔操作實現的持久化,所以AOF採用增量同步的方案。

Redis已經幫助我預設開啟了rdb儲存,兩種模式可以同時開啟,生產環境中一般兩種模式都會開啟,優先使用AOF。

RDB

Redis預設採用rdb方式實現資料的持久化,以快照的形式將資料持久化到磁碟的是一個二進位制的檔案dump.rdb, 在redis.conf檔案中搜尋“dump.rdb “。

Redis會將資料集的快照dump到dump.rdb檔案中。此外,也可以通過組態檔來修改Redis伺服器dump快照的頻率,在開啟組態檔之後,搜尋save,可以看到下面的設定資訊:

save 900 1    #在900秒(15分鐘)之後,如果至少有1個key發生變化,則dump記憶體快照。
save 300 10   #在300秒(5分鐘)之後,如果至少有10個key發生變化,則dump記憶體快照。
save 60 10000  #在60秒(1分鐘)之後,如果至少有10000個key發生變化,則dump記憶體快照。

AOF

AOF 在Redis的組態檔中存在三種同步方式,它們分別是:

appendfsync always     #每次有資料修改發生時都會寫入AOF檔案,能夠保證資料不丟失,但是效率非常低。 
appendfsync everysec  #每秒鐘同步一次,可能會丟失1s內的資料,但是效率非常高。
appendfsync no          #從不同步。高效但是資料不會被持久化。

直接修改redis.conf中 appendonly yes

建議最好還是使用 everysec 既能夠保證資料的同步、效率也還可以**。AOF是以執行命令的形式實現同步**

兩者區別

到此這篇關於Springboot整合Redis與資料持久化的文章就介紹到這了,更多相關Springboot整合Redis內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com