一、簡介
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/zh-hk/n/283140.html
微信掃一掃
支付寶掃一掃