В статье вы узнаете, как получить интеграцию с Spring Cache Redis

1. Предварительная настройка

Сначала W создает проект Springboot и вводит зависимости:
Spring Web, Spring cache, redis, Spring Security.

Вставьте описание изображения сюда
Настроить application.properties

spring.redis.host=192.168.176.128
spring.redis.port=6379
#给缓存取一个名字,后面会用到
spring.cache.cache-names=yolo

2. Использование кеша

(1) @CacheConfig

Эта аннотация используется в классе для описания имени кеша, используемого всеми методами в классе. Конечно, нет необходимости использовать эту аннотацию и напрямую настраивать имя для конкретной аннотации кеша. Пример кода выглядит следующим образом:

@Service
@CacheConfig(cacheNames = "yolo")
public class UserService {
    
    
}

Вы можете видеть, что все кэшированные ключи добавят имя:

Вставьте описание изображения сюда

(2) @Cacheable

Эта аннотация обычно добавляется к методу запроса, чтобы указать, что возвращаемое значение метода кэшировано.По умолчанию кэшированный ключ является параметром метода, а кешированное значение - возвращаемым значением метода. Пример кода выглядит следующим образом:

@Cacheable(key = "#id")
public User getUserById(Integer id,String username) {
    
    
    System.out.println("getUserById");
    return getUserFromDBById(id);
}

Когда есть несколько параметров, несколько параметров используются в качестве ключа по умолчанию. Если вам нужен только один из параметров в качестве ключа, вы можете @Cacheableуказать ключ с помощью атрибута key в аннотации. Приведенный выше код означает, что только идентификатор используется в качестве кеша. Key, если у вас сложные требования к ключу, вы можете настроить keyGenerator. Конечно, корневой объект предоставляется в Spring Cache, что позволяет добиться некоторых сложных эффектов без определения keyGenerator:

Вставьте описание изображения сюда
Пример:

@Service
//用来描述该类中所有方法使用的缓存名称
@CacheConfig(cacheNames = "yolo")
public class UserService {
    
    
    //表示将该方法的返回值缓存起来
    @Cacheable
    public User getUserById(Integer id) {
    
    
        System.out.println("getUserById>>>" + id);
        User user = new User();
        user.setId(id);
        return user;
    }
}

Тестовый кеш:

Вставьте описание изображения сюда
Вы можете видеть, что метод был выполнен только один раз, потому что второй вызов не был выполнен, и был использован кешированный результат.

Если параметры, передаваемые вызовом, не совпадают, он будет рассматриваться как два разных вызова:

Вставьте описание изображения сюда
Когда ключ указан, оценка будет производиться в соответствии с разницей ключа. Если ключ будет одинаковым два раза, он будет вызван только один раз:

Хотя здесь несколько параметров, вы можете указать ключ, например, указав id в качестве ключа:
Вставьте описание изображения сюда
вы можете видеть, что, хотя переданные параметры отличаются, он вызывается только один раз:

Вставьте описание изображения сюда

(3) Пользовательский генератор ключей

Если у вас сложные требования к ключу, вы можете настроить keyGenerator
Например, мне нужен ключевой формат:方法名:参数

//自定义 keyGenerator,将返回值当做 key
@Component
public class MyKeyGenerator implements KeyGenerator {
    
    
    @Override
    public Object generate(Object o, Method method, Object... objects) {
    
    
        //可以根据自己的需求返回 key
        return method.getName() + ":" + Arrays.toString(objects);
    }
}

Вставьте описание изображения сюда
Сохраненный ключ:

Вставьте описание изображения сюда

(4) @CacheEvict

Эта аннотация обычно добавляется к методу удаления. Когда данные в базе данных удаляются, соответствующие кэшированные данные также должны автоматически очищаться. Когда аннотация используется, ее также можно настроить для удаления в соответствии с определенными условиями (атрибут условия) или настроить для очистки всех кешей. (Атрибут AllEntries) пример кода выглядит следующим образом:

  @CacheEvict
    public void deleteUserById(Integer id) {
    
    
        System.out.println("deleteUserById>>>" + id);
    }

Вы можете видеть, что второй раз кеш не используется, а вызывается снова:

Вставьте описание изображения сюда

(5) @CachePut

Эта аннотация обычно добавляется к методу обновления. Когда данные в базе данных обновляются, данные в кэше также будут обновлены. Используя эту аннотацию, возвращаемое значение метода может быть автоматически обновлено до существующего ключа. Пример кода выглядит следующим образом:

  @CachePut(key = "#user.id")
    public User updateUserById(User user) {
    
    
        return user;
    }

Вы можете видеть, что он был вызван только один раз, а кеш использовался напрямую во второй раз, но кеш в это время является обновленным кешем.

Вставьте описание изображения сюда

Три, резюме

В Spring Boot, используя кеш Redis, вы можете либо использовать RedisTemplate, чтобы реализовать его самостоятельно, либо вы можете использовать этот метод. Этот метод представляет собой унифицированный интерфейс, предоставляемый Spring Cache. Реализация может быть либо Redis, Ehcache, либо другой поддержкой. Стандартизированная структура кеширования. С этой точки зрения отношения между Spring Cache, Redis и Ehcache аналогичны отношениям между JDBC и различными драйверами баз данных.

См. Видео брата Ю.

рекомендация

отblog.csdn.net/nanhuaibeian/article/details/108470086