龙空技术网

Spring Boot整合Redis实现缓存(实战详细)

极速星空4DO 221

前言:

此刻兄弟们对“redis缓存管理器”大概比较关怀,兄弟们都需要剖析一些“redis缓存管理器”的相关知识。那么小编也在网上收集了一些关于“redis缓存管理器””的相关知识,希望姐妹们能喜欢,我们快快来学习一下吧!

目录第一步:创建springboot项目第二步:引入依赖:spring-boot-starter-data-redis第四步:准备数据表和实体类:常用redis缓存:相关注解介绍第六步:接口文件:缓存注解使用的地方第一步:创建springboot项目第二步:引入依赖:spring-boot-starter-data-redis

<dependencies>        <!--mysql-->        <dependency>            <groupId>mysql</groupId>            <artifactId>mysql-connector-java</artifactId>            <version>8.0.22</version>        </dependency>        <!--mybatis-plus-->        <dependency>            <groupId>com.baomidou</groupId>            <artifactId>mybatis-plus-boot-starter</artifactId>            <version>3.4.2</version>        </dependency>        <!--redis-->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-data-redis</artifactId>            <version>2.6.6</version>        </dependency>        <!--lombok-->        <dependency>            <groupId>org.projectlombok</groupId>            <artifactId>lombok</artifactId>            <version>1.18.22</version>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter</artifactId>        </dependency>        <!--swagger-->        <dependency>            <groupId>io.springfox</groupId>            <artifactId>springfox-swagger2</artifactId>            <version>2.9.2</version>        </dependency>        <!--swagger-ui.html模式-->        <dependency>            <groupId>io.springfox</groupId>            <artifactId>springfox-swagger-ui</artifactId>            <version>2.9.2</version>        </dependency>        <!--web-->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>            <version>2.6.9</version>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-test</artifactId>            <scope>test</scope>        </dependency>    </dependencies>
第三步:修改启动类:
package com.fan.rediscach;import org.mybatis.spring.annotation.MapperScan;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication@MapperScan("com.fan.rediscach.mapper") //mapper扫描public class RediscachApplication {    public static void main(String[] args) {        SpringApplication.run(RediscachApplication.class, args);    }}
第四步:准备数据表和实体类:

准备数据库和对用的实体类:

实体类com.fan.rediscach.entity.User:

@TableName和@TableField属于mybatis-plus的注解,很好用

package com.fan.rediscach.entity;import com.baomidou.mybatisplus.annotation.TableField;import com.baomidou.mybatisplus.annotation.TableName;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import java.io.Serializable;@Data@AllArgsConstructor@NoArgsConstructor@TableName(value = "user")public class User implements Serializable {    private Long id;//一定使用包装类,实体类    @TableField(value = "user_name")    private String name;    private String sex;    private int age;}
第五步:配置文件
# mysql数据库连接spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource.url=jdbc:mysql://127.0.0.1:3306/mybatis_plus?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=UTCspring.datasource.username=rootspring.datasource.password=***spring.mvc.pathmatch.matching-strategy=ant_path_matcher#redis配置spring.cache.type=redispring.redis.database=0pring.redis.port=6379spring.redis.host=192.168.211.210 //自己redis地址spring.redis.password=spring.redis.timeout=1800000

配置类config包下:

Swagger2Config配置类:Swagger2测试接口比较方便

package com.fan.rediscach.config;import com.google.common.base.Predicates;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import springfox.documentation.builders.ApiInfoBuilder;import springfox.documentation.builders.PathSelectors;import springfox.documentation.service.ApiInfo;import springfox.documentation.service.Contact;import springfox.documentation.spi.DocumentationType;import springfox.documentation.spring.web.plugins.Docket;import springfox.documentation.swagger2.annotations.EnableSwagger2;/** * Swagger2配置信息 */@Configuration@EnableSwagger2public class Swagger2Config {    @Bean    public Docket webApiConfig(){        return new Docket(DocumentationType.SWAGGER_2)                .groupName("webApi")                .apiInfo(webApiInfo())                .select()                //只显示api路径下的页面                .paths(Predicates.and(PathSelectors.regex("/api/.*")))                .build();    }    @Bean    public Docket adminApiConfig(){        return new Docket(DocumentationType.SWAGGER_2)                .groupName("adminApi")                .apiInfo(adminApiInfo())                .select()                //这里要修改成自己的controller类上的requestmapping路径                .paths(Predicates.and(PathSelectors.regex("/.*")))                .build();    }    private ApiInfo webApiInfo(){        return new ApiInfoBuilder()                .title("网站-API文档")                .description("本文档描述了网站微服务接口定义")                .version("1.1")                .contact(new Contact("fan", ";, "493211102@qq.com"))                .build();    }    private ApiInfo adminApiInfo(){        return new ApiInfoBuilder()                .title("后台管理系统-API文档")                .description("本文档描述了后台管理系统微服务接口定义")                .version("1.1")                .contact(new Contact("fan", ";, "49321112@qq.com"))                .build();    }}

RedisConfig配置类:

package com.fan.rediscach.config;import org.springframework.cache.CacheManager;import org.springframework.cache.annotation.EnableCaching;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.cache.RedisCacheConfiguration;import org.springframework.data.redis.cache.RedisCacheManager;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.serializer.*;import java.time.Duration;/** * Redis 配置类 */@Configuration@EnableCaching //开启缓存配置public class RedisConfig {    /**     * 配置缓存管理器     * @param factory Redis 线程安全连接工厂     * @return 缓存管理器     */    @Bean    public CacheManager cacheManager(RedisConnectionFactory factory) {        // 生成两套默认配置,通过 Config 对象即可对缓存进行自定义配置        RedisCacheConfiguration cacheConfig1 = RedisCacheConfiguration.defaultCacheConfig()                // 设置过期时间 10 分钟                .entryTtl(Duration.ofMinutes(10))                // 设置缓存前缀                .prefixKeysWith("cache:user:")                // 禁止缓存 null 值                .disableCachingNullValues()                // 设置 key 序列化                .serializeKeysWith(keyPair())                // 设置 value 序列化                .serializeValuesWith(valuePair());        RedisCacheConfiguration cacheConfig2 = RedisCacheConfiguration.defaultCacheConfig()                // 设置过期时间 30 秒                .entryTtl(Duration.ofSeconds(30))                .prefixKeysWith("cache:admin:")                .disableCachingNullValues()                .serializeKeysWith(keyPair())                .serializeValuesWith(valuePair());        // 返回 Redis 缓存管理器        return RedisCacheManager.builder(factory)                .withCacheConfiguration("user", cacheConfig1)                .withCacheConfiguration("admin", cacheConfig2)                .build();    }    /**     * 配置键序列化     * @return StringRedisSerializer     */    private RedisSerializationContext.SerializationPair<String> keyPair() {        return RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer());    }    /**     * 配置值序列化,使用 GenericJackson2JsonRedisSerializer 替换默认序列化     * @return GenericJackson2JsonRedisSerializer     */    private RedisSerializationContext.SerializationPair<Object> valuePair() {        return RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer());    }}
这里我们使用mybatis-plus来使用:常用redis缓存:相关注解介绍1 @Cacheable

如果缓存中不存在目标值,则将调用目标方法并将返回的值存入缓存;如果存在,则直接返回缓存中的值,不会执行方法体。即使方法体内进行了数据库的更新操作,也不会执行。

该注解常用参数如下:

cacheNames/value :存储方法调用结果的缓存的名称key :缓存数据使用的key,可以用它来指定,key="#param"可以指定参数值,也可以是其他属性keyGenerator :key的生成器,用来自定义key的生成,与key为二选一,不能兼存condition:用于使方法缓存有条件,默认为"" ,表示方法结果始终被缓存。conditon="#id>1000"表示id>1000的数据才进行缓存unless:用于否决方法缓存,此表达式在方法被调用后计算,因此可以引用方法返回值(result),默认为"" ,这意味着缓存永远不会被否决。unless = "#result==null"表示除非该方法返回值为null,否则将方法返回值进行缓存sync :是否使用异步模式,默认为false不使用异步2 @CachePut

如果缓存中先前存在目标值,则更新缓存中的值为该方法的返回值;如果不存在,则将方法的返回值存入缓存。

该注解常用参数同@Cacheable,不过@CachePut没有sync 这个参数

3 @CacheEvict

如果缓存中存在存在目标值,则将其从缓存中删除

该注解常用参数如下:

cacheNames/value、key、keyGenerator、condition同@CacheableallEntries:如果指定allEntries为true,Spring Cache将忽略指定的key清除缓存中的所有元素,默认情况下为false。beforeInvocation:删除缓存操作默认是在对应方法成功执行之后触发的,方法如果因为抛出异常而未能成功返回时也不会触发删除操作。如果指定beforeInvocation为true ,则无论方法结果如何,无论方法是否抛出异常都会导致删除缓存。第六步:接口文件:缓存注解使用的地方mapper接口:

package com.fan.rediscach.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;import com.fan.rediscach.entity.User;public interface UserMapper extends BaseMapper<User> {}
service接口:
package com.fan.rediscach.service;import com.baomidou.mybatisplus.extension.service.IService;import com.fan.rediscach.entity.User;public interface UserService extends IService<User> {    //定义一个接口方法    User findById(long id);}
service实现类:

其它层正常编写即可,与之前并无差别,此处不再展示;

package com.fan.rediscach.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;import com.fan.rediscach.entity.User;import com.fan.rediscach.mapper.UserMapper;import com.fan.rediscach.service.UserService;import org.springframework.cache.annotation.Cacheable;import org.springframework.stereotype.Service;@Servicepublic class UserServiceImpl extends ServiceImpl<UserMapper, User>        implements UserService {    //测试缓存    @Override    @Cacheable(cacheNames = "user111" ,key = " 'id' ")//或者这样写key = "#id"    public User findById(Long id) {        User user = baseMapper.selectById(id);        return user;    }}
controller:
package com.fan.rediscach.controller;import com.fan.rediscach.entity.User;import com.fan.rediscach.service.UserService;import io.swagger.annotations.Api;import io.swagger.annotations.ApiOperation;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;@Api("contrller") //swagger标签@RestControllerpublic class UserController {    @Resource    private UserService userService;    @ApiOperation(value = "findById接口")//swagger标签    @GetMapping("findById/{id}")//注意接口    public User findById(@PathVariable Long id){        User byId = userService.getById(id);        return byId;    }    //测试redis缓存    @ApiOperation(value = "findById接口")//swagger标签    @GetMapping("findById2/{id}")//注意接口    public User findById2(@PathVariable Long id){        User user = userService.findById(id);        return user;    }}
swagger测试:

测试通过:

缓存都是写在实现类中的:更多的缓存方法如下:

package com.fan.rediscach.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;import com.fan.rediscach.entity.User;import com.fan.rediscach.mapper.UserMapper;import com.fan.rediscach.service.UserService;import org.springframework.cache.annotation.CacheEvict;import org.springframework.cache.annotation.CachePut;import org.springframework.cache.annotation.Cacheable;import org.springframework.stereotype.Service;import javax.annotation.Resource;@Servicepublic class UserServiceImpl extends ServiceImpl<UserMapper, User>        implements UserService {    @Resource    private UserMapper userMapper;    //测试缓存   /* @Override    @Cacheable(cacheNames = "user111" ,key = " 'id' ")//或者这样写key = "#id"    public User findById(long id) {        User user = baseMapper.selectById(id);        return user;    }*/    // 当调用这个方法的时候,会从一个名叫user的缓存中查询    @Cacheable(cacheNames = "user", key = "#id")    @Override    public User findById(Long id) {        // 如果不存在则查询数据库,并把查询的结果放入缓存中        return userMapper.selectById(id);    }    // 先执行方法体中的代码,成功执行之后删除缓存    @CacheEvict(cacheNames = "user", key = "#id")    public boolean delete(Long id) {        // 删除数据库中具有的数据        return userMapper.deleteById(id) == 1;    }    // 如果缓存中先前存在,则更新缓存;如果不存在,则将方法的返回值存入缓存    @CachePut(cacheNames = "user", key = "#user.id")    public User update(User user) {        userMapper.updateById(user);        return user;    }    @CachePut(cacheNames = "user", key = "#user.id")    public User insert(User user) {        userMapper.insert(user);        return user;    }}

标签: #redis缓存管理器