Spring实战4之缓存篇
来源:互联网 发布:java什么叫缺省 编辑:程序博客网 时间:2024/05/16 06:22
一、配置缓存
(1)配置CacheManager的bean,并且设置好EnableCaching的注解
@Configuration@EnableWebMvc@EnableCachingpublic 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必须为同一个数据类型
@Repositorypublic 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中测试缓存的使用
@Controllerpublic 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以后也会强制走缓存了
beginrepository getget finishrepository addadd finishrepository delrepository 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.csdn.net/unix21"); } }
Spring4整合Redis3
基于注解的Spring4整合Redis3
阅读全文
0 0
- Spring实战4之缓存篇
- Spring缓存实战应用
- Spring+ehcache+redis两级缓存--缓存实战篇(1)
- Spring+ehcache+redis两级缓存--缓存实战篇(1)
- Spring + ehcache + redis两级缓存--缓存实战篇(1)
- spring实战4之容器篇
- Spring实战4之AOP篇
- Spring实战4之高级配置篇
- Spring实战4之SpringMVC篇
- Spring实战4之SpringMVC高级篇
- Spring实战4之数据源篇
- Spring Boot实战之Redis缓存登录验证码
- spring boot 学习(十四)SpringBoot+Redis+SpringSession缓存之实战
- Spring实战4之Spring Web Flow篇
- Spring Boot缓存实战 EhCache
- Spring Boot缓存实战 Redis
- Spring Boot缓存实战 Caffeine
- Spring实战4之Spring Security
- onmouseleave与onmouseout区别
- ActiveMQ从入门到精通(二)
- Google为什么选择用Kotlin
- HTTP 和 HTTPS
- go语言的性能测试脚本
- Spring实战4之缓存篇
- 如何清除Win7中被占用的COM口 串口
- ActiveMQ从入门到精通(三)
- JavaScript的onchange 事件
- Fantasy of a Summation(找规律,水)
- 面试失败流的泪往往是写简历时脑袋进的水
- 玩转Redis集群(上)
- Java中构造函数执行顺序的问题
- MFC实现选择文件夹的对话框