写点什么

springboot 使用 redis(从配置到实战)

发布于: 2 小时前

概述

springboot 通常整合 redis,采用的是 RedisTemplate 的形式,除了这种形式以外,还有另外一种形式去整合,即采用 spring 支持的注解进行访问缓存.

准备工作

pom.xml


<dependency>            <groupId>redis.clients</groupId>            <artifactId>jedis</artifactId>            <version>2.7.3</version>        </dependency>        <dependency>            <groupId>org.springframework.data</groupId>            <artifactId>spring-data-redis</artifactId>            <version>1.7.2.RELEASE</version>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-redis</artifactId>            <version>RELEASE</version>        </dependency>
复制代码


application.properties


# REDIS (RedisProperties)# Redis数据库索引(默认为0)spring.redis.database=0# Redis服务器地址spring.redis.host=127.0.0.1# Redis服务器连接端口spring.redis.port=6379# 连接池最大连接数(使用负值表示没有限制)spring.redis.pool.max-active=8# 连接池最大阻塞等待时间(使用负值表示没有限制)spring.redis.pool.max-wait=-1# 连接池中的最大空闲连接spring.redis.pool.max-idle=8# 连接池中的最小空闲连接spring.redis.pool.min-idle=0# 连接超时时间(毫秒)spring.redis.timeout=0
复制代码

Redis 配置类

package cn.chenlove.config;
import org.apache.log4j.Logger;import org.springframework.beans.factory.annotation.Value;import org.springframework.cache.annotation.CachingConfigurerSupport;import org.springframework.cache.annotation.EnableCaching;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;
import redis.clients.jedis.JedisPool;import redis.clients.jedis.JedisPoolConfig;
@Configuration@EnableCachingpublic class RedisConfig extends CachingConfigurerSupport{ @Value("${spring.redis.host}") private String host;
@Value("${spring.redis.port}") private int port;
@Value("${spring.redis.timeout}") private int timeout;
@Value("${spring.redis.pool.max-idle}") private int maxIdle;
@Value("${spring.redis.pool.max-wait}") private long maxWaitMillis;
@Bean public JedisPool redisPoolFactory() { Logger.getLogger(getClass()).info("JedisPool注入成功!!"); Logger.getLogger(getClass()).info("redis地址:" + host + ":" + port); JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); jedisPoolConfig.setMaxIdle(maxIdle); jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout);
return jedisPool; }}
复制代码


可以看出,我们这里主要配置了两个东西,cacheManager 方法配置了一个缓存名称,它的名字叫做 thisredis,当我们要在方法注解里面使用到它的时候,就要根据名称进行区分不同缓存.同时设置了缓


存的过期时间.redisTemplate 则是比较常见的,我们设置了 RedisTemplate,因此在代码里面,我们也可以通过 @Autowired 注入 RedisTemplate 来操作 redis.

使用

接下来就是如何使用注解啦,这一步反而是最简单的.其实只用到了两个注解,@Cacheable 和 @CacheEvict.第一个注解代表从缓存中查询指定的 key,如果有,从缓存中取,不再执行方法.如果没有则执


行方法,并且将方法的返回值和指定的 key 关联起来,放入到缓存中.而 @CacheEvict 则是从缓存中清除指定的 key 对应的数据.使用的代码如下:


//有参数    @Cacheable(value="thisredis", key="'users_'+#id")    public User findUser(Integer id) {        User user = new User();        user.setUsername("hlhdidi");        user.setPassword("123");        user.setUid(id.longValue());        System.out.println("log4j2坏啦?");        logger.info("输入user,用户名:{},密码:{}",user.getUsername(),user.getPassword());        return user;     }
@CacheEvict(value="thisredis", key="'users_'+#id",condition="#id!=1") public void delUser(Integer id) { // 删除user System.out.println("user删除"); }
//无参数 @RequestMapping("/get") @Cacheable(value="thisredis") @ResponseBody public List<User> xx(){ return userMapper.selectAll(); } @RequestMapping("/get3") @CacheEvict(value="thisredis") @ResponseBody public String xx3(){ return "ok"; }
复制代码


可以看出,我们用 @Cacheable 的 value 属性指定具体缓存,并通过 key 将其放入缓存中.这里 key 非常灵活,支持 spring 的 el 表达式,可以通过方法参数产生可变的 key(见 findUser 方法),也可以通过其指定在


什么情况下,使用/不使用缓存(见 delUser 方法).

发布于: 2 小时前阅读数: 2
用户头像

个人公众号:Python研究者 2021.04.26 加入

教你如何学Python,专注于Python入门与进阶、爬虫、数据分析挖掘、数据可视化。分享Python相关的技术文章、工具资源、视频教程、学习资料。

评论

发布
暂无评论
springboot使用redis(从配置到实战)