一、简介
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六、总结
RedisTemplate是Spring Data Redis提供的核心组件之一,它提供了针对Redis的五大数据类型(String、Hash、List、Set和Zset)的读写操作方法,以及针对事务和Lua脚本的操作方法。通过连接池配置、基本用法、扫描操作和事务和Lua脚本操作的示例,我们对RedisTemplate有了更深入的了解。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/283140.html
微信扫一扫
支付宝扫一扫