首页 > 数据库 >redisson实现序列化的方法

redisson实现序列化的方法

时间:2023-07-18 10:57:19浏览次数:36  
标签:fastjson redisson buffer io import 序列化 方法

引用:https://www.fengnayun.com/news/content/102781.html

这篇文章运用简单易懂的例子给大家介绍redisson实现序列化的方法,代码非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

Redisson

是架设在Redis基础上的一个Java驻内存数据网格(In-Memory Data Grid)。

Redisson在基于NIO的Netty框架上,充分的利用了Redis键值数据库提供的一系列优势,在Java实用工具包中常用接口的基础上,为使用者提供了一系列具有分布式特性的常用工具类。使得原本作为协调单机多线程并发程序的工具包获得了协调分布式多机多线程并发系统的能力,大大降低了设计和研发大规模分布式系统的难度。同时结合各富特色的分布式服务,更进一步简化了分布式环境中程序相互之间的协作。

兼容 Redis 2.6+ and JDK 1.6+,使用Apache License 2.0授权协议,阅读 wiki 来获取更多使用信息

序列化

Redisson的对象编码类是用于将对象进行序列化和反序列化,以实现对该对象在Redis里的读取和存储。

由Redisson默认的编码器为JsonJacksonCodec,JsonJackson在序列化有双向引用的对象时,会出现无限循环异常。而fastjson在检查出双向引用后会自动用引用符$ref替换,终止循环。

在我的情况中,我序列化了一个service,这个service已被spring托管,而且和另一个service之间也相互注入了,用fastjson能 正常序列化到redis,而JsonJackson则抛出无限循环异常。

为了序列化后的内容可见,所以不用redission其他自带的二进制编码器,自行实现编码器:

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import io.netty.buffer.ByteBufInputStream;
import io.netty.buffer.ByteBufOutputStream;
import org.redisson.client.codec.BaseCodec;
import org.redisson.client.protocol.Decoder;
import org.redisson.client.protocol.Encoder;

import java.io.IOException;

public class FastjsonCodec extends BaseCodec {

 private final Encoder encoder = in -> {
 ByteBuf out = ByteBufAllocator.DEFAULT.buffer();
 try {
 ByteBufOutputStream os = new ByteBufOutputStream(out);
 JSON.writeJSONString(os, in,SerializerFeature.WriteClassName);
 return os.buffer();
 } catch (IOException e) {
 out.release();
 throw e;
 } catch (Exception e) {
 out.release();
 throw new IOException(e);
 }
 };

 private final Decoder<Object> decoder = (buf, state) ->
 JSON.parseObject(new ByteBufInputStream(buf), Object.class);

 @Override
 public Decoder<Object> getValueDecoder() {
 return decoder;
 }

 @Override
 public Encoder getValueEncoder() {
 return encoder;
 }
}

  关于redisson实现序列化的方法就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

标签:fastjson,redisson,buffer,io,import,序列化,方法
From: https://www.cnblogs.com/baicaowei/p/17562228.html

相关文章

  • 时间序列的季节性:3种模式及8种建模方法
    分析和处理季节性是时间序列分析中的一个关键工作,在本文中我们将描述三种类型的季节性以及常见的8种建模方法。什么是季节性?季节性是构成时间序列的关键因素之一,是指在一段时间内以相似强度重复的系统运动。季节变化可以由各种因素引起,例如天气、日历或经济条件。各种应用程......
  • 3基于架构的软件开发方法
    ABSD是以架构为驱动,由业务、质量(非功能)和功能需求组合驱动架构设计ABSD有三个基础,1软件功能分解,2选择架构风格实现业务和质量需求,3软件模板视角和视图,用不同的视角就会有不同视图用例来捕获功能需求,场景来捕获质量需求 架构开发过程:架构需求:需求从需求库获取、构件标识(生......
  • 电脑桌面app客户端、微信公众号-小程序测试方法
    1、找到微信小程序的网络通信exe程序打开任务管理器,找到微信的网络通信exe程序右键打开文件位置2、安装代理软件proxifiler下载地址:https://download.csdn.net/download/weixin_43264067/87672675无脑下一步,傻瓜式操作安装好后,打开app3、配置代理服务器设置为burp地......
  • 魔法方法之__call__
    __call__方法详解1'''2__call__()是一个特殊方法,用于使对象可以像函数一样被调用。当我们使用对象名加括号的形式来调用对象时,会调用该对象的__call__()方法。34详解:51.__call__(self,*args,**kwargs)方法接受任意数量的参数和关键字参数。62.......
  • 魔法方法之__contains__()
    1'''2__contains__()是一个特殊方法,用于定义对象是否包含某个元素的逻辑。它在使用in运算符检查成员关系时被调用。34详解:51.__contains__(self,item)方法接受一个参数item,表示要检查的元素。62.该方法应返回一个布尔值,指示对象是否包含给定的......
  • HandlerMethodArgumentResolver方法参数解析器的使用
    一、使用场景介绍HandlerMethodArgumentResolver,中文称为方法参数解析器,是SpringWeb(SpringMVC)组件中的众多解析器之一,主要用来对Controller中方法的参数进行处理。在一般的接口调用场景下,每次调用Controller都需要检查请求中的token信息,并根据token还原用户信息,然后将用户信息封......
  • 魔法方法之__iter__(self) && __next__(self)
    __iter____iter__(self)是一个特殊方法,用于返回一个迭代器对象,使得自定义的类可以支持迭代操作。最佳实践:在自定义类中实现 __iter__() 方法时,应该返回一个迭代器对象,通常是自身的实例。迭代器对象应该实现 __next__() 方法,用于返回容器中的下一个元素,并在没有更多元素......
  • Fastjson反序列化
    Fastjson反序列化漏洞fastjson是阿里巴巴公司推出的一个用于快速处理json数据的java类库,这个库由于在传输json数据的时候,中间有一个标识,这个标识允许用户传入一个类名,因此攻击者可以传入他想要执行的类,通过执行这个类,调用rmi方法,去执行他部署的一个恶意方法json一种特殊的数据......
  • 欧姆龙ci2m以太网通讯连接力控方法
    JM-ETH-CP转以太网模块采用即插即用设计,不占用PLC通讯口,即编程软件/上位机软件通过以太网对PLC数据监控的同时,触摸屏可以通过复用接口与PLC进行通讯。捷米特JM-ETH-CP转以太网模块支持工控领域内绝大多数SCADA软件,支持欧姆龙以太网协议和透传两种通讯方式。  捷米特J......
  • Python 运行 shell 命令的一些方法
    哈喽大家好,我是咸鱼我们知道,python在自动化领域中被广泛应用,可以很好地自动化处理一些任务就比如编写Python脚本自动化执行重复性的任务,如文件处理、数据处理、系统管理等需要运行其他程序或者与操作系统交互的任务那么今天我们来看一下在python中如何运行shell命令来与......