wordpress站点,微指数官网,百度网站优化,济南企业建站排行榜【Spring连载】使用Spring Data访问Redis#xff08;四#xff09;----RedisTemplate通过RedisTemplate处理对象Working with Objects through RedisTemplate 一、专注String的便利类二、Serializers 大多数用户可能使用RedisTemplate及其相应的包org.springframework.data.r… 【Spring连载】使用Spring Data访问Redis四----RedisTemplate通过RedisTemplate处理对象Working with Objects through RedisTemplate 一、专注String的便利类二、Serializers 大多数用户可能使用RedisTemplate及其相应的包org.springframework.data.redis.core或其reactive变体ReactiveRedisTemplate。由于其丰富的功能集该template实际上是Redis模块的中心类。template为Redis交互提供了高级抽象。虽然[Reactive]RedisConnection提供了接受和返回二进制值byte数组的low-level方法但template负责序列化和连接管理使用户无需处理这些细节。 RedisTemplate类实现了RedisOperations接口其reactive变体ReactiveRedisTemplate实现了ReactiveRedisOperations。 引用[Reactive]RedisTemplate实例上的操作的首选方式是通过[Reactive]RedisOperations接口。 此外template提供了操作视图遵循Redis命令参考中的分组这些视图提供了丰富的通用接口用于通过KeyBound接口对特定类型或特定key进行操作如下表所示 操作视图 接口描述Key Type 操作GeoOperationsRedis geospatial 操作, 例如 GEOADD, GEORADIUS,…HashOperationsRedis hash 操作HyperLogLogOperationsRedis HyperLogLog 操作, 例如 PFADD, PFCOUNT,…ListOperationsRedis list 操作SetOperationsRedis set操作ValueOperationsRedis string (或 value)操作ZSetOperationsRedis zset (或 sorted set)操作Key Bound 操作BoundGeoOperationsRedis key bound geospatial操作BoundHashOperationsRedis hash key bound操作BoundKeyOperationsRedis key bound操作BoundListOperationsRedis list key bound操作BoundSetOperationsRedis set key bound操作BoundValueOperationsRedis string (或 value) key bound操作BoundZSetOperationsRedis zset (或 sorted set) key bound操作
配置后template是线程安全的可以在多个实例中重复使用。 RedisTemplate的大部分操作都使用基于Java的序列化程序。这意味着template写或读的任何对象都通过Java进行序列化和反序列化。 你可以更改template上的序列化机制Redis模块提供了几个实现这些实现在org.springframework.data.redis.serializer包中提供。有关详细信息请参阅序列化程序。你还可以将任何序列化程序设置为null并通过将enableDefaultSerializer属性设置为false让RedisTemplate使用原始字节数组raw byte arrays。请注意template要求所有键都为非null。但是只要底层序列化程序接受null值它们就可以为null。有关更多信息请阅读每个序列化程序的Javadoc。 对于需要某个template视图的情况请将该视图声明为依赖项并注入template。容器自动执行转换消除opsFor[X]调用如以下示例所示 配置 Template API
Configuration
class MyConfig {BeanLettuceConnectionFactory connectionFactory() {return new LettuceConnectionFactory();}BeanRedisTemplateString, String redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplateString, String template new RedisTemplate();template.setConnectionFactory(redisConnectionFactory);return template;}
}使用RedisTemplate将一个元素推送到List中
public class Example {// inject the actual operationsAutowiredprivate RedisOperationsString, String operations;// inject the template as ListOperationsResource(nameredisTemplate)private ListOperationsString, String listOps;public void addLink(String userId, URL url) {listOps.leftPush(userId, url.toExternalForm());}
}一、专注String的便利类
由于Redis中存储的键和值通常是java.lang.StringRedis模块为RedisConnection和RedisTemplate提供了两个扩展分别是StringRedisConnection及其DefaultStringRedisConnection实现和StringRedisTemplate作为密集String操作的一站式解决方案。除了绑定到String键之外template和连接还使用了StringRedisSerializer这意味着存储的键和值是可读的假设Redis和代码中使用相同的编码。以下列表显示了一个示例
Configuration
class RedisConfiguration {BeanLettuceConnectionFactory redisConnectionFactory() {return new LettuceConnectionFactory();}BeanStringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {StringRedisTemplate template new StringRedisTemplate();template.setConnectionFactory(redisConnectionFactory);return template;}
}public class Example {Autowiredprivate StringRedisTemplate redisTemplate;public void addLink(String userId, URL url) {redisTemplate.opsForList().leftPush(userId, url.toExternalForm());}
}与其他Spring模板一样RedisTemplate和StringRedisTemplate可以通过RedisCallback接口直接与Redis对话。此功能可以给你完全的控制因为它可以直接与RedisConnection对话。请注意当使用StringRedisTemplate时回调将接收StringRedisConnection的实例。下面的例子展示了如何使用RedisCallback接口
public void useCallback() {redisOperations.execute(new RedisCallbackObject() {public Object doInRedis(RedisConnection connection) throws DataAccessException {Long size connection.dbSize();// Can cast to StringRedisConnection if using a StringRedisTemplate((StringRedisConnection)connection).set(key, value);}});
}二、Serializers
从框架的角度来看Redis中存储的数据只有字节。虽然Redis本身支持各种类型但在大多数情况下这些类型指的是数据的存储方式而不是它所代表的内容。由用户决定是将信息转换为字符串还是任何其他对象。 在Spring Data中用户自定义类型和原始数据之间的转换由Spring Data Redis中的org.springframework.data.redis.serializer包处理。 此包包含两种类型的序列化程序顾名思义它们负责序列化过程
基于RedisSerializer的双向序列化程序。使用RedisElementReader和RedisElementWriter的元素读取器和写入器。
这些变体之间的主要区别在于RedisSerializer主要序列化到byte[]而读写器使用ByteBuffer。 有多种实现包括本文档中已经提到的两种
JdkSerializationRedisSerializer默认用于RedisCache和RedisTemplate。StringRedisSerializer。
但是可以通过Spring OXM支持使用OxmSerializer进行Object/XML映射或者使用Jackson2JsonRedisSerializer或GenericJackson2JsonRedisSerializer以JSON格式存储数据。 请注意存储格式不仅限于值。它可以用于键、值或哈希没有任何限制。
默认情况下RedisCache和RedisTemplate被配置为使用Java native序列化。众所周知Java native序列化允许运行由payloads引起的远程代码这些payloads利用易受攻击的库和类注入未经验证的字节码。操作输入可能导致在反序列化步骤期间在应用程序中运行不需要的代码。因此不要在不受信任的环境中使用序列化。通常强烈建议你使用其他消息格式如JSON。 如果你担心Java序列化导致的安全漏洞请考虑核心JVM级别的通用序列化筛选器机制
筛选传入的序列化数据。JEP 290。OWASP不可信数据的反序列化。