在使用 Spring Data Redis 操作 Redis 时,大多数用户可能会使用 RedisTemplate 类及其对应的包 org.springframework.data.redis.core 来操作 Redis。
实际上,模板(RedisTemplate)是 Redis 模块的中心类,因为它具有丰富的功能集。虽然 RedisConnection 提供了接受和返回二进制值(字节数组)的低级方法,但模板(RedisTemplate)负责序列化和连接管理,使用户免于处理此类的细节。
此外,该模板(RedisTemplate)提供了操作视图(按照 Redis 命令参考中的分组进行分类型操作),这些视图提供了丰富的通用接口,用于处理特定类型或特定键(通过 KeyBound 接口),如下表所述:
接口 | 描述 |
键类型操作(Key Type Operations) | |
GeoOperations | Redis 地理空间操作,例如 GEOADD、GEORADIUS、... |
HashOperations | Redis hash 操作 |
HyperLogLogOperations | Redis HyperLogLog 操作,例如 PFADD、PFCOUNT、... |
ListOperations | Redis list 操作 |
SetOperations | Redis set 操作 |
ValueOperations | Redis string (或 value) 操作 |
ZSetOperations | Redis zset (或 sorted set) 操作 |
键绑定操作(Key Bound Operations) | |
BoundGeoOperations | Redis 键绑定地理空间操作 |
BoundHashOperations | Redis hash 键绑定操作 |
BoundKeyOperations | Redis 键绑定操作 |
BoundListOperations | Redis list 键绑定操作 |
BoundSetOperations | Redis set 键绑定操作 |
BoundValueOperations | Redis string (或 value) 键绑定操作 |
BoundZSetOperations | Redis zset (或 sorted set) 键绑定操作 |
注意:配置好后,模板(RedisTemplate)是线程安全的,可以跨多个实例重用。
RedisTemplate 对其大部分操作使用基于 Java 的序列化程序。这意味着模板(RedisTemplate)写入或读取的任何对象都通过Java进行序列化和反序列化。
您可以更改模板上的序列化机制,Redis 模块提供了几种实现,可在 org.springframework.data.redis.serializer 包中找到。
您还可以通过将 enableDefaultSerializer 属性设置为 false 将任何序列化程序设置为 null 并将 RedisTemplate 与原始字节数组一起使用。
注意:模板要求所有键都是非空的。但是,只要底层序列化程序接受它们为空,值就可以为空。
对于需要某个模板视图的情况,将该视图声明为依赖项并注入模板。容器自动执行转换,消除了 opsFor[X] 调用,如下例所示:
XML 配置:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/> <!-- redis template 定义 --> <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnectionFactory"/> <!-- ... --> </beans>
Java 代码:
public class Example { // 注入实际模板 @Autowired private RedisTemplate<String, String> template; // 将模板作为 ListOperations 注入 @Resource(name="redisTemplate") private ListOperations<String, String> listOps; public void addLink(String userId, URL url) { listOps.leftPush(userId, url.toExternalForm()); } }