キャッシュとデータベースの一貫性のデュアル書き込み保護を実装

ポックスファイル:

<親> 
        <groupIdを> org.springframework.boot </ groupIdを> 
        <たartifactId>春・ブート・スターター・親</たartifactId> 
        <バージョン> 1.2.5.RELEASE </バージョン> 
    </親> 

    <プロパティ> 
        <プロジェクト.build.sourceEncoding> UTF-8 </project.build.sourceEncoding> 
        <のjava.version> 1.8 </java.version> 
    </プロパティ> 

    <依存性> 
        <依存性> 
            <のgroupId> org.springframework.boot </のgroupId> 
            <たartifactId>春・ブート・スターター・ウェブ</たartifactId> 
        </依存関係> 
        <依存>  
            <groupId> org.springframework.boot </ groupIdを>
            <たartifactId>ばねブートスタータthymeleaf </たartifactId> 
        </依存>
        <依存性> 
            <のgroupId> org.springframework.boot </のgroupId> 
            <たartifactId>ばねブートスタータJDBC </たartifactId> 
        </依存> 
        <依存性> 
            <のgroupId> org.springframework.boot </のgroupId> 
            <たartifactId >スプリングブートスタータアクチュエータ</たartifactId> 
        </依存> 
        <依存性> 
            <のgroupId> org.mybatis </のgroupId> 
            <たartifactId> MyBatisのスプリング</たartifactId> 
            <バージョン> 1.2.2 </バージョン> 
        < /依存関係> 
        <依存>  
            <groupIdを> org.mybatis </ groupIdを>
            <たartifactId> MyBatisの</たartifactId> 
            <バージョン> 3.2.8 </バージョン> 
        </依存関係> 
        <依存性> 
            <のgroupId> org.apache.tomcat </のgroupId> 
            <たartifactId> Tomcatの-JDBC </たartifactId> 
        </依存> 
        <依存性> 
            <groupIdを>のMySQL </のgroupId> 
            <たartifactId > MySQLのコネクタ-javaの</たartifactId> 
        </依存関係> 
        <依存> 
            <groupIdを> com.alibaba </ groupIdを> 
            <たartifactId> fastjson </たartifactId> 
            <バージョン> 1.1.43 </バージョン> 
        </依存関係> 
    < /依存関係> 

    <構築>
        <プラグイン> 
            <プラグイン> 
                <groupIdを>org.springframework.boot </ groupIdを> 
                <たartifactId>春・ブートのmaven-pluginの</たartifactId>
            </プラグイン> 
        </プラグイン> 
    </ビルド> 

    <リポジトリ> 
        <リポジトリ> 
            <ID>ばねマイルストーン</ ID> 
            <URL> https://repo.spring.io/libs-release </ URL> 
        </リポジトリ> 
    </リポジトリ> 

    <pluginRepositories> 
        <pluginRepository> 
            <ID>ばねマイルストーン</ ID> 
            <URL> https://repo.spring.io/libs-release </ URL> 
        </ pluginRepository> 
    </ pluginRepositories>

  応用:

輸入はjava.util.HashSet。
輸入java.util.Set; 
輸入org.apache.ibatis.session.SqlSessionFactory; 
輸入org.apache.tomcat.jdbc.pool.DataSource。
輸入org.mybatis.spring.SqlSessionFactoryBean。
輸入org.mybatis.spring.annotation.MapperScan; 
輸入org.springframework.boot.SpringApplication。
輸入org.springframework.boot.autoconfigure.EnableAutoConfiguration。
輸入org.springframework.boot.autoconfigure.SpringBootApplication。
輸入org.springframework.boot.context.embedded.ServletListenerRegistrationBean。
輸入org.springframework.boot.context.properties.ConfigurationProperties。
輸入org.springframework.context.annotation.Bean。
輸入org.springframework.context.annotation.ComponentScan; 
インポートorg.springframework.core.io.support.PathMatchingResourcePatternResolver; 
インポートorg.springframework.jdbc.datasource.DataSourceTransactionManager; 
インポートorg.springframework.transaction.PlatformTransactionManager; 
インポートcom.roncoo.eshop .inventory.listener.InitListener; 
インポートredis.clients.jedis.HostAndPort; 
インポートredis.clients.jedis.JedisCluster、

自動的@EnableAutoConfiguration //ビーンは、必要なすべてのアプリケーションのロード
クラス@SpringBootApplicationが//開始
// @ComponentScanパッケージスキャン
@MapperScan(「com.roncoo.eshop.inventory.mapper」)を
エントリ関数開始// 
パブリッククラスアプリケーション{ 
 
	//データソースを構築
    @Bean
    @ConfigurationProperties(接頭辞= "spring.datasource")  
    @Bean 
    公共データソースデータソース(){
        新しいデータソースを返します(); 
    } 

     //构建MyBatisの的入口类:SqlSessionFactory 
    @Bean 
    公共SqlSessionFactory sqlSessionFactoryBean1()が例外をスロー{ 
        SqlSessionFactoryBean sqlSessionFactoryBean =新しいSqlSessionFactoryBean()。
        sqlSessionFactoryBean.setDataSource(データソース())。
        PathMatchingResourcePatternResolverレゾルバ=新しいPathMatchingResourcePatternResolver()。
        sqlSessionFactoryBean.setMapperLocations(resolver.getResources( "クラスパス:/ MyBatisの/ * XML")); 
        
        sqlSessionFactoryBean.getObjectを返します(); 
    } 
    //构建事务管理器
    公共PlatformTransactionManagerのTransactionManager(){
        新しいDataSourceTransactionManagerを返す(データソース()); 
    } 
    
    @Bean 
	公共JedisCluster JedisClusterFactory(){ 
		セット<HostAndPort> jedisClusterNodes =新しいHashSetの<HostAndPort>(); 
		jedisClusterNodes.add(新HostAndPort( "192.168.31.19"、7003)); 
		jedisClusterNodes.add(新HostAndPort( "192.168.31.19"、7004)); 
		jedisClusterNodes.add(新HostAndPort( "192.168.31.227"、7006)); 
		JedisCluster jedisCluster =新しいJedisCluster(jedisClusterNodes)。
		jedisClusterを返します。
	} 

    //注册监听器线程池+内存队列初始化
    @SuppressWarnings({ "rawtypes"、 "未チェック"})
    パブリックServletListenerRegistrationBean servletListenerRegistrationBean(){ 
    	ServletListenerRegistrationBean servletListenerRegistrationBean = 
    			新しいServletListenerRegistrationBean()。
    	//添加リスナー
    	servletListenerRegistrationBean.setListener(新しいInitListener()); 
    	servletListenerRegistrationBeanを返します。
    } 
    
    // SpringBoot启动入口的方法
    のpublic static無効メイン(文字列[] args){ 
        SpringApplication.run(Application.class、引数)。
    } 
}

  

JVMの内部キューに送信された固有の識別データ、動作後の経路に基づいて、データを更新する場合

データの読み出し時に、データがキャッシュ内に見つからない場合、キャッシュ+操作を更新するために、再度データを読み込み、ルートに従い、一意に識別した後、また同じ内部キューJVMを送信

キューは、ワーカースレッドに対応します

各ワーカースレッドが対応するシリアル操作を取得した後、いずれかを実行するには

この場合、運転データの変更、実行し、キャッシュを削除し、データベースを更新するために行くが、まだ完全な更新ではありません

空のキャッシュ上のリード要求が読めば、この時点で、最初のキャッシュキューを更新するための要求を送信してもよいし、キュー内のバックログになり、その後、完全同期キャッシュの更新を待ちます

最適化のポイントがあり、キュー、実際には、キューがキャッシュを更新するための要求を持っていることが判明している場合は、フィルタリングを行うことができますので、意味がありませんつなげつ以上の更新キャッシュ要求、
その後、要求された操作を再度要求された操作を完了するために、更新を待っているの正面に行く生きてきた更新されません。

アクションを実行するための意志で1つのオペレーションのデータベース・スレッドを修正するために行われるべき仕事を、対応するそのキューの後、それは、キャッシュの更新操作では、データベースから最新の値を読み込み、書き込みキャッシュ

要求が時間範囲を待っている場合は、見つかった値をとることができ、ポーリングを継続するために、その後、直接返し、待機時間が時間要求の一定の長さを超えている場合、この時間は、現在の古い値は、データベースから直接読み取ります
 
具体的な実装手順:
1、スレッドプール+メモリキューの初期化
、リスナーを行うのServletContextListenerには、初期化し、全体のWebアプリケーションと一緒に始めると類似構築するためにスレッドプールを初期化します
春のブートアプリケーション、アプリケーション、リスナーの登録に係合
 

おすすめ

転載: www.cnblogs.com/sunliyuan/p/11354531.html