Spring Redis 使用总结

1.简介

Spring中常用Redis做数据库的缓存,第一次查询走数据库并缓存到redis,第二次查询由redis直接返回数据。

2.安装Redis

mac安装:

brew install redis

linux安装:

sudo apt-get install lsb-release curl gpg
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
sudo chmod 644 /usr/share/keyrings/redis-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
sudo apt-get update
sudo apt-get install redis

启动redis:

brew services start redis

命令行测试redis已经启动:

redis-cli
127.0.0.1:6379> ping
PONG

3. 拉起

pom.xml加入:

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

application.yaml配置文件中加入:

spring:
  redis:
    host: 127.0.0.1
    port: 6378

添加Redis配置类:

@Configuration
@EnableCaching
public class RedisConfig {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory){
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(factory);

        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());

        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));
        return redisTemplate;
    }

    @Bean
    public RedisCacheManager redisCacheManager(RedisTemplate redisTemplate){
        RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisTemplate.getConnectionFactory());
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer((redisTemplate.getValueSerializer())));
        return new RedisCacheManager(redisCacheWriter, redisCacheConfiguration);
    }
}

测试基本功能:

@SpringBootTest
public class RedisTester {
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private ArticlesMapper articlesMapper;

    @Test
    public void testSet(){
        //存入数据
        redisTemplate.boundValueOps("name").set("zhangsan");
    }

    @Test
    public void testGet(){
        //获取数据
        Object name = redisTemplate.boundValueOps("name").get();
        System.out.println("name = " + name);
    }

    @Test
    public void testReadSql(){
        List<Article> articles = articlesMapper.getArticles();

        Map<String ,String> map = articles.stream().collect(Collectors.toMap(article -> article.getId().toString(), article -> article.getText()));

        redisTemplate.opsForHash().putAll("test",map);
        Object test = redisTemplate.opsForHash().get("test", "82");
        System.out.println("test = " + test);

    }
}

实战添加注解:

@Cacheable(value = "article", key="'getArticles'")//第一次访问mysql,之后创建缓存,不再访问mysql
@Override
public Result getArticles() {
	...
}

//数据未找到时不保存缓存,Cacheable返回值使用unless判断(返回使用),不能用condition(入参判断使用)
@Cacheable(value = "article", key="'article:' + #articleId",unless = "#result.getData() == null")
@Override
public Result getArticle(Integer articleId) {
	...
    return Result.ok(article);
}

//数据变化时更新缓存,删除群缓存
@CachePut(value = "article",key = "'article:' + #article.id")
@CacheEvict(value= "article", key="'getArticles'")
@Override
public Result createArticle(Article article){
	...
}

//数据变化时更新缓存,删除群缓存
@CachePut(value = "article",key = "'article:' + #article.id")
@CacheEvict(value= "article", key="'getArticles'")
@Override
public Result modifyArticle(Article article) {
	...
}

//数据变化时更新缓存,删除群缓存
@Caching(evict = {
        @CacheEvict(value = "article", key="'article:' + #articleId"),
        @CacheEvict(value= "article", key="'getArticles'")
})
@Override
public Result deleteArticle(Integer articleId) {
	...
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值