前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Boot 操作 Redis

Spring Boot 操作 Redis

作者头像
chenchenchen
发布2019-09-02 16:50:13
8370
发布2019-09-02 16:50:13
举报
文章被收录于专栏:chenchenchenchenchenchen

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年06月03日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Redis教程:
  • 方案一:Spring Data Redis
    • 创建工程
      • 配置 Redis 信息
        • 自动配置
          • 使用
          • 方案二:Spring Cache
            • 工程创建
              • 基本配置
                • 缓存使用
                  • 总结
                  • 方案三:回归原始时代
                  • springboot整合redis及集群
                  相关产品与服务
                  云数据库 Redis
                  腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档