本示例描述了使用Redis构建二级缓存的基本流程,是Hello World级别工程,非生产级别代码。
Redis官方不建议在Windows下使用。本机Windows环境测试请到https://github.com/MSOpenTech/redis/releases下载。
解压,到解压目录运行Redis实例:
redis-server.exe redis.windows.conf
其中redis.windows.conf是配置文件。
在另一个cmd.exe运行:
redis-cli.exe -h localhost -p 6379
随便设置一个key,读取试一下。
参照[实习笔记]6.15第一个SpringBoot项目(http://ks.netease.com/blog?id=7828)的步骤新建工程。pom.xml中加入以下配置:
<!-- spring-redis -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring->
<version>1.8.4.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
application.properties文件中配置Redis数据源:
spring.redis.database=1
spring.redis.host=localhost
#spring.redis.password=
spring.redis.port=6379
spring.redis.pool.max-idle=8
spring.redis.pool.min-idle=0
spring.redis.pool.max-active=8
spring.redis.pool.max-wait=-1
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
/**
* 自定义key生成器
*
* @return
*/
@Override
@Bean
public KeyGenerator keyGenerator() {
return new KeyGenerator() {
@Override
public Object generate(Object o, Method method, Object... objects) {
StringBuilder sb = new StringBuilder();
sb.append(o.getClass().getName());
sb.append(method.getName());
for (Object obj : objects) {
sb.append(obj.toString());
}
return sb.toString();
}
};
}
/**
* 配置映射
*
* @param factory
* @return
*/
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
StringRedisTemplate template = new StringRedisTemplate(factory);
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);
template.setDefaultSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
如果缓存命中,则无需执行方法体。打印一句话用以标记。
@Service("userService")
public class UserService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Cacheable(value = "userCache")
public String getUser(String id) {
System.out.println("从数据库获取!!!!!!!!!!!!!!!!!!!!!!!!!!");
String sql = "select id,username from user where id=?";
RowMapper<User> rowMapper = new BeanPropertyRowMapper<>(User.class);
User user = jdbcTemplate.queryForObject(sql, rowMapper, id);
return user.toString();
}
}
Controller配置:
@Controller
public class SampleController {
@Resource
private UserService userService;
@RequestMapping("/")
@ResponseBody
public String home() {
return "Hello World";
}
@RequestMapping("/getUser/{id}")
@ResponseBody
public String getUser(@PathVariable String id) {
return userService.getUser(id);
}
}
程序入口配置:
@EnableAutoConfiguration
@ComponentScan(basePackages = "per.gzc.test")
public class AppStarter {
public static void main(String[] args) {
SpringApplication.run(AppStarter.class);
}
}
启动工程,url中输入http://localhost:8080/getUser/1,获取到User信息:
此时查看输出标记语句,执行了数据库查询:
换一个浏览器访问http://localhost:8080/getUser/1:
此时没有发现标记语句输出。
查看Redis数据库,发现对应键:
网易云新用户大礼包:https://www.163yun.com/gift
本文来自网易实践者社区,经作者葛志诚授权发布。