Redis学习之缓存

Redis学习之缓存

前言

在前面的学习中,我们学习了Jedis以及Spring-redis-data的使用,这些内容主要是直接使用Redis作为数据库,接下来,我们从另一个角度来学习Redis,将Redis作为缓存来使用,在使用Redis的场景中,很大一部分就是将Redis作为缓存来使用。

Redis缓存使用

为了操作的方便,这里我们同样采用Spring Boot作为脚手架,你可以直接复用上一小节的项目工程即可。

在Spring中,Spring通过引入声明式缓存的方式来透明地实现缓存,通过几个简单的配置以及注解的使用,就能享受到Spring带来的方便了。

缓存配置

引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

Bean配置

在上一小节的Bean的基础上,增加一个CacheManager的Bean即可,当然,如果直接作为缓存,则有一些Bean是可以不用的

@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
    RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
            .entryTtl(Duration.ZERO)
            .serializeValuesWith(
                    RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()))
            .disableCachingNullValues();

    return RedisCacheManager.builder(factory)
            .cacheDefaults(config)
            .build();
}

这里同样需要注意,2.x跟1.x的配置是不同的,1.x可以直接往RedisCacheManger中注入一个RedisTemplate即可,所以,1.x的方式无需额外配置缓存的序列化器,在2.x中,缓存的序列化器默认使用的jdk序列化器,所以,如果是想使用其他的序列化器,依旧需要自行配置,这里是个大坑。

缓存使用

配置完之后,就可以使用缓存了,首先是开启缓存功能,在启动类加上注解@EnableCaching即可

然后是在需要缓存的方法中组合使用

  • @Cacheable,主要用于标注查询操作,如果键匹配,只有第一次会命中
  • @CacheEvit,主要用于标注删除操作
  • @CachePut,主要用于标注更新跟插入操作,注意,每次都会命中

当然,如果同个类中的多个方法都需要操作,可以在类上使用@CacheConfig进行通用的配置。

一个简单的演示代码如下,这里为了操作简单,直接构造数据模拟数据库操作了

@Service
// 指定缓存空间的名称
@CacheConfig(cacheNames = "user") 
public class UserService {

    // 指定对应的键
    @Cacheable(key = "#p0")
    public String queryById(int id) {
        System.out.println("in query");
        if (id < 10) {
            return "less than 10";
        }
        return "more than 10";
    }

    @Cacheable(key = "#p0")
    public User getUserByName(String username) {
        System.out.println("in query " + username);
        User user= new User();
        if ("xavier".equals(username)) {
            user.setName("xavier");
            user.setPassword("xavier");
        }
        if ("xuhuanfeng".equals(username)) {
            user.setPassword("xuhuanfeng");
            user.setName("xuhuanfeng");
        }
        return user;
    }
    @CacheEvict(key = "#p0")
    public void deleteUserByName(String username) {
        System.out.println("delete " + username);
    }

    @CachePut(key = "#p0")
    public User updateUser(String username) {
        System.out.println("in update " + username);
        User user= new User();
        if ("xavier".equals(username)) {
            user.setName("xavier");
            user.setPassword("xavier--update");
        }
        if ("xuhuanfeng".equals(username)) {
            user.setPassword("xuhuanfeng");
            user.setName("xuhuanfeng--update");
        }
        return user;
    }
}

调用对应的操作,然后观察对应的输出以及Redis中的内容就能看到具体的变化啦。

总结

本小节主要学习了将Redis作为缓存来使用,结合Spring Cache,可以看到基本上对应缓存的操作对于开发者来说是透明的,使用起来也非常简单,当然,关于缓存的坑很大,不过我目前还没有深入学习,以后有机会再分享一下,到了这里,关于Redis的学习也暂时告一段落了,当然,告一段落并不是结束。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值