https://github.com/lumis-githib/Study.git
直接下载实例,自己耍耍学的更来劲!
官网的解释:Redis是一个开放源代码(BSD许可)的内存中数据结构存储,用作数据库,缓存和消息代理。它支持数据结构,例如字符串,哈希,列表,集合,带范围查询的排序集合,位图,超日志,带有半径查询和流的地理空间索引。Redis具有内置的复制,Lua脚本,LRU逐出,事务和不同级别的磁盘持久性,并通过Redis Sentinel和Redis Cluster自动分区提供了高可用性。
第一步、搭建一个web项目,要引用一些必要的包操作数据库的mybatis,redis等,直接贴pom.xml文件吧。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
##第二步
搭建数据库和增删改查功能;也不多说直接看代码吧,我会在最后贴出项目的GitHub地址。需要注意的是我代码中对注解的注释。
package com.zhiyuan.cache.service;
import com.zhiyuan.cache.bean.Employee;
import com.zhiyuan.cache.mapper.EmployeeMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.*;
import org.springframework.stereotype.Service;
import java.sql.SQLOutput;
/**
- @ClassName EmployeeService
- @Description Todo
- @Author ming.lu
- @Date 2020/3/1 18:22
/
@Service
/* - CacheConfig缓存配置,制定缓存块名称。写在类上方法上就不用写了
*/
@CacheConfig(cacheNames=“emp”)
public class EmployeeService {
@Autowired
EmployeeMapper employeeMapper;
/**
* Cacheable:以后有相同的查询不走数据库,直接取自缓存。
* 属性:
* 1、value:制定缓存组,
* 2、key:制定缓存的主键。eg:#id
* 也可以用另外一种表达方式 SPEL .eg:#root.args[0]含义是取自当前参数的第一个参数值
* 3、keyGenerator:主键生成器,可以自己制定key的生成主键id eg:keyGenerator = "myKeyGenerator"
* 4、cacheManager:缓存管理器。在那个缓存管理器取数据。
* 5、cacheResolver:缓存解析器,与管理器二选一,功能类似。
* 6、condition:符合条件才进行缓存。eg:#id>0,,,eg2 :condition = "#id>1 and #root.methodName.equals('getEmployeeById')",
* 7、unless:满足条件就不缓存。可以取结果值判断是否缓存。eg:“#result==null” eg2:unless = "#a0==2"
* @param id
* @return
*/
@Cacheable(key="#id")
public Employee getEmployeeById(Integer id){
System.out.println("查询"+id+"号员工");
return employeeMapper.getEmpById(id);
}
/**
* CachePut:调用方法也缓存数据
* 修改了数据库的某个数据,同时更新缓存。
* 1.调用方法修改
* 2.缓存修改之后的结果
* 指定 key:#result.id
* 也可以用employee.id
* 测试步骤:先查询,然后再更新。
* 先
*/
@CachePut
public Employee updateEmployee(Employee employee){
System.out.println("调用了数据库!");
employeeMapper.updateEmployee(employee);
return employee;
}
/**
* CacheEvict:缓存清空组件,先清空制定缓存,再操作数据库。
* key:制定要清空的id
* allentries=true,删除所有组件。
* beforeInvocation 缓存的清除是在方法执行前还是执行后。默认false 在方法执行前,true是方法执行后。
*
*/
@CacheEvict(key="#id")
public void delEmployeeById(Integer id){
System.out.println("删除"+id+"号员工");
// employeeMapper.deleteEmp(id);
}
/**
* catching是上述三个注解的综合体。
*
*/
@Caching(
cacheable = {
@Cacheable(key="#lastname")
},put = {
@CachePut(key="#result.id"),
@CachePut(key = "#result.email")
}
)
public Employee getEmpByName(String lastname){
System.out.println("查询"+lastname+"号员工");
return employeeMapper.getEmpByName(lastname);
}
}
代码中缓存注解的使用方法讲解:
1、@Cacheable:先走缓存,有相同id直接查询缓存,就不走数据库查询。
属性:
value:制定缓存组。
key:制定缓存的主键。eg:#id
也可以用另外一种表达方式 SPEL .eg:#root.args[0]含义是取自当前参数的第一个参数值。
keyGenerator : 主键生成器,可以自己制定key的生成主键id eg:keyGenerator = “myKeyGenerator”
cacheManager:缓存管理器。在那个缓存管理器取数据。
cacheResolver:缓存解析器,与管理器二选一,功能类似。
condition:符合条件才进行缓存。eg:#id>0,eg2 :condition = “#id>1 and #root.methodName.equals(‘getEmployeeById’)”。
unless:满足条件就不缓存。可以取结果值判断是否缓存。eg:“#resultnull” eg2:unless = "#a02"
2、CachePut : 调用方法也缓存数据,运行机制,先去修改数据库,然后再更新缓存。
key:#result.id,employee.id。
3、CacheEvict:缓存清空组件,先清空制定缓存,再操作数据库。
key:制定要清空的id。
allentries=true,删除所有组件。
beforeInvocation 缓存的清除是在方法执行前还是执行后。默认false 在方法执行前,true是方法执行后。
4、catching是上述三个注解的综合体。
eg:@Caching(
cacheable = {
@Cacheable(key="#lastname")
},put = {
@CachePut(key="#result.id"),
@CachePut(key = “#result.email”)
}
)
例子解释:分别将key等于三个字段的值进行缓存。当key等于lastname,id,email任一值时,都会直接取缓存信息。
##第三步:缓存的开启配置
#链接数据库
spring.datasource.url=jdbc:mysql://192.168.174.131:3306/lumis_test
#数据库用户密码
spring.datasource.username=root
spring.datasource.password=rd.123456
#开启驼峰命名
mybatis.configuration.map-underscore-to-camel-case=true
#开启打印sql语句
logging.level.com.zhiyuan.cache.mapper=debug
#redis数据库地址,端口默认6379,不写了,用户默认root
spring.redis.host=192.168.174.131
spring.redis.password=rd.123456
##第四步:
序列化配置:
@Configuration
public class MyRedisConfig {
@Bean
public RedisTemplate<Object, Employee> employeeredisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
RedisTemplate<Object, Employee> template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
Jackson2JsonRedisSerializer serializer=new Jackson2JsonRedisSerializer(Employee.class);
template.setDefaultSerializer(serializer);
return template;
}
第五步:测试类编写:
//操作对象
@Autowired
RedisTemplate<Object, Employee> employeeRedisTemplate;
@Test
void test01(){
Employee employee=employeeMapper.getEmpById(1);
// stringRedisTemplate.opsForValue().append(“001”,“helloword”);
// System.out.println(stringRedisTemplate.opsForValue().get(“001”));
employeeRedisTemplate.opsForValue().set(“002”,employee);
}
本文介绍了如何搭建Redis实例,并详细讲解了Spring Cache中@Cacheable、@CachePut、@CacheEvict和@Caching等注解的使用方法,包括缓存配置、序列化设置以及测试类的编写。通过示例代码展示了如何在Java项目中集成Redis进行数据缓存。
451

被折叠的 条评论
为什么被折叠?



