您的位置:

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有了更深入的了解。

顶部