StringRedisTemplate的用法详解
StringRedisTemplate 继承自 RedisTemplate,默认使用 StringRedisSerializer 来序列化 key 和 value,适合处理字符串类型的数据。
使用该类需要在maven中添加
依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>配置获redis配置信息
@Configuration
public class RedisConfig {@Beanpublic StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory) {StringRedisTemplate template = new StringRedisTemplate();template.setConnectionFactory(factory);return template;}
}获取对象
@Autowired
private StringRedisTemplate stringRedisTemplate;基本使用技巧
// 设置值
stringRedisTemplate.opsForValue().set("key1", "value1");
stringRedisTemplate.opsForValue().set("key2", "value2", Duration.ofMinutes(10)); // 设置过期时间
// 获取值
String value1 = stringRedisTemplate.opsForValue().get("key1");
// 设置多个值
Map<String, String> map = new HashMap<>();
map.put("key3", "value3");
map.put("key4", "value4");
stringRedisTemplate.opsForValue().multiSet(map);
// 获取多个值
List<String> values = stringRedisTemplate.opsForValue().multiGet(Arrays.asList("key1", "key2"));
// 递增递减
Long result = stringRedisTemplate.opsForValue().increment("counter", 1); // +1
Long result2 = stringRedisTemplate.opsForValue().decrement("counter", 1); // -1
// 追加字符串
Integer newLength = stringRedisTemplate.opsForValue().append("key1", "_append");
// 设置值
stringRedisTemplate.opsForValue().set("key1", "value1");
stringRedisTemplate.opsForValue().set("key2", "value2", Duration.ofMinutes(10)); // 设置过期时间// 获取值
String value1 = stringRedisTemplate.opsForValue().get("key1");// 设置多个值
Map<String, String> map = new HashMap<>();
map.put("key3", "value3");
map.put("key4", "value4");
stringRedisTemplate.opsForValue().multiSet(map);// 获取多个值
List<String> values = stringRedisTemplate.opsForValue().multiGet(Arrays.asList("key1", "key2"));// 递增递减
Long result = stringRedisTemplate.opsForValue().increment("counter", 1); // +1
Long result2 = stringRedisTemplate.opsForValue().decrement("counter", 1); // -1// 追加字符串
Integer newLength = stringRedisTemplate.opsForValue().append("key1", "_append");对键的操作
// 判断键是否存在
Boolean exists = stringRedisTemplate.hasKey("key1");// 删除键
Boolean deleted = stringRedisTemplate.delete("key1");
Long deletedCount = stringRedisTemplate.delete(Arrays.asList("key1", "key2"));// 设置过期时间
Boolean expired = stringRedisTemplate.expire("key2", Duration.ofMinutes(30));// 获取剩余生存时间
Long ttl = stringRedisTemplate.getExpire("key2");// 查找匹配的键
Set<String> keys = stringRedisTemplate.keys("user:*");// 随机获取一个键
String randomKey = stringRedisTemplate.randomKey();实际运用完整示例
缓存使用
@Service
public class UserService {@Autowiredprivate StringRedisTemplate stringRedisTemplate;private static final String USER_KEY_PREFIX = "user:";private static final Duration CACHE_TTL = Duration.ofHours(1);public void cacheUser(String userId, String userInfo) {String key = USER_KEY_PREFIX + userId;stringRedisTemplate.opsForValue().set(key, userInfo, CACHE_TTL);}public String getCachedUser(String userId) {String key = USER_KEY_PREFIX + userId;return stringRedisTemplate.opsForValue().get(key);}public void deleteCachedUser(String userId) {String key = USER_KEY_PREFIX + userId;stringRedisTemplate.delete(key);}
}分布式锁示例
@Component
public class RedisDistributedLock {@Autowiredprivate StringRedisTemplate stringRedisTemplate;public boolean tryLock(String lockKey, String requestId, long expireTime) {return stringRedisTemplate.opsForValue().setIfAbsent(lockKey, requestId, Duration.ofSeconds(expireTime));}public boolean releaseLock(String lockKey, String requestId) {String currentValue = stringRedisTemplate.opsForValue().get(lockKey);if (requestId.equals(currentValue)) {stringRedisTemplate.delete(lockKey);return true;}return false;}
}
