Springboot系列-整合Redis

Springboot系列-整合Redis

前言:緩存在項目的開發中其中至關重要的作用,比如通過緩存可以減少服務器數據庫的壓力,本篇博客將主要對於redis整合進行介紹,如果大家對redis還不是特別瞭解的,請訪問博客的另一篇博客:Redis詳解及使用

使用Java操作Redis的方案有很多,Jedis、Spring Data Redis、Spring Cache等,我們將依次進行介紹


1.Spring Data Redis

1.創建工程,引入Redis

在這裏插入圖片描述

2.創建成功後,還需要引入 commos-pool2 和 web 的依賴

<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>

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>

3.在application.properties裏面配置Redis信息和連接池的信息

spring.redis.database=0
spring.redis.password=123456
spring.redis.port=6379
spring.redis.host=192.168.181.1

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

4.自動配置

項目中引入了 Spring Data Redis ,並配置了 Redis 的基本信息,此時,自動化配置就會自動生效,查看源碼如下:

@Configuration(proxyBeanMethods = false)
@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;
   }

}

從源碼中可以看出該配置在 RedisOperations 存在的情況下才會生效(即項目中引入了 Spring Data Redis),然後導入在 application.properties 中配置的屬性和連接池信息;最後,提供了兩個 Bean ,RedisTemplate 和 StringRedisTemplate , StringRedisTemplate 是 RedisTemplate 的子類,兩個的方法基本一致,主要體現在操作的數據類型不同,RedisTemplate 中的兩個泛型都是 Object ,所以存儲的 key 和 value 都可以是一個對象,而 StringRedisTemplate 的 兩個泛型都是 String ,意味者 StringRedisTemplate 的 key 和 value 都只能是字符串,如果開發者不自己配置,默認以上配置生效

5.基本使用

新建service,在service中注入StringRedisTemplate 或 RedisTemplate,如下:

@Service
public class DemoService {

    @Autowired
    RedisTemplate redisTemplate;
    public void redis(){
        //RedisTemplate 中,key 默認的序列化方案是 JdkSerializationRedisSerializer,使用 StringRedisTemplate可避免key帶有前綴
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        ValueOperations ops = redisTemplate.opsForValue();
        ops.set("key","redis");
        Object o = ops.get("key");
        System.out.println(o);
    }
}

Redis 中的數據操作,可以分爲兩種,一種是針對 key 的操作,相關的方法就在 RedisTemplate 中,另一種是針對具體數據類型的操作,相關的方法需要首先獲取對應的數據類型,獲取相應數據類型的操作方法是 opsForXXX;調用該方法就可以將數據存儲到 Redis 中

也可以直接使用 StringRedisTemplate:

@Autowired
StringRedisTemplate stringRedisTemplate;
public void redis(){
    ValueOperations ops = stringRedisTemplate.opsForValue();
    ops.set("key","redis");
    Object o = ops.get("key");
    System.out.println(o);
}

2.Spring Cache

在上述的Spring Boot中整合Redis中,開發者只需要引入Spring Data Redis依賴,然後配置redis的基本信息,系統就會提供一個RedisTemplate供開發者使用;接下來講的是結合Cache的用法在Spring Boot中,使用Redis來作爲Cache的實現,進而實現數據的緩存

1.pom.xml配置

和上面新建工程原理一樣,區別是去除commons 依賴後引入一個 cache 依賴,如下:

<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>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

2.在application.properties配置文件中配置cache如下:

spring.cache.cache-names=wxy(緩存名)
spring.redis.port=6379
spring.redis.host=192.168.131.1

3.修改啓動類,添加@EnableCaching,表示開啓緩存,如下:

@SpringBootApplication
@EnableCaching
public class DataredisApplication {

    public static void main(String[] args) {
        SpringApplication.run(DataredisApplication.class, args);
    }
}

4.完成如上配置後,Spring Boot會自動在後臺配置一個RedisCacheManager,源碼如下:

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(RedisConnectionFactory.class)
@AutoConfigureAfter(RedisAutoConfiguration.class)
@ConditionalOnBean(RedisConnectionFactory.class)
@ConditionalOnMissingBean(CacheManager.class)
@Conditional(CacheCondition.class)
class RedisCacheConfiguration {

   @Bean
   RedisCacheManager cacheManager(CacheProperties cacheProperties, CacheManagerCustomizers cacheManagerCustomizers,
         ObjectProvider<org.springframework.data.redis.cache.RedisCacheConfiguration> redisCacheConfiguration,
         ObjectProvider<RedisCacheManagerBuilderCustomizer> redisCacheManagerBuilderCustomizers,
         RedisConnectionFactory redisConnectionFactory, ResourceLoader resourceLoader) {
      RedisCacheManagerBuilder builder = RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(
            determineConfiguration(cacheProperties, redisCacheConfiguration, resourceLoader.getClassLoader()));
      List<String> cacheNames = cacheProperties.getCacheNames();
      if (!cacheNames.isEmpty()) {
         builder.initialCacheNames(new LinkedHashSet<>(cacheNames));
      }
      redisCacheManagerBuilderCustomizers.orderedStream().forEach((customizer) -> customizer.customize(builder));
      return cacheManagerCustomizers.customize(builder.build());
   }
}

根據如上源碼可以看出系統會自動提供一個RedisCacheManager的Bean,這個RedisCacheManager間接實現了Spring中的Cache接口,有了這個Bean,就可以直接使用Spring中的緩存註解和接口,而緩存數據則會被自動存儲到Redis上

5.緩存使用

@CacheConfig:用來描述該類中所有方法使用的緩存名稱,當然也可以不使用該註解,直接在具體的緩存註解上配置名稱,如下:

@Service
@CacheConfig(cacheNames = "wxy")
public class UserService {
}

@Cacheable:一般加在查詢方法上,表示將一個方法的返回值緩存起來,默認情況下,緩存的key就是方法的參數,緩存的value就是方法的返回值,如下:

@Cacheable(key = "#id")
public User getUserById(Integer id) {    
     System.out.println("getUserById");    
     return userMapper.getUserById(id);
}

@CachePut:一般加在更新方法上,數據庫數據更新後,緩存中的數據也要更新,使用該註解,可以將方法的返回值自動更新到已經存在的key上,代碼如下:

@CachePut(key = "#user.id")
public User updateUserById(User user) {    
      return user;
}

@CacheEvict:一般加在刪除方法上,數據庫數據刪除後,相關的緩存數據也要自動清除,該註解在使用的時候也可以配置按照某種條件刪除或者配置清除所有緩存,示例代碼如下:

@CacheEvict()
public void deleteUserById(Integer id) {    
   //從數據庫中刪除數據
}

3.Jedis

最後講到關於Jedis操作,其實相對於以上兩種,Jedis相對用的少一些,所以在此做出簡單的介紹,可以用 JAVA SE工程來測試

1.新建一個普通的maven項目即可,然後添加依賴如下:

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>

2.創建一個類,測試程序是否連接成功,如下:

public static void main(String[] args) {
    Jedis jedis = new Jedis("192.168.131.1", 6379);
    String ping = jedis.ping();
    System.out.println(ping);
}

3.控制檯輸出如下表示成功
在這裏插入圖片描述

4.Jedis類中方法名稱和redis中的命令基本是一致的,我們可以通過Jedis創建一個連接池,如下:

public static void main(String[] args) {
    GenericObjectPoolConfig config = new GenericObjectPoolConfig();
    //連接池的最大數據庫連接數,0表示無限制
    config.setMaxTotal(100);
    //最大空閒數,數據庫連接的最大空閒時間,超過空閒時間,數據庫連接將被標記爲不可用,然後被釋放,設爲0表示無限制
    config.setMaxIdle(20);
    JedisPool jedisPool = new JedisPool(config, "192.168.131.1", 6379);
    Jedis jedis = jedisPool.getResource();
    System.out.println(jedis.ping());
}

以上創建完連接池之後就不會頻繁創建和銷燬連接了,在JavaSE環境中可以把連接池配置成一個單例模式,如果用了Spring容器的話,可通過Spring容器管理…

結語:【end】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章