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

本文介绍了如何在SpringBoot项目中配置Redis环境,包括数据库连接,使用Jedis进行连接测试。接着讲解了Redis的基本操作,如设置序列化配置以解决存取值问题。最后,通过@Cacheable注解展示了如何利用Redis作方法级别的缓存,提高数据访问效率。
摘要由CSDN通过智能技术生成

一、配置环境

首先,先创建一个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 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持久化失效的解决方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值