首頁  >  文章  >  資料庫  >  SpringBoot中怎麼使用Redis

SpringBoot中怎麼使用Redis

WBOY
WBOY轉載
2023-06-02 14:43:211992瀏覽

1.依賴

maven依賴如下,需要說明的是,spring-boot-starter-data-redis裡預設是使用lettuce作為redis客戶端的驅動,但是lettuce其實用的比較少,我們常用的還是jedis作為客戶端的驅動,所以這裡排除掉lettuce,引入jedis:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <exclusions>
        <exclusion>
            <groupId>io.lettuce</groupId>
            <artifactId>lettuce-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>

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

2.依賴關係

spring data redis中依賴的關係:

SpringBoot中怎麼使用Redis

#這個依賴關係想表達的是,Spring 是透過RedisConnection操作Redis的,RedisConnection 則對原生的Jedis 行封裝。要取得RedisConnection介面物件是透過RedisConnectionFactory 產生的 。

3.設定

設定檔進行設定:

# Redis 连接配置
# 单机 Redis
spring.redis.host=127.0.0.1
spring.redis.port=6379
# 连接池配置
spring.redis.jedis.pool.max-idle=30
spring.redis.jedis.pool.max-total=50
spring.redis.jedis.pool.max-wait=2000ms

程式碼進行設定:

@Configuration
public class RedisConfig {
    private RedisConnectionFactory connectionFactory = null;
 
    @Bean
    public RedisConnectionFactory initRedisConnectionFactory(){
        if(connectionFactory!=null){
            return connectionFactory;
        }
        JedisPoolConfig poolConfig =new JedisPoolConfig();
        //最大空闲数
        poolConfig.setMaxIdle(30);
        //最大连接数
        poolConfig.setMaxTotal(50);
        //最大等待毫秒数
        poolConfig.setMaxWaitMillis(2000);
        //创建Jedis连接工厂
        JedisConnectionFactory connectionFactory=new JedisConnectionFactory(poolConfig);
        //获取单机的redis配置,如果是集群的话用集群配置类
        RedisStandaloneConfiguration rscfg=connectionFactory.getStandaloneConfiguration();
        connectionFactory.setHostName("127.0.0.1");
        connectionFactory.setPort(6379);
        return connectionFactory;
    }
}

4.RedisTemplate

這裡要說明的是如果是直接使用RedisConnection來操作redis就需要我們手動去找RedisConnectionFactory拿RedisConnection,並且需要每次手動關閉RedisConnection。所以Spring Data Redis裡面提供了RedisTemplate來方便操作,其封裝自jedis,屏蔽了資源取得和釋放的步驟。

使用RedisTemplate的時候要注意的核心是它的序列化器,RedisTemplate有多種序列化器,不同的序列化器在鍵值寫入、讀出redis的過程中使用的序列化方式會不同,序列化出來的結果也會不同。例如,在處理字元時需要使用字串專用的序列化器,在處理物件時需要使用物件專用的序列化器。

目前有的序列化器如下:

SpringBoot中怎麼使用Redis

StringRedisSerializer:

##StringRedisSerializer 是RedisTemplate 預設使用的Key和Value 的序列化器,它將字串序列化為位元組數組,使用UTF-8 編碼。由於 Redis 中 Key 和 Value 都是字串,因此預設的 StringRedisSerializer 序列化器已經可以滿足大部分情況的需要。

Jackson2JsonRedisSerializer:

Jackson2JsonRedisSerializer 是一個基於Jackson 的Redis Key 和Value 的序列化器,它可以將物件序列化為JSON 格式的字串,並儲存到Redis 中。使用 Jackson2JsonRedisSerializer 序列化器需要加入 Jackson 的依賴,可以將物件轉換為 JSON 格式的字串,也可以將 JSON 格式的字串轉換為物件。

JdkSerializationRedisSerializer:

JdkSerializationRedisSerializer 是一種基於 Java 自帶的序列化方式的序列化器,它可以將物件序列化為位元組陣列儲存。雖然 JdkSerializationRedisSerializer 簡單易用,但是它的效率比較低,序列化後的位元組陣列也比較大,不適合儲存大量的資料。

GenericJackson2JsonRedisSerializer:

GenericJackson2JsonRedisSerializer 是一個支援泛型的 Jackson2JsonRedisSerializer,它可以序列化任意類型的對象,並將物件序列化為 JSON 格式的字串。它在序列化和反序列化時都需要指定目標類型。

OxmSerializer:

OxmSerializer 是基於 Spring 的 O/X 映射框架的序列化器,它支援將物件序列化為 XML 格式的字串。儘管OxmSerializer有很高的靈活性,但是其序列化和反序列化效能較低,不適合儲存大量資料。

總之,在選擇序列化器時需要根據實際情況進行選擇,根據資料類型和效能要求選擇合適的序列化器。

使用的時候直接set進去即可,set的時候給了很多生效粒度選擇,是對所有redis類型的資料結構都生效,還是對某一類redis的資料結構類型生效:

SpringBoot中怎麼使用Redis

例如我想使用String序列化器,在全域都生效:

@Bean
public RedisTemplate<Object,Object> initRedisTemplate(){
  RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
  redisTemplate.setDefaultSerializer(new StringRedisSerializer());
  return redisTemplate;
}

5.基礎操作

以下是使用RedisTemplate操作redis基本資料型別的程式碼範例:

要注意的是@Bean定義RedisTemplate的時候泛型要和使用時的泛型對齊。

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.SetOperations;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
@Service
public class RedisService {
 
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
 
    public void setString(String key, String value) {
        stringRedisTemplate.opsForValue().set(key, value);
    }
 
    public String getString(String key) {
        return stringRedisTemplate.opsForValue().get(key);
    }
 
    public void setHash(String key, String hashKey, Object value) {
        HashOperations<String, String, Object> hashOps = redisTemplate.opsForHash();
        hashOps.put(key, hashKey, value);
    }
 
    public Object getHash(String key, String hashKey) {
        HashOperations<String, String, Object> hashOps = redisTemplate.opsForHash();
        return hashOps.get(key, hashKey);
    }
 
    public void setList(String key, Object value) {
        ListOperations<String, Object> listOps = redisTemplate.opsForList();
        listOps.rightPush(key, value);
    }
 
    public Object getList(String key, long index) {
        ListOperations<String, Object> listOps = redisTemplate.opsForList();
        return listOps.index(key, index);
    }
 
    public void setSet(String key, Object value) {
        SetOperations<String, Object> setOps = redisTemplate.opsForSet();
        setOps.add(key, value);
    }
 
    public Object getSet(String key) {
        SetOperations<String, Object> setOps = redisTemplate.opsForSet();
        return setOps.members(key);
    }
 
    public void setZSet(String key, Object value, double score) {
        ZSetOperations<String, Object> zsetOps = redisTemplate.opsForZSet();
        zsetOps.add(key, value, score);
    }
 
    public Object getZSet(String key, long start, long end) {
        ZSetOperations<String, Object> zsetOps = redisTemplate.opsForZSet();
        return zsetOps.range(key, start, end);
    }
 
}

6.交易

以下是使用交易的程式碼範例:

@Autowired
private RedisTemplate<String, String> redisTemplate;
 
public void transactionalOperation() {
    // 开启 Redis 事务
    redisTemplate.multi();
 
    try {
        // 执行多个 Redis 命令
        redisTemplate.opsForValue().set("key1", "value1");
        redisTemplate.opsForValue().set("key2", "value2");
 
        // 提交事务
        redisTemplate.exec();
    } catch (Exception e) {
        // 回滚事务
        redisTemplate.discard();
    }
}

以上是SpringBoot中怎麼使用Redis的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除