RedisTemplateScan詳解

一、簡介

Redis是一種開源內存數據結構存儲,常用於緩存、消息中間件、排行榜、計數器等應用場景。Spring Data Redis提供了對Redis的支持,包括連接池、序列化、事務、Lua腳本執行等功能。RedisTemplate是Spring Data Redis提供的核心組件之一,它是對RedisTemplateBuilder的封裝,提供了更方便的API,支持多種數據結構的讀寫操作。

二、連接池配置

Redis連接池是Redis客戶端與服務端連接的一種池化方式,它可以循環使用連接並且自動維護連接的可用性和數量。Spring Data Redis提供了JedisConnectionFactory和LettuceConnectionFactory兩種連接池實現,它們的配置方式也類似。

@Configuration
public class RedisConfig {
 
    @Value("${spring.redis.host}")
    private String host;
 
    @Value("${spring.redis.port}")
    private int port;
 
    @Value("${spring.redis.password}")
    private String password;
 
    @Value("${spring.redis.timeout}")
    private int timeout;
 
    @Value("${spring.redis.jedis.pool.max-active}")
    private int maxTotal;
 
    @Value("${spring.redis.jedis.pool.max-wait}")
    private long maxWaitMillis;
 
    @Value("${spring.redis.jedis.pool.max-idle}")
    private int maxIdle;
 
    @Value("${spring.redis.jedis.pool.min-idle}")
    private int minIdle;
 
    @Bean
    public JedisPoolConfig jedisPoolConfig() {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxTotal(maxTotal);
        jedisPoolConfig.setMaxIdle(maxIdle);
        jedisPoolConfig.setMinIdle(minIdle);
        jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
        return jedisPoolConfig;
    }
 
    @Bean
    public JedisConnectionFactory jedisConnectionFactory(JedisPoolConfig jedisPoolConfig) {
        JedisConnectionFactory factory = new JedisConnectionFactory();
        factory.setHostName(host);
        factory.setPort(port);
        factory.setTimeout(timeout);
        factory.setUsePool(true);
        factory.setPoolConfig(jedisPoolConfig);
        factory.setPassword(password);
        return factory;
    }
 
    @Bean
    public RedisTemplate redisTemplate(JedisConnectionFactory jedisConnectionFactory) {
        RedisTemplate redisTemplate = new RedisTemplate();
        redisTemplate.setConnectionFactory(jedisConnectionFactory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

三、基本用法

RedisTemplate提供了針對Redis的五大數據類型(String、Hash、List、Set和Zset)的讀寫操作方法,以及針對事務和Lua腳本的操作方法。

1. 緩存數據

RedisTemplate的最常用功能就是緩存數據了,下面是一個簡單的緩存String類型數據的示例:

@Autowired
private RedisTemplate redisTemplate;
 
public void set(String key, String value) {
    redisTemplate.opsForValue().set(key, value);
}
 
public String get(String key) {
    return (String) redisTemplate.opsForValue().get(key);
}

2. Hash操作

Redis的Hash類型是一種string類型的field和value的映射表,適合存儲對象。以下是一個簡單的存取對象的示例:

public void set(User user) {
    redisTemplate.opsForHash().put("users", user.getId(), user);
}
 
public User get(Long id) {
    return (User) redisTemplate.opsForHash().get("users", id);
}

3. List操作

Redis的List類型是一種有序列表,可以向列表兩端添加或彈出元素。以下是一個簡單的存取List的示例:

public void push(String key, String value) {
    redisTemplate.opsForList().rightPush(key, value);
}
 
public String pop(String key) {
    return (String) redisTemplate.opsForList().leftPop(key);
}

4. Set操作

Redis的Set類型是無序集合,類似於Java中的Set。以下是一個簡單的Set存取示例:

public void add(String key, String value) {
    redisTemplate.opsForSet().add(key, value);
}
 
public Set members(String key) {
    return redisTemplate.opsForSet().members(key);
}

5. Zset操作

Redis的Zset類型是一種有序集合,每個元素關聯一個分數,用於排序和排名。以下是一個簡單的Zset存取示例:

public void add(String key, String value, double score) {
    redisTemplate.opsForZSet().add(key, value, score);
}
 
public Set range(String key, long start, long end) {
    return redisTemplate.opsForZSet().range(key, start, end);
}

四、掃描操作

Redis底層存儲結構是字典,它使用哈希演算法將key映射為下標,然後存儲在一個數組中。當Redis中的key比較多時,遍歷整個字典會很耗時。Redis提供了SCAN命令來遍曆數據,SCAN命令可以將遍歷操作分成多個步驟,避免對CPU和網路帶寬的影響。

以下是一個使用RedisTemplate和SCAN命令的掃描示例:

public void scan() {
    ScanOptions options = ScanOptions.scanOptions().match("*").count(100).build();
    RedisSerializer serializer = new StringRedisSerializer();
    Cursor cursor = redisTemplate.getConnectionFactory().getConnection().scan(options);
    while (cursor.hasNext()) {
        byte[] key = cursor.next();
        System.out.println(serializer.deserialize(key));
    }
}

五、事務和Lua腳本操作

Redis的事務和Lua腳本操作可以保證一系列操作的原子性,並在一定程度上提高性能。RedisTemplate提供了對事務和Lua腳本的支持,下面是一個簡單的事務和Lua腳本操作示例:

public void execute() {
    redisTemplate.execute(new SessionCallback() {
        @Override
        public Object execute(RedisOperations operations) throws DataAccessException {
            operations.multi();
            operations.boundValueOps("k1").set("v1");
            operations.boundValueOps("k2").set("v2");
            operations.exec();
            return null;
        }
    });
}
 
public Object eval(String script) {
    DefaultRedisScript redisScript = new DefaultRedisScript();
    redisScript.setScriptText(script);
    redisScript.setResultType(Object.class);
    return redisTemplate.execute(redisScript, Collections.singletonList("k1"), Collections.singletonList("v1"));
}

六、總結

RedisTemplate是Spring Data Redis提供的核心組件之一,它提供了針對Redis的五大數據類型(String、Hash、List、Set和Zset)的讀寫操作方法,以及針對事務和Lua腳本的操作方法。通過連接池配置、基本用法、掃描操作和事務和Lua腳本操作的示例,我們對RedisTemplate有了更深入的了解。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/283140.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-22 08:07
下一篇 2024-12-22 08:07

相關推薦

  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁碟中。在執行sync之前,所有的文件系統更新將不會立即寫入磁碟,而是先緩存在內存…

    編程 2025-04-25
  • 神經網路代碼詳解

    神經網路作為一種人工智慧技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網路的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網路模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分散式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25
  • 詳解eclipse設置

    一、安裝與基礎設置 1、下載eclipse並進行安裝。 2、打開eclipse,選擇對應的工作空間路徑。 File -> Switch Workspace -> [選擇…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web伺服器。nginx是一個高性能的反向代理web伺服器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25
  • C語言貪吃蛇詳解

    一、數據結構和演算法 C語言貪吃蛇主要運用了以下數據結構和演算法: 1. 鏈表 typedef struct body { int x; int y; struct body *nex…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • Java BigDecimal 精度詳解

    一、基礎概念 Java BigDecimal 是一個用於高精度計算的類。普通的 double 或 float 類型只能精確表示有限的數字,而對於需要高精度計算的場景,BigDeci…

    編程 2025-04-25
  • MPU6050工作原理詳解

    一、什麼是MPU6050 MPU6050是一種六軸慣性感測器,能夠同時測量加速度和角速度。它由三個感測器組成:一個三軸加速度計和一個三軸陀螺儀。這個組合提供了非常精細的姿態解算,其…

    編程 2025-04-25
  • Python安裝OS庫詳解

    一、OS簡介 OS庫是Python標準庫的一部分,它提供了跨平台的操作系統功能,使得Python可以進行文件操作、進程管理、環境變數讀取等系統級操作。 OS庫中包含了大量的文件和目…

    編程 2025-04-25

發表回復

登錄後才能評論