一、配置缓存
(1)配置CacheManager的bean,并且设置好EnableCaching的注解
@Configuration
@EnableWebMvc
@EnableCaching
public class RootConfig {
@Bean
public CacheManager cacheManager(){
return new ConcurrentMapCacheManager();
}
@Bean
public DataSource dataSource(){
DriverManagerDataSource ds = new DriverManagerDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/test");
ds.setUsername("root");
ds.setPassword("1");
return ds;
}
@Bean
public JdbcOperations jdbcTemplate(DataSource ds){
return new JdbcTemplate(ds);
}
}
(2)UserRepositoryImpl在方法中加入Cacheable注解(方法调用缓存),CacheEvict注解(方法调用完毕后删除缓存),CachePut注解(方法调用完毕后增加缓存),注意缓存的key必须为同一个数据类型
@Repository
public class UserRepositoryImpl implements UserRepository{
@Autowired
private JdbcOperations jdbcOperations;
public List<User> findAll(){
return jdbcOperations.query("select * from t_user", new RowMapper<User>() {
@Override
public User mapRow(ResultSet resultSet, int i) throws SQLException {
return new User(
resultSet.getInt("userId"),
resultSet.getString("name"),
resultSet.getString("email")
);
}
});
}
@Cacheable(value="mycache",key="#id")
public User get(int id){
System.out.println("repository get");
return jdbcOperations.queryForObject("select * from t_user where userId = ?", new RowMapper<User>() {
@Override
public User mapRow(ResultSet resultSet, int i) throws SQLException {
return new User(
resultSet.getInt("userId"),
resultSet.getString("name"),
resultSet.getString("email")
);
}
},id);
}
@CacheEvict(key="#id",value="mycache")
public void del(int id){
System.out.println("repository del");
jdbcOperations.update("delete from t_user where userId = ?",id);
}
@CachePut(key="#result.userId",value="mycache")
public User add(final User user){
System.out.println("repository add");
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcOperations.update(new PreparedStatementCreator(){
public PreparedStatement createPreparedStatement(Connection conn)
throws SQLException {
PreparedStatement ps = conn.prepareStatement("insert into t_user(name,email)value(?,?)", Statement.RETURN_GENERATED_KEYS) ;
ps.setString(1,user.getName());
ps.setString(2,user.getMail());
return ps ;
}
},keyHolder);
user.setUserId(keyHolder.getKey().intValue());
return user;
}
}
(3)HomeController中测试缓存的使用
@Controller
public class HomeController {
@Autowired
private UserRepository userRepository;
@RequestMapping(value="/",method= RequestMethod.GET)
public String home(){
System.out.println("begin");
userRepository.get(1);
userRepository.get(1);
System.out.println("get finish");
User newUser = userRepository.add(new User(0,"mm3","mm3@qq.com"));
userRepository.get(newUser.getUserId());
System.out.println("add finish");
userRepository.del(1);
userRepository.get(1);
System.out.println("del finish");
return "home";
}
}
(4)注意到了第二次get被缓存了,同时add以后也会走缓存了,而del以后也会强制走缓存了
begin
repository get
get finish
repository add
add finish
repository del
repository get
二、Spring整合Redis缓存
(1)引用spring-data-redis包
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.7.1.RELEASE</version>
</dependency>
(2)配置Redis
@Configuration
public class RedisConfig {
@Bean
public RedisConnectionFactory redisCF() {
JedisConnectionFactory cf = new JedisConnectionFactory();
cf.setHostName("127.0.0.1");//服务器IP
cf.setPort(6379);//端口
cf.setPassword("密码");
return cf;
}
@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory cf) {
RedisTemplate<String, String> redis = new RedisTemplate<String, String>();
redis.setConnectionFactory(cf);
return redis;
}
@Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory cf) {
StringRedisTemplate redis = new StringRedisTemplate();
redis.setConnectionFactory(cf);
return redis;
}
}
(3)测试用例
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = RedisConfig.class)
public class RedisTest {
@Autowired
private StringRedisTemplate r1;
@Test
public void get() {
String foo=DateUtil.getNowTimeString();
r1.opsForValue().set("foo", foo);
foo=r1.opsForValue().get("foo");
System.out.println("【Redis 测试>>>get set】"+foo+"By http://blog.youkuaiyun.com/unix21");
}
}