春Boot2.xキャッシュ+は、統合をRedisの

A、JSR107

Javaのキャッシュは5つのコア・インタフェースを定義します。

  • CachingProviderは、アプリケーションが実行時に複数のCachingProviderにアクセスすることができ、より何CacheingManageer、作成、設定、取得、管理制御を定義します。
  • CachingManagerは、より多くのユニークなキャッシュの名前のものを作成、設定、取得、管理制御を定義し、キャッシュはこのコンテキストのCacheManagerに存在する書き込み、1のCacheManagerだけのcacheProviderが所有していました。
  • キャッシュは、地図と同様のデータ構造であり、一時的にインデックスキーがないの値を格納し、キャッシュが唯一のCacheManagerを持っています
  • エントリは、キャッシュのそれぞれに格納されたキーと値のペアです。
  • 有効期限キャッシュエントリのそれぞれに格納されているが、定義された期間を持って、この時間の経過後、状態エントリは有効期限が切れていません。期限切れの、エントリー生姜アクセスできない、更新、および削除すると。キャッシュはExpiryPolicyまで有効です。

第二に、コメントキャッシュ

キャッシュ RedisCache、EhCacheCahe、ConcurrentMapCache:キャッシュ・インタフェース、定義されたキャッシュ操作がで実装されています
CacheManager キャッシュマネージャは、キャッシュ(キャッシュ)のアセンブリを管理します
@Cacheable 構成のための主な方法は、そのキャッシュ要求パラメータ方法の結果に応じて可能です
@CacheEvict キャッシュを空に
@CachePut メソッドが呼び出され、希望の結果がキャッシュされていることを確認
@EnableCaching オープン注釈ベースのキャッシング
KeyGenerator コメントは、鍵生成戦略をキャッシュする場合
シリアライズ キャッシュデータ値際に直列化戦略

1、@キャッシング可能

  1. cacheNames / :名前を指定しますキャッシュコンポーネント、方法はキャッシュに結果を返します配列である、あなたは複数のキャッシュを指定することができます
  2. キー:キーを使用するデータをキャッシュする、それが指定することができ、デフォルトでは、パラメータの値を使用することです

例えば:1-方法はSPEL式を使用することができる値は#ID戻り、パラメータ値id#A0#P0#root.args [0]

  1. するKeyGenerator:鍵生成、鍵は自分ジェネレータコンポーネントIDキー/するKeyGeneratorを指定することができる:第二選挙を使用して
  2. CacheManager / cacheResolver:指定キャッシュマネージャ;またはパーサがcacheResolverを指定するために使用され得ます
  3. 条件条件のために指定された適格キャッシュのみの場合:
  4. しない限り、:ネガティブキャッシュ、条件が真のときに指定しない限り、戻り値はキャッシュされません、決意の結果を得ることができます
  5. 同期:非同期モードを使用するかどうか

実行中のプロセス:

@ キャッシング可能

  1. 最初に自動的に作成されたキャッシュCacheコンポーネントを取得していない場合はメソッドを実行する前に、クエリキャッシュ(キャッシュ・コンポーネント)、指定した名前のcacheNamesに従って取得し、(CacheManagerzは最初の対応するキャッシュを得る)にアクセスしてください

  2. キャッシュコンテンツにキャッシュを見つけ、キーを使用し、特定の戦略に従って、デフォルトのメソッドのパラメータは、キーが生成され、デフォルトはするKeyGeneratorの生成に使用することで、

  3. ターゲットメソッドと呼ばれているキャッシュにありません

  4. 結果はキャッシュに、ターゲットメソッドによって返さ

SpringEL式:

名前 場所 説明
methodNameの ルートオブジェクト 現在の方法は、名前と呼ばれています #root.methodName
方法 ルートオブジェクト 現在のメソッドが呼び出されます #root.method.name
目標 ルートオブジェクト 現在のターゲットオブジェクトが呼び出されています #root.target
targetClass ルートオブジェクト 現在のターゲット・オブジェクト・クラスが呼び出されます #root.targetClass
引数 ルートオブジェクト パラメータリストは、現在の法と呼ばれています #root.args [0]
キャッシュ ルートオブジェクト 現在の方法は、キャッシュリスト(例えば@Cacheable(値= {「cache1」、「cache2を」}))を起動するために使用される、2つのキャッシュがあります #root.caches [0] .nameの
引数名 評価コンテキスト nameパラメータはまた、P0形態直接#メソッドパラメータ名であってもよく、または## A0を使用することができ、0は、インデックスパラメータを表します。 #iban、#A0、#P0
結果 評価コンテキスト メソッドの実行後に戻り値(例えば、「ない限り」、「キャッシュPUT」式「キャッシュ追い出し」発現beforeInvocation =偽としてのみ有効な方法の実施後決意) #結果
@Cacheable(cacheNames = {"emp"}/*, keyGenerator = "myKeyGenerator"*/)
public Employee getEmp(Integer id){
    System.out.println("查询"+id+"号员工");
    Employee emp = employeeMapper.getEmpById(id);
    return emp;
}

2、@ CachePut

実行タイミング:

図1に示すように、ターゲットメソッドの最初の呼び出し

図2に示すように、キャッシュされた結果のターゲット方法

/**
     * @Description: 既调用方法,又更新缓存
     * 先调用方法,然后将结果进行缓存
     * key = "#employee.id"
     * key = "#result.id" 返回值的id
     * 更新和查询用的key必须一致
     */
@CachePut(value = "emp",/*key = "#employee.id"*/key = "#result.id")
public Employee updateEmp(Employee employee){
    employeeMapper.updateEmp(employee);
    return employee;
}

3 @ C​​acheEvict

キャッシュをクリアし、指定したキーを削除することができます

//allEntries:默认为false,为true时,指定清楚这个缓存中所有的数据
//beforeInvocation:缓存的清除是否在方法之前执行

/**
* @Description:@CacheEvict清除缓存
*/
@CacheEvict(value = "emp",key = "#id")
public void deleteEmp(Integer id){
employeeMapper.deleteEmpById(id);
}

4. @キャッシング

包含上面三个注解,适合复杂规则使用
public @interface Caching {
    Cacheable[] cacheable() default {};

    CachePut[] put() default {};

    CacheEvict[] evict() default {};
} 

例如:
    //复杂规则使用
    @Caching(
            cacheable = {
                    @Cacheable(value = "emp",key = "#lastName")
            },
            put = {
                    @CachePut(value = "emp",key = "#result.id"),
                    @CachePut(value = "emp",key = "#result.email")
            }
    )
    public Employee getEmpByLastName(String lastName){
        return employeeMapper.getEmpByLastName(lastName);
    }

5 @ CacheConfig

指定公共属性
@CacheConfig(cacheNames = "emp")
@Service
 public class EmployeeService {

指定されたキーコンポーネントビルダ:

@Bean("myKeyGenerator")
    public KeyGenerator keyGenerator(){
        return new KeyGenerator(){
            @Override
            public Object generate(Object o, Method method, Object... objects) {
                return method.getName()+"["+ Arrays.asList(objects).toString()+"]";
            }
        };
    }s

第三に、バッファ集積Redisのよう

追加するのpom.xmlファイル:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>2.1.5.RELEASE</version>
</dependency>
  1. スタータのRedisの導入、貯蔵容器はRedisCacheManagerあります
  2. RedisCacheを作成するための緩衝成分としてRedisCacheManager
  3. Kvは、データオブジェクトの保存デフォルトで、使用のシリアル化を保存します
@SpringBootTest
class Springboot01CacheApplicationTests {

    @Autowired
    EmployeeMapper employeeMapper;

    @Autowired
    StringRedisTemplate stringRedisTemplate;

    @Autowired
    RedisTemplate redisTemplate;

    @Autowired
    RedisTemplate<Object,Employee> employeeRedisTemplate;

    /*
     *Redis常见五种数据类型: String、List、Set、Hash(散列)、ZSet(有序集合)
     *stringRedisTemplate.opsForValue()操作String;
     *stringRedisTemplate.opsForList()操作List;
     * stringRedisTemplate.opsForSet()操作Set;
     * stringRedisTemplate.opsForHash()操作Hash;
     * stringRedisTemplate.opsForZSet()操作Zset;
     */
    @Test
    public void test01(){
//        stringRedisTemplate.opsForValue().append("msg","hello");
        stringRedisTemplate.opsForList().leftPush("myList","1");
        stringRedisTemplate.opsForList().leftPush("myList","2");
        String msg = stringRedisTemplate.opsForValue().get("msg");
        System.out.println("msg = " + msg);
//        stringRedisTemplate.opsForList();
//        stringRedisTemplate.opsForSet();
//        stringRedisTemplate.opsForHash();
//        stringRedisTemplate.opsForZSet();
//        System.out.println("=========");
    }

    @Test
    public void test02(){
        Employee emp = employeeMapper.getEmpById(1);
        employeeRedisTemplate.opsForValue().set("emp-01",emp);
    }

    @Test
    void contextLoads() {
        Employee emp = employeeMapper.getEmpById(1);
    }
}

JSONにシリアライズカスタムのCacheManager

@Bean
public CacheManager cacheManager(RedisConnectionFactory factory){
    RedisSerializer<String> redisSerializer = new StringRedisSerializer();
    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);

    RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig()
        .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer));
    RedisCacheManager build = RedisCacheManager.builder(factory).cacheDefaults(configuration).build();
    return build;
}

キャッシュと追加のキャッシュを取得します。

@Autowired
CacheManager cacheManager;

@Cacheable(cacheNames = "dept")
public Department getDeptById(Integer id){
    System.out.println("查询部门" + id);
    Department dept = departmentMapper.getDeptByid(id);
    Cache dept1 = cacheManager.getCache("dept");
    dept1.put("dept1",dept);
    return dept;
}
公開された26元の記事 ウォン称賛27 ビュー6859

おすすめ

転載: blog.csdn.net/qq_40705355/article/details/103632772