一、简介
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 RedisTemplateredisTemplate(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 RedisTemplateredisTemplate; 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 Setmembers(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 Setrange(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(); RedisSerializerserializer = 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