Spring实战4之缓存篇

本文深入探讨了Spring中的缓存配置,包括在UserRepositoryImpl中使用Cacheable、CacheEvict和CachePut注解实现缓存操作,并在HomeController中进行测试。同时,文章还介绍了Spring如何整合Redis作为缓存,详细讲解了引入依赖、配置Redis及测试案例的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、配置缓存
(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");  
    }  
}  

Spring4整合Redis3

基于注解的Spring4整合Redis3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值