Spring Boot 操作 Redis

Redis教程:

https://mp.weixin.qq.com/s?__biz=MzI1NDY0MTkzNQ==&mid=2247484570&idx=1&sn=37ffb660b4d1d250bfd89ece438b3f98&scene=21#wechat_redirect

Redis教程

1.Linux上安装Redis

2.Redis中的五种数据类型简介

3.Redis字符串(STRING)介绍

4.Redis字符串(STRING)中BIT相关命令

5.Redis列表与集合

6.Redis散列与有序集合

7.Redis中的发布订阅和事务

8.Redis快照持久化

9.Redis之AOF持久化

10.Redis主从复制(一)

11.Redis主从复制(二)

12.Redis集群搭建

13.Jedis使用

14.Spring Data Redis使用

方案一:Spring Data Redis

创建工程

创建工程,引入 Redis 依赖:

创建成功后,还需要手动引入 commos-pool2 的依赖,因此最终完整的 pom.xml 依赖如下:

<dependencies>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-data-redis</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

</dependencies>

<dependency>

<groupId>org.apache.commons</groupId>

<artifactId>commons-pool2</artifactId>

</dependency>

这里主要就是引入了 Spring Data Redis + 连接池。

配置 Redis 信息

接下来配置 Redis 的信息,信息包含两方面,一方面是 Redis 的基本信息,另一方面则是连接池信息:

spring.redis.database=0

spring.redis.password=123

spring.redis.port=6379

spring.redis.host=192.168.66.128

spring.redis.lettuce.pool.min-idle=5

spring.redis.lettuce.pool.max-idle=10

spring.redis.lettuce.pool.max-active=8

spring.redis.lettuce.pool.max-wait=1ms

spring.redis.lettuce.shutdown-timeout=100ms

自动配置

当开发者在项目中引入了 Spring Data Redis ,并且配置了 Redis 的基本信息,此时,自动化配置就会生效。

我们从 Spring Boot 中 Redis 的自动化配置类中就可以看出端倪:

@Configuration

@ConditionalOnClass(RedisOperations.class)

@EnableConfigurationProperties(RedisProperties.class)

@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })

public class RedisAutoConfiguration {

@Bean

@ConditionalOnMissingBean(name = "redisTemplate")

public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {

RedisTemplate<Object, Object> template = new RedisTemplate<>();

template.setConnectionFactory(redisConnectionFactory);

return template;

}

@Bean

@ConditionalOnMissingBean

public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {

StringRedisTemplate template = new StringRedisTemplate();

template.setConnectionFactory(redisConnectionFactory);

return template;

}

}

这个自动化配置类很好理解:

  1. 首先标记这个是一个配置类,同时该配置在 RedisOperations 存在的情况下才会生效(即项目中引入了 Spring Data Redis)
  2. 然后导入在 application.properties 中配置的属性
  3. 然后再导入连接池信息(如果存在的话)
  4. 最后,提供了两个 Bean ,RedisTemplate 和 StringRedisTemplate ,其中 StringRedisTemplate 是 RedisTemplate 的子类,两个的方法基本一致,不同之处主要体现在操作的数据类型不同,RedisTemplate 中的两个泛型都是 Object ,意味者存储的 key 和 value 都可以是一个对象,而 StringRedisTemplate 的 两个泛型都是 String ,意味者 StringRedisTemplate 的 key 和 value 都只能是字符串。如果开发者没有提供相关的 Bean ,这两个配置就会生效,否则不会生效。

使用

接下来,可以直接在 Service 中注入 StringRedisTemplate 或者 RedisTemplate 来使用:

@Service

public class HelloService {

@Autowired

RedisTemplate redisTemplate;

public void hello() {

ValueOperations ops = redisTemplate.opsForValue();

ops.set("k1", "v1");

Object k1 = ops.get("k1");

System.out.println(k1);

}

}

Redis 中的数据操作,大体上来说,可以分为两种:

  1. 针对 key 的操作,相关的方法就在 RedisTemplate 中
  2. 针对具体数据类型的操作,相关的方法需要首先获取对应的数据类型,获取相应数据类型的操作方法是 opsForXXX

调用该方法就可以将数据存储到 Redis 中去了,如下:

k1 前面的字符是由于使用了 RedisTemplate 导致的,RedisTemplate 对 key 进行序列化之后的结果。

RedisTemplate 中,key 默认的序列化方案是 JdkSerializationRedisSerializer 。

而在 StringRedisTemplate 中,key 默认的序列化方案是 StringRedisSerializer ,因此,如果使用 StringRedisTemplate ,默认情况下 key 前面不会有前缀。

不过开发者也可以自行修改 RedisTemplate 中的序列化方案,如下:

@Service

public class HelloService {

@Autowired

RedisTemplate redisTemplate;

public void hello() {

redisTemplate.setKeySerializer(new StringRedisSerializer());

​​​​​​​ ​​​​​​​ ValueOperations ops = redisTemplate.opsForValue();

​​​​​​​ ​​​​​​​ ops.set("k1", "v1");

​​​​​​​ ​​​​​​​ Object k1 = ops.get("k1");

​​​​​​​ ​​​​​​​ System.out.println(k1);

​​​​​​​ }

}

当然也可以直接使用 StringRedisTemplate:

@Service

public class HelloService {

​​​​​​​ @Autowired

​​​​​​​ StringRedisTemplate stringRedisTemplate;

​​​​​​​ public void hello2() {

​​​​​​​ ​​​​​​​ ValueOperations ops = stringRedisTemplate.opsForValue();

​​​​​​​ ​​​​​​​ ops.set("k2", "v2");

​​​​​​​ ​​​​​​​ Object k1 = ops.get("k2");

​​​​​​​ ​​​​​​​ System.out.println(k1);

​​​​​​​ }

}

另外需要注意 ,Spring Boot 的自动化配置,只能配置单机的 Redis ,如果是 Redis 集群,则所有的东西都需要自己手动配置。

方案二:Spring Cache

工程创建

首先创建一个Spring Boot工程,注意创建的时候需要引入三个依赖,web、cache以及redis,如下图:

对应的依赖内容如下:

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-cache</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-data-redis</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

基本配置

工程创建好之后,首先需要简单配置一下Redis,Redis的基本信息,另外,这里要用到Cache,因此还需要稍微配置一下Cache,如下:

spring.redis.port=6380

spring.redis.host=192.168.66.128

spring.cache.cache-names=c1

简单起见,这里我只是配置了Redis的端口和地址,然后给缓存取了一个名字,这个名字在后文会用到。

另外,还需要在配置类上添加如下代码,表示开启缓存:

@SpringBootApplication

@EnableCaching

public class RediscacheApplication {

public static void main(String[] args) {

SpringApplication.run(RediscacheApplication.class, args);

}

}

完成了这些配置之后,Spring Boot就会自动帮我们在后台配置一个RedisCacheManager,相关的配置是在org.springframework.boot.autoconfigure.cache.RedisCacheConfiguration类中完成的。部分源码如下:

@Configuration

@ConditionalOnClass(RedisConnectionFactory.class)

@AutoConfigureAfter(RedisAutoConfiguration.class)

@ConditionalOnBean(RedisConnectionFactory.class)

@ConditionalOnMissingBean(CacheManager.class)

@Conditional(CacheCondition.class)

class RedisCacheConfiguration {

@Bean

public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory,

ResourceLoader resourceLoader) {

RedisCacheManagerBuilder builder =

RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(determineConfiguration(resourceLoader.getClassLoader()));

List<String> cacheNames = this.cacheProperties.getCacheNames();

if (!cacheNames.isEmpty()) {

builder.initialCacheNames(new LinkedHashSet<>(cacheNames));

}

return this.customizerInvoker.customize(builder.build());

}

}

看类上的注解,发现在万事俱备的情况下,系统会自动提供一个RedisCacheManager的Bean,这个RedisCacheManager间接实现了Spring中的Cache接口,有了这个Bean,我们就可以直接使用Spring中的缓存注解和接口了,而缓存数据则会被自动存储到Redis上。在单机的Redis中,这个Bean系统会自动提供,如果是Redis集群,这个Bean需要开发者来提供(后面的文章会讲到)。

缓存使用

这里主要向小伙伴们介绍缓存中几个核心的注解使用。

@CacheConfig

这个注解在类上使用,用来描述该类中所有方法使用的缓存名称,当然也可以不使用该注解,直接在具体的缓存注解上配置名称,示例代码如下:

@Service

@CacheConfig(cacheNames = "c1")

public class UserService {}

@Cacheable

这个注解一般加在查询方法上,表示将一个方法的返回值缓存起来,默认情况下,缓存的key就是方法的参数,缓存的value就是方法的返回值。示例代码如下:

@Cacheable(key = "#id")

public User getUserById(Integer id,String username) {

System.out.println("getUserById");

return getUserFromDBById(id);

}

当有多个参数时,默认就使用多个参数来做key,如果只需要其中某一个参数做key,则可以在@Cacheable注解中,通过key属性来指定key,如上代码就表示只使用id作为缓存的key,如果对key有复杂的要求,可以自定义keyGenerator。当然,Spring Cache中提供了root对象,可以在不定义keyGenerator的情况下实现一些复杂的效果:

@CachePut

这个注解一般加在更新方法上,当数据库中的数据更新后,缓存中的数据也要跟着更新,使用该注解,可以将方法的返回值自动更新到已经存在的key上,示例代码如下:

@CachePut(key = "#user.id")

public User updateUserById(User user) {

return user;

}

@CacheEvict

这个注解一般加在删除方法上,当数据库中的数据删除后,相关的缓存数据也要自动清除,该注解在使用的时候也可以配置按照某种条件删除(condition属性)或者或者配置清除所有缓存(allEntries属性),示例代码如下:

@CacheEvict()

public void deleteUserById(Integer id) {

​​​​​​​ //在这里执行删除操作, 删除是去数据库中删除

}

总结

在Spring Boot中,使用Redis缓存,既可以使用RedisTemplate自己来实现,也可以使用使用这种方式,这种方式是Spring Cache提供的统一接口,实现既可以是Redis,也可以是Ehcache或者其他支持这种规范的缓存框架。从这个角度来说,Spring Cache和Redis、Ehcache的关系就像JDBC与各种数据库驱动的关系。

方案三:回归原始时代

第三种方案,就是直接使用 Jedis 或者 其他的客户端工具来操作 Redis ,可以参考 Jedis 使用

springboot整合redis及集群

https://blog.csdn.net/weixin_38004638/article/details/90209482

来源:江南一点雨 牧码小子

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏芋道源码1024

性能测试 —— Redis 基准测试

不过,本文我们不会去聊上述所有的手段或是框架、中间件,而是聚焦本文的主角 Redis 。

36620
来自专栏业余草

Redis 的可视化监控工具 Redislive 简单使用教程

原文链接:https://www.cnblogs.com/huangxincheng/p/5571185.html

19320
来自专栏WeTest质量开放平台团队的专栏

从头到脚说单测——谈有效的单元测试(上篇)

? 作 者 杨迪,腾讯PCG高级工程师 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处。 作者导语 从4月份至今,我能够全身心投入到腾讯新闻...

30520
来自专栏Java程序猿部落

我是如何拿下阿里、头条、滴滴的,最终还是选择去了阿里巴巴。(上)

本人两年开发经验、18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴、今日头条、滴滴等公司offer,岗位是Java后端开发,最终选择去了阿里巴巴。

21300
来自专栏SpringCloud专栏

redisson分布式锁源码和原理浅析

之前写过一篇使用redisson完成简单的分布式锁的文章,https://blog.csdn.net/tianyaleixiaowu/article/detai...

40620
来自专栏JiekeXu之路

Redis数据库安装

REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。

7520
来自专栏Java架构学习路线

一线互联网公司Redis使用精髓,你必须要掌握这4点!

11、MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 中的数据都是热点数据?

9530
来自专栏Java学习录

Prometheus-Operation钉钉报警

此时我们打开浏览器,访问ip:9121这个地址就可以获取到redis的监控信息了。

26310
来自专栏业余草

手把手教你使用 Redis 实现排行榜

原文链接:https://www.cnblogs.com/chenzhuantou/p/11321848.html

14730
来自专栏AI科技时讯

Redis 命令时间花费多原因及解决办法

做实时推荐流遇到的问题,一般推荐流是将大的推荐列表划分成多块固定长度(不固定也可以)的内容,并且会记录之前看过的东西,在每次点击刷新后,吐出去来的新的固定块内容...

8240

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励