Uso del proyecto SpringBoot en la caché antes de introducir primero la abstracción caché primavera y JSR107, este es mi blog en Silicon Valley vídeo y notas que aún están aprendiendo efectuarse previa consulta de otro blog, sólo para enterarse de referencia
@
- Un caché primavera abstracción
- Dos, JSR107
- Tres, uso de la caché de Primavera
- En cuarto lugar, la memoria caché integrada Redis
Un caché primavera abstracción
1.1 Caché definición abstracta
Versión 3.1 define la primavera org.springframework.cache.Cache
interfaces y org.springframework.cache.CacheManager para unificar diferentes tecnologías de almacenamiento en caché, y apoyan el uso de Java Caché (JSR-107) anotaciones para simplificar el desarrollo de nuestra memoria caché. Primavera caché sólo es responsable del mantenimiento de la capa de abstracción, la implementación específica está determinado por su selección de tecnología. Las técnicas de caché y caché acoplado.
1.2, interfaces importantes
- Cache: caché interfaces de especificación abstracta, las implementaciones de caché tienen: RedisCache, EhCacheCache, ConcurrentMapCache etc.
- CacheManager: Administrador de caché, la gestión del ciclo de vida de la caché
Dos, JSR107
2.1, la interfaz JSR107 núcleo
Java almacenamiento en caché (JSR-107) define una interfaz de núcleo 5, respectivamente CachingProvider, CacheManager, Cache, la entrada y de expiración.
- CachingProvider: crear, configurar, adquirir, gestionar y controlar múltiples CacheManager
- CacheManager: crear, configurar, adquirir, administrar y control múltiple de un nombre único de caché, caché existe en el contexto de CacheManager. A CacheManager corresponde a solamente un CachingProvider
- Cache: CacheManager es administrado, la gestión del ciclo de vida CacheManager caché, en el marco de la presente CacheManager caché, la estructura de datos es un mapa similar a, y se almacena temporalmente como el valor de la clave de índice. Caché es una propiedad única de un CacheManager
- Entrada: caché es una memoria en los pares de valores clave
- Caducidad: Cada entrada se almacena en la caché tiene un período definido. Una vez pasado este tiempo, la entrada caducará automáticamente, expirado, las entradas no tienen acceso, actualizar y operaciones de borrado. duración de la caché puede ser establecido por ExpiryPolicy
2,2, JSR107 ilustra
Silicon Valley icono sigue citando cursos de vídeo:
Tres, uso de la caché de Primavera
3.1 Notas importantes Introducción
Antes de ejemplos de buenas prácticas, explique brevemente la anotación caché importante proporcionada por la primavera
- @Cacheable: Método para la configuración, es posible de acuerdo con los resultados de su método de parámetro de petición de memoria caché
- @CacheEvict: Vaciar caché
- @CachePut: tanto la llamada a métodos, y actualizar los datos de la caché
- @EnableCaching: abierta caché basado en anotación
- @Caching: definir reglas de caché complejos
3.2 listo Ambiental
bien, este blog es todavía ejemplos de vídeo de Silicon Valley que ser reescritos, con el ejemplo más clásico de esto se describe
Preparación del entorno:
- experta en medio ambiente
- IntelliJ IDEA
nueva construcción de dos tablas:
DROP TABLE IF EXISTS `employee`;
CREATE TABLE `employee` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`lastName` varchar(255) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`gender` int(2) DEFAULT NULL,
`d_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `department`;
CREATE TABLE `department` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`departmentName` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
3.3, la introducción del módulo de resorte de arranque-motor de arranque-cache
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
3,4, los principales ejemplos de notas prácticas
3.4.1, @ EnableCaching
@EnableCaching abierta caché basado en anotación
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
@SpringBootApplication
@EnableCaching
public class SpringbootCacheApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootCacheApplication.class, args);
}
}
3.4.2, @ cacheable comentario
anotaciones papel @Cacheable, también en frente de la introducción, principalmente para el método de configuración, sus resultados pueden almacenar en caché en el método de solicitud de parámetros, nos dicen acerca de los principales atributos de anotación
- cacheNames / Valor: Especifica el componente de caché de nombres, una matriz
- clave: datos de la caché utilizando la tecla, para determinar la caché se pueden especificar con una clave única; por ejemplo: escribir SpEL; (y el mismo sentido de a0) #id, el valor de parámetro id ,, # a0 (el primer argumento), # p0 , root.args # [0]
- keygenerator: generador de claves; puede especificar el componente clave de su generador de Identificación (Nota: Esta tecla / keygenerator: Elija uno de los usos; no se puede utilizar)
- cacheManager: especifica el Administrador de caché; o cacheResolver designado obtener un analizador
- condición: el caso en el que sólo los criterios de coincidencia de la caché; utilizan expresiones Spel, por ejemplo: estado = "# a0> 1": valor del primer parámetro de> 1 sólo cuando la memoria caché
- a menos que: Negativo caché; salvo que se especifique cuando la condición es verdadera, el valor de retorno no se almacena en caché; por ejemplo: a menos = "# a0 = 2!": Si el primer valor de parámetro no es 2, el resultado no se almacena en caché;
- sync: si se debe utilizar el modo asíncrono
@Cacheable(value = {"emp"}, /*keyGenerator = "myKeyGenerator",*/key = "#id",condition = "#a0>=1",unless = "#a0!=2")
public Employee getEmp(Integer id) {
Employee employee = this.employeeMapper.getEmpById(id);
LOG.info("查询{}号员工数据",id);
return employee;
}
Se utiliza en el presente documento pueden ser keygenerator personalizada, utilizando la propiedad keygenerator = "myKeyGenerator
@Bean definir una clase, para agregar primavera KeyGenerator contenedor
@Configuration
public class CacheConfig {
@Bean(value = {"myKeyGenerator"})
public KeyGenerator keyGenerator(){
return new KeyGenerator() {
@Override
public Object generate(Object target, Method method, Object... params) {
return method.getName()+"["+ Arrays.asList(params).toString()+"]";
}
};
}
}
3.4.3, @ comentario CachePut
@CachePut comentario es un comentario para que el caché, pero el caché y @Cacheable tienen diferencia obvia es que está llamando el método, y actualizar los datos de la caché, es decir, después de realizar el método de operación de sincronización de actualización de la memoria caché de nuevo, por lo que la clave primaria utilizada para operaciones de actualización, sino también se puede utilizar para consulta, el atributo clave primaria y @Cacheable hay muchos detalles similares, se refieren fuente @CachePut @link
/**
* @CachePut:既调用方法,又更新缓存数据;同步更新缓存
* 修改了数据,同时更新缓存
*/
@CachePut(value = {"emp"}, key = "#result.id")
public Employee updateEmp(Employee employee){
employeeMapper.updateEmp(employee);
LOG.info("更新{}号员工数据",employee.getId());
return employee;
}
3.4.4, comentario @CacheEvic
Los principales atributos:
- clave: especifica los datos a ser desalojado
- allEntries = true: borrar todos los datos especificados en la presente memoria caché
- beforeInvocation = false: default en nombre de operación de la memoria caché de compensación se lleva a cabo después de que el método de ejecución
- beforeInvocation = true: Borrar la caché en la operación de nombre se realiza antes de que el método run
@CacheEvict(value = {"emp"}, beforeInvocation = true,key="#id")
public void deleteEmp(Integer id){
employeeMapper.deleteEmpById(id);
//int i = 10/0;
}
3.4.5, @ almacenamiento en caché comentario
@Caching de reglas de caché de encargo complejas, y pueden ser integrados @Cacheable @CachePut
// @Caching 定义复杂的缓存规则
@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);
}
3.4.6, comentario @CacheConfig
Las anotaciones pueden ser utilizados para extraer @CacheConfig caché de configuración común, entonces la adición de la clase puede, por ejemplo:@CacheConfig(cacheNames = {"emp"},cacheManager = "employeeCacheManager")
Apéndice ampliar: el uso de la expresión SpEL
SpEL caché de metadatos disponibles
nombre | ubicación | descripción | Ejemplos |
---|---|---|---|
methodName | el objeto raíz | El método actual se llama nombre | # root.methodname |
método | el objeto raíz | El método actual se llama | # root.method.name |
objetivo | el objeto raíz | El objeto de destino actual se llama una instancia | # root.target |
targetClass | el objeto raíz | La clase actual se llama el objeto de destino | # root.targetClass |
args | el objeto raíz | Lista de parámetros se llama el método actual | # root.args [0] |
cachés | el objeto raíz | Las llamadas a los métodos actuales de uso de la lista de caché | # Root.caches [0] .name |
Nombre argumento | contexto de ejecución (contexto dedicadas a la evaluación) | Parámetros del método se llama una corriente, tal como findArtisan (Artisan artesano), los parámetros se pueden obtener por artsian.id # | # artsian.id |
resultado | contexto de ejecución (contexto de evaluación) | El valor de retorno después de la ejecución del método (único método eficaz para realizar la determinación, a menos cacheEvict como el beforeInvocation = FALSE) | #resultado |
En cuarto lugar, la memoria caché integrada Redis
4.1 listo Ambiental
Basado en el medio ambiente caché primavera anterior, para introducir la configuración redis integrado:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
el modo de caché se conmuta Redis:spring.cache.type=redis
4.2, implementos clase de configuración Redis
Configuración RedisTemplate
@Resource
private LettuceConnectionFactory lettuceConnectionFactory;
@Bean
@Primary
public RedisTemplate<Object,Object> redisTemplate(){
RedisTemplate<Object,Object> redisTemplate = new RedisTemplate<Object, Object>();
redisTemplate.setConnectionFactory(lettuceConnectionFactory);
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = this.initJacksonSerializer();
// 设置value的序列化规则和 key的序列化规则
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
código de referencia relacionado puede RedisCacheManager Bowen, el blogger ha hecho un paquete de código buena, así que esto no es código duplicado
4.3, las operaciones relacionadas RestTemplate
Redis operación Uso RestTemplate
- 1, redisTemplate.opsForValue (); // operaciones de Cuerda
- 2, redisTemplate.opsForHash (); // 操作 de hash
- 3, redisTemplate.opsForList (); // lista 操作
- 4, redisTemplate.opsForSet (); // 操作 conjunto
- 5, redisTemplate.opsForZSet (); // operaciones en el conjunto ordenado
4.4, la prueba de servicio de caché
@Autowired
DepartmentMapper departmentMapper;
@Qualifier("redisCacheManager")
@Autowired
RedisCacheManager redisCacheManager;
// @Cacheable(cacheNames = "dept",cacheManager = "redisCacheManager")
// public Department getDeptById(Integer id){
// System.out.println("查询部门"+id);
// Department department = departmentMapper.getDeptById(id);
// return department;
// }
// 使用缓存管理器得到缓存,进行api调用
public Department getDeptById(Integer id){
LOG.info("查询id为{}的员工信息",id);
//获取某个缓存
Cache deptCache = redisCacheManager.getCache("dept");
Department department = null;
if(deptCache.get(id)==null){
department = departmentMapper.getDeptById(id);
deptCache.put(id,department);
} else {
SimpleValueWrapper valueWrapper = (SimpleValueWrapper) deptCache.get(id);
department = (Department)valueWrapper.get();
}
return department;
}
Por supuesto, el uso de la anterior caché primaria primavera clave también son posibles,
con referencia a Bowen:
Cache Cache operación de combate capa de abstracción de la primavera
Descargar ejemplos de código: enlace GitHub