亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Elasticsearch和MySQL之間的數據同步問題怎么解決

發布時間:2023-04-18 11:09:55 來源:億速云 閱讀:136 作者:iii 欄目:開發技術

這篇文章主要介紹“Elasticsearch和MySQL之間的數據同步問題怎么解決”,在日常操作中,相信很多人在Elasticsearch和MySQL之間的數據同步問題怎么解決問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Elasticsearch和MySQL之間的數據同步問題怎么解決”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

Elasticsearch中的數據是來自于Mysql數據庫的,因此當數據庫中的數據進行增刪改后,Elasticsearch中的數據,索引也必須跟著做出改變。而對于管理服務(MySQL)和搜索服務(Elasticsearch)往往會在不同的微服務上。

可以通過微服務之間的同步調用來解決數據同步問題,雖然實現起來比較簡單,但是在搜索服務中引入管理服務時,業務的耦合度相對來說是比較高的。因此可以通過消息隊列的形式來異步通知管理服務的改變。這樣做的有優點是耦合度較低,但是依賴于消息隊列的耦合度。

首先在兩塊微服務中引入RabbitMQ的依賴:

引入依賴

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

創建常量類,將交換機和隊列名稱設置為常量,使用時方便取名。

public class MqConstants {
    /**
     * 交換機名稱
     */
    public final static String HOTEL_EXCHANGE = "hotel.topic";
    /**
     * 監聽新增和修改的隊列
     */
    public final static String HOTEL_INSERT_QUEUE = "hotel.insert.queue";
    /**
     * 監聽刪除的隊列
     */
    public final static String HOTEL_DELETE_QUEUE = "hotel.delete.queue";
    /**
     * 新增或修改的路由鍵
     */
    public final static String HOTEL_INSERT_KEY = "hotel.insert";
    /**
     * 刪除的路由鍵
     */
    public final static String HOTEL_DELETE_KEY = "hotel.delete";
}

創建配置類,聲明交換機,并將路由鍵,隊列與交換機之間互相綁定:

@Configuration
public class MqConfig {

    @Bean
    public TopicExchange topicExchange(){
        return new TopicExchange(MqConstants.HOTEL_EXCHANGE,true,false);
    }

    @Bean
    public Queue insertQueue(){
        return new Queue(MqConstants.HOTEL_INSERT_QUEUE,true);
    }

    @Bean
    public Queue deleteQueue(){
        return new Queue(MqConstants.HOTEL_DELETE_QUEUE,true);
    }

    @Bean
    public Binding insertQueueBinding(){
        return BindingBuilder.bind(insertQueue()).to(topicExchange()).with(MqConstants.HOTEL_INSERT_KEY);
    }

    @Bean
    public Binding deleteQueueBinding(){
        return BindingBuilder.bind(deleteQueue()).to(topicExchange()).with(MqConstants.HOTEL_DELETE_KEY);
    }
}

編寫controller層,將酒店數據保存到數據庫中,并將消息發送到消息隊列里:

    @Autowired
    private IHotelService hotelService;
    @Autowired
    private RabbitTemplate rabbitTemplate;
    @PutMapping
    public void save(@RequestBody Hotel hotel){
        hotelService.save(hotel);
        rabbitTemplate.convertAndSend(MqConstants.HOTEL_EXCHANGE,MqConstants.HOTEL_INSERT_KEY,hotel.getId());
    }
    @DeleteMapping("/{id}")
    public void deleteById(@PathVariable("id") Long id){
        hotelService.removeById(id);
        rabbitTemplate.convertAndSend(MqConstants.HOTEL_EXCHANGE,MqConstants.HOTEL_DELETE_KEY,id);
    }

在service中加入兩個方法,根據id增加和根據id刪除:

    void insertById(Long id);
    void deleteById(Long id);

利用Ctrl+Alt+B的快捷鍵,在service的實現類里面重寫方法進行實現:

    @Override
    public void insertById(Long id) {
        try {
            Hotel hotel = getById(id);
            HotelDoc hotelDoc = new HotelDoc(hotel);
            // 1.準備Request
            IndexRequest request = new IndexRequest("hotel").id(hotelDoc.getId().toString());
            // 2.準備請求參數DSL,其實就是文檔的JSON字符串
            request.source(JSON.toJSONString(hotelDoc), XContentType.JSON);
            // 3.發送請求
            client.index(request, RequestOptions.DEFAULT);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public void deleteById(Long id) {
        try {
            DeleteRequest request = new DeleteRequest("hotel", id.toString());
            // 2.發送請求
            client.delete(request, RequestOptions.DEFAULT);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

這樣即可完成Elasticsearch和MySQL之間的數據同步。

到此,關于“Elasticsearch和MySQL之間的數據同步問題怎么解決”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

罗定市| 合阳县| 灵山县| 达日县| 天门市| 登封市| 昔阳县| 南和县| 建昌县| 鹤峰县| 嘉峪关市| 新沂市| 合山市| 甘谷县| 都安| 昌吉市| 东城区| 枝江市| 哈密市| 高尔夫| 襄汾县| 隆德县| 崇信县| 瑞丽市| 苍梧县| 如东县| 安塞县| 乳山市| 新民市| 托里县| 尉氏县| 江源县| 府谷县| 阿拉善左旗| 东光县| 嘉禾县| 资阳市| 肥西县| 和田市| 颍上县| 政和县|