RedisTemplate 及相关操作接口对比与方法说明
1. RedisTemplate 核心接口与实现类
RedisTemplate 是 Spring Data Redis 的核心模板类,通过 opsFor...
方法返回不同数据类型的操作接口,每个接口对应 Redis 的一种数据结构。以下是主要接口及其实现类:
2. 各操作接口及方法说明
(1) RedisValueOperations<K, V>
- 对应数据类型:字符串(String)
- 实现类:
DefaultRedisScriptingOperations
(内部实现) - 主要方法:
set(K key, V value)
:设置键值对。set(K key, V value, long offset)
:设置指定偏移量的值(如追加字符串)。getExpire(K key)
:获取键的剩余过期时间(毫秒)。multiSet(Map<K, V> map)
:批量设置键值对。increment(K key, long delta)
:对数值键执行递增操作。append(K key, String value)
:追加字符串到现有值末尾。
(2) RedisHashOperations<K, HK, HV>
- 对应数据类型:哈希(Hash)
- 实现类:
DefaultHashOperations
(内部实现) - 主要方法:
put(K key, HK hashKey, HV hashValue)
:在哈希中设置字段值。get(K key, HK hashKey)
:获取哈希中的字段值。entries(K key)
:获取哈希中所有字段和值。hasKey(K key, HK hashKey)
:判断哈希中是否存在字段。increment(K key, HK hashKey, long delta)
:递增哈希中的数值字段。
(3) RedisListOperations<K, V>
- 对应数据类型:列表(List)
- 实现类:
DefaultListOperations
(内部实现) - 主要方法:
leftPush(K key, V value)
:从左侧(头)插入元素。rightPush(K key, V value)
:从右侧(尾)插入元素。leftPop(K key)
:弹出并返回左侧元素。range(K key, long start, long end)
:获取列表切片。trim(K key, long start, long end)
:截取列表到指定范围。
(4) RedisSetOperations<K, V>
- 对应数据类型:集合(Set)
- 实现类:
DefaultSetOperations
(内部实现) - 主要方法:
add(K key, V... values)
:添加元素到集合。remove(K key, V... values)
:从集合中移除元素。members(K key)
:获取集合中所有元素。isMember(K key, V value)
:判断元素是否存在于集合中。randomMember(K key)
:随机获取一个元素。
(5) RedisZSetOperations<K, V>
- 对应数据类型:有序集合(Sorted Set)
- 实现类:
DefaultZSetOperations
(内部实现) - 主要方法:
add(K key, V value, double score)
:添加元素及分数。rangeByScore(K key, double min, double max)
:按分数范围获取元素。score(K key, V value)
:获取元素的分数。removeRangeByScore(K key, double start, double end)
:按分数范围删除元素。rank(K key, V value)
:获取元素的排名(从小到大)。
(6) RedisGeoOperations<K, V>
- 对应数据类型:地理位置(Geo)
- 实现类:
DefaultGeoOperations
(内部实现) - 主要方法:
add(K key, V member, double longitude, double latitude)
:添加地理位置。distance(K key, V member1, V member2)
:计算两点距离。radius(K key, double longitude, double latitude, double radius, RedisGeoCommands.DistanceUnit unit)
:获取指定半径内的元素。position(K key, V member)
:获取元素的经纬度坐标。
(7) RedisStreamOperations<K, V>
- 对应数据类型:流(Stream,Redis 5+)
- 实现类:
DefaultStreamOperations
(内部实现) - 主要方法:
add(K key, StreamEntryID id, Map<Field, V> values)
:向流中添加条目。read(K key, StreamOffset<K> streamOffset)
:读取流数据。acknowledge(K key, Consumer consumer, StreamEntryID... ids)
:确认已处理的条目。trim(K key, long maxEntries)
:按最大条目数截断流。
对比表格
接口 | 对应数据类型 | 核心方法 | 典型场景 |
---|---|---|---|
RedisValueOperations | 字符串(String) | set , get , increment , append | 简单键值存储(如计数器、缓存) |
RedisHashOperations | 哈希(Hash) | put , get , entries , increment | 对象属性存储(如用户资料) |
RedisListOperations | 列表(List) | leftPush , rightPush , leftPop , range | 队列/栈操作(如消息队列) |
RedisSetOperations | 集合(Set) | add , remove , members , isMember | 去重存储(如标签、唯一用户列表) |
RedisZSetOperations | 有序集合(ZSet) | add , rangeByScore , score , rank | 排名/优先级队列(如排行榜) |
RedisGeoOperations | 地理位置(Geo) | add , distance , radius , position | 地理信息查询(如附近商家) |
RedisStreamOperations | 流(Stream) | add , read , acknowledge , trim | 流式数据处理(如日志、事件队列) |
总结与建议
- 选择接口:根据 Redis 数据类型选择对应操作接口(如列表用
RedisListOperations
)。 - 原子性操作:复杂操作可通过
RedisTemplate.execute(SessionCallback)
实现事务性。 - 性能优化:
- 批量操作(如
multiSet
)减少网络开销。 - 使用
RedisTemplate.setEnableTransactionSupport(true)
开启事务支持。
- 批量操作(如
- 高级功能:如地理位置查询(
RedisGeoOperations
)或流处理(RedisStreamOperations
)需结合具体业务场景。
示例代码
@Service
public class RedisService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;public void demoOperations() {// 字符串操作redisTemplate.opsForValue().set("counter", 0);redisTemplate.opsForValue().increment("counter", 1); // 原子递增// 哈希操作redisTemplate.opsForHash().put("user:1001", "name", "张三");redisTemplate.opsForHash().increment("user:1001", "age", 1);// 列表操作redisTemplate.opsForList().rightPush("queue", "message1");redisTemplate.opsForList().leftPop("queue");// 地理位置redisTemplate.opsForGeo().add("locations", "星巴克", 116.397428, 39.90923;);redisTemplate.opsForGeo().radius("locations", 116.3, 39.9, 1000, KILOMETERS);}
}
根据业务需求选择合适的数据类型和接口,灵活使用 Redis 的强大功能!