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

原创粉丝点击