详解SpringBoot如何使用Redis和Redis缓存

 更新时间:2022年06月21日 15:01:12   作者:_RH_  
这篇文章主要为大家详细介绍了SpringBoot如何使用Redis和Redis缓存,文中的示例代码讲解详细,对我们学习SpringBoot有一定的帮助,需要的可以参考一下

一、配置环境

首先,先创建一个SpringBoot项目,并且导入Redis依赖,使用Jedis进行连接测试。

本人的Redis装在虚拟机里,直接切换到虚拟机中的安装目录,启动redis服务,打开redis-cli,如果你设置了密码,还要先输入密码。

cd redis安装目录
#启动redis
redis-server  /etc/redis.conf
#进入redis 
redis-cli
#如果你设置了密码
auth 密码

在项目中,设置配置文件

# mysql数据库连接
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/redisdemo?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
#返回json的全局时间格式
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
#配置mapper xml文件的路径
mybatis-plus.mapper-locations=classpath:com/rh/csdn_redis_demo/mapper/xml/*.xml
#mybatis日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#配置redis
spring.redis.host=你的redis地址
spring.redis.password=你的redis密码(没有直接空着,或者可以注掉这行)
spring.redis.port=6379
spring.redis.database= 0
spring.redis.timeout=1800000
spring.redis.lettuce.pool.max-active=20
spring.redis.lettuce.pool.max-wait=-1
#最大阻塞等待时间(负数表示没限制)
spring.redis.lettuce.pool.max-idle=5
spring.redis.lettuce.pool.min-idle=0

在test中写一个测试方法,测试是否能够连接,返回值为pong

        Jedis jedis = new Jedis("你的redis安装的ip地址",6379);
        //没有密码就注掉这行,不然会报错
        jedis.auth("你的redis密码");//设置密码

        String value = jedis.ping();

        System.out.println(value);

二、Redis的基本操作

首先,要写一个redisconfig的配置类,这个类是为了解决redis存取值的序列化问题和缓存问题。

@EnableCaching
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        template.setConnectionFactory(factory);
        //key序列化方式
        template.setKeySerializer(redisSerializer);
        //value序列化
        template.setValueSerializer(jackson2JsonRedisSerializer);
        //value hashmap序列化
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        return template;
    }

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        //解决查询缓存转换异常的问题
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        // 配置序列化(解决乱码的问题),过期时间600秒
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofSeconds(600))  //设置数据过期时间600秒
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
                .disableCachingNullValues();
        RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
                .cacheDefaults(config)
                .build();
        return cacheManager;
    }
}

定义一个controller,写一个测试方法,进行访问

@RestController
@RequestMapping("redisTest")
public class RedisTestController {

    @Autowired
    private RedisTemplate redisTemplate;

    @GetMapping("/test01")
    public void test01(){

        redisTemplate.opsForValue().set("test","redis存值测试");

        String test = (String) redisTemplate.opsForValue().get("test");

        System.out.println(test);

    }

}

在reids中也可以查询key与vaule(中文没有显示是shell的编码问题)。

SpringBoot中进行redis的操作基本都是借助于ops*,各位可以根据自己需求进行其他的选用。

三、使用redis作缓存

简单的用redis做一个缓存,这里使用@Cacheable在方法上作缓存。

写一个用于访问的test02方法,并在该方法上作缓存。

controller

@RestController
@RequestMapping("redisTest")
public class RedisTestController {

    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private UserService userService;

    @GetMapping("/test01")
    public void test01(){

        redisTemplate.opsForValue().set("test","redis存值测试");

        String test = (String) redisTemplate.opsForValue().get("test");

        System.out.println(test);


    }

    @GetMapping("/test02")
    public List<User> test02(){

        List<User> userList = userService.test02();

        System.out.println(userList);

        return null;
    }
}

service

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {


    @Cacheable(value = "user",key = "'cache'")
    @Override
    public List<User> test02() {

        List<User> userList = baseMapper.selectList(null);

        return userList;
    }
}

首先查看redis中缓存内容

然后调用方法

可以看到,这一次查询,由于redis中没有缓存,所以对数据库进行了访问,再次查看redis中key

可以看到redis中多出了user::cache这个键,这个就是我们做的缓存了(编码格式问题导致这么显示)

这个时候我们再次访问方法

可以看到,第二次调用方法,并没有连接数据库,没有操作数据库的语句,这表示我们成功的从缓存中取出了数据。

tpis.

如果你在连接redis的时候出现了MISCONF Redis is configured to save RDB snapshots……这样的错误提示,这表示redis的持久化失效了,可以再redis-cli中直接输入config set stop-writes-on-bgsave-error no,但是这种方法不能永远解决这个问题,如果需要永解决这个问题,可以搜索redis持久化失效的解决方法。

以上就是详解SpringBoot如何使用Redis和Redis缓存的详细内容,更多关于SpringBoot使用Redis 缓存的资料请关注脚本之家其它相关文章!

相关文章

  • @MapperScan和@ComponentScan一块使用导致冲突的解决

    @MapperScan和@ComponentScan一块使用导致冲突的解决

    这篇文章主要介绍了@MapperScan和@ComponentScan一块使用导致冲突的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Spring Cloud 网关服务 zuul  动态路由的实现方法

    Spring Cloud 网关服务 zuul 动态路由的实现方法

    网关服务是流量的唯一入口。不能随便停服务。所以动态路由就显得尤为必要。这篇文章主要介绍了Spring Cloud 网关服务 zuul 三 动态路由的相关知识,需要的朋友可以参考下
    2019-10-10
  • java随机生成10位数的字符串ID

    java随机生成10位数的字符串ID

    这篇文章主要为大家详细介绍了java随机生成10位数字符串ID的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • IntelliJ IDEA安装目录和设置目录的说明(IntelliJ IDEA快速入门)

    IntelliJ IDEA安装目录和设置目录的说明(IntelliJ IDEA快速入门)

    这篇文章主要介绍了IntelliJ IDEA安装目录和设置目录的说明(IntelliJ IDEA快速入门),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • 消息队列-kafka消费异常问题

    消息队列-kafka消费异常问题

    这篇文章主要给大家介绍了关于kafka的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07
  • Lombok在idea中的使用教程

    Lombok在idea中的使用教程

    Lombok是一个可以通过简单的注解形式,来帮助我们简化消除一些必须有但显得很臃肿(如果getter、setter方法)的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法,这篇文章主要介绍了Lombok在idea中的使用,需要的朋友可以参考下
    2023-03-03
  • JDBC如何访问MySQL数据库,并增删查改

    JDBC如何访问MySQL数据库,并增删查改

    这篇文章主要介绍了JDBC如何访问MySQL数据库,帮助大家更好的理解和学习java与MySQL,感兴趣的朋友可以了解下
    2020-08-08
  • Spring中ResponseBodyAdvice的使用详解

    Spring中ResponseBodyAdvice的使用详解

    这篇文章主要介绍了Spring中ResponseBodyAdvice的使用,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10
  • springboot+vue项目从第一行代码到上线部署全流程

    springboot+vue项目从第一行代码到上线部署全流程

    本文详细介绍了如何从零开始搭建一个基于Spring Boot和Vue.js的前后端分离项目,并涵盖项目需求分析、技术选型、项目结构设计、前后端交互、部署上线等全过程,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • 基于java文件上传-原始的Servlet方式

    基于java文件上传-原始的Servlet方式

    下面小编就为大家带来一篇基于java文件上传-原始的Servlet方式。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08

最新评论