返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Quarkus集成redis操作Redisson实现数据互通
  • 428
分享到

Quarkus集成redis操作Redisson实现数据互通

2024-04-02 19:04:59 428人浏览 安东尼
摘要

目录前言集成Redis复制Redisson序列化使用前言 博主所在公司大量使用了redis缓存,redis客户端用的Redisson。在Quarkus集成redis时,博主尝试使用R

前言

博主所在公司大量使用了redis缓存,redis客户端用的Redisson。在Quarkus集成redis时,博主尝试使用Redisson客户端直接集成,发现,在JVM模式下运行quarkus没点问题,但是在打native image时,就报错了,尝试了很多方式都是莫名其妙的异常。最后决定采用quarkus官方的redis客户端,但是Redisson客户端数据序列化方式是特有的,不是简单的String,所以quarkus中的redis需要操作Redisson的数据,就要保持序列化方式一致,本文就是为了解决这个问题。

Quarkus版本:1.7.0.CR1

集成redis

首先你的quarkus版本一定要1.7.0.CR1版本及以上才行,因为redis的扩展包是这个版本才发布的,添加依赖:

<dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-redis-client</artifactId>
</dependency>

新增redis链接配置

quarkus.redis.hosts=127.0.0.1:6379
quarkus.redis.database=0
quarkus.redis.timeout=10s
quarkus.redis.passWord=sasa

复制Redisson序列化

Redisson里内置了很多的序列化方式,我们用的JSONJacksonCodec,这里将Redisson中的实现复制后,稍加改动,如下:


public class jsonJacksonCodec{
    public static final JsonJacksonCodec INSTANCE = new JsonJacksonCodec();
    @JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id")
    @JsonAutoDetect(fieldVisibility = Visibility.ANY,
                    getterVisibility = Visibility.PUBLIC_ONLY,
                    setterVisibility = Visibility.NONE,
                    isGetterVisibility = Visibility.NONE)
    public static class ThrowableMixIn {
    }
    protected final ObjectMapper mapObjectMapper;
    public JsonJacksonCodec() {
        this(new ObjectMapper());
    }
    public JsonJacksonCodec(ObjectMapper mapObjectMapper) {
        this.mapObjectMapper = mapObjectMapper.copy();
        init(this.mapObjectMapper);
        initTypeInclusion(this.mapObjectMapper);
    }
    protected void initTypeInclusion(ObjectMapper mapObjectMapper) {
        TypeResolverBuilder<?> mapTyper = new DefaultTypeResolverBuilder(DefaultTyping.NON_FINAL) {
            @Override
            public boolean useForType(JavaType t) {
                switch (_appliesFor) {
                case NON_CONCRETE_AND_ARRAYS:
                    while (t.isArrayType()) {
                        t = t.getContentType();
                    }
                    // fall through
                case OBJECT_AND_NON_CONCRETE:
                    return (t.getRawClass() == Object.class) || !t.isConcrete();
                case NON_FINAL:
                    while (t.isArrayType()) {
                        t = t.getContentType();
                    }
                    // to fix problem with wrong long to int conversion
                    if (t.getRawClass() == Long.class) {
                        return true;
                    }
                    if (t.getRawClass() == XMLGreGorianCalendar.class) {
                        return false;
                    }
                    return !t.isFinal(); // includes Object.class
                default:
                    // case JAVA_LANG_OBJECT:
                    return t.getRawClass() == Object.class;
                }
            }
        };
        mapTyper.init(JsonTypeInfo.Id.CLASS, null);
        mapTyper.inclusion(JsonTypeInfo.As.PROPERTY);
        mapObjectMapper.setDefaultTyping(mapTyper);
    }
    protected void init(ObjectMapper objectMapper) {
        objectMapper.setSerializationInclusion(Include.NON_NULL);
        objectMapper.setVisibility(objectMapper.getSerializationConfig()
                                                    .getDefaultVisibilityChecker()
                                                        .withFieldVisibility(JsonAutoDetect.Visibility.ANY)
                                                        .withGetterVisibility(JsonAutoDetect.Visibility.NONE)
                                                        .withSetterVisibility(JsonAutoDetect.Visibility.NONE)
                                                        .withCreatorVisibility(JsonAutoDetect.Visibility.NONE));
        objectMapper.disable(DeserializationFeature.FaiL_ON_UNKNOWN_PROPERTIES);
        objectMapper.enable(Feature.WRITE_BIGDECIMAL_AS_PLAIN);
        objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
        objectMapper.enable(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY);
        objectMapper.addMixIn(Throwable.class, ThrowableMixIn.class);
    }
    
    public Object decoder(String val){
        try {
            ByteBuf buf = ByteBufAllocator.DEFAULT.buffer();
            try (ByteBufOutputStream os = new ByteBufOutputStream(buf)) {
                os.write(val.getBytes());
            }
            return mapObjectMapper.readValue((InputStream) new ByteBufInputStream(buf), Object.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    
    public String encoder(Object obj){
        ByteBuf out = ByteBufAllocator.DEFAULT.buffer();
        try {
            ByteBufOutputStream os = new ByteBufOutputStream(out);
            mapObjectMapper.writeValue((OutputStream) os, obj);
            return os.buffer().toString(StandardCharsets.UTF_8);
        } catch (IOException e) {
            out.release();
        }
        return null;
    }
}

使用

@Dependent
@Startup
public class Test {
    @Inject
    RedisClient redisClient;
    @Inject
    Logger logger;
    void initializeApp(@Observes StartupEvent ev) {
        //使用JsonJacksonCodec编解码,保持和redisson互通
        JsonJacksonCodec codec = JsonJacksonCodec.INSTANCE;
        Map<String, String> map = new HashMap<>();
        map.put("key","666");
        redisClient.set(Arrays.asList("AAAKEY", codec.encoder(map)));
        String str = redisClient.get("AAAKEY").toString(StandardCharsets.UTF_8);
        Map<String,String> getVal = (Map<String, String>) codec.decoder(str);
        logger.info(getVal.get("key"));
    }

}

以上就是Quarkus集成redis操作Redisson数据实现互通的详细内容,更多关于Quarkus集成redis操作Redisson数据的资料请关注编程网其它相关文章!

--结束END--

本文标题: Quarkus集成redis操作Redisson实现数据互通

本文链接: https://lsjlt.com/news/140138.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Quarkus集成redis操作Redisson实现数据互通
    目录前言集成redis复制Redisson序列化使用前言 博主所在公司大量使用了redis缓存,redis客户端用的Redisson。在Quarkus集成redis时,博主尝试使用R...
    99+
    2024-04-02
  • Spring Boot集成Redis实战操作
    最近在使用Spring Boot,发现其功能真是强大,可以快速的集成很多的组件功能,非常方便:今天就来介绍下,如何集成Redis。定义Redis 是一个高性能的key-value数据库。它支持存储的value类型很多,包括string(字符...
    99+
    2023-06-02
  • Redis数据操作--有序集合
    | Redis 的集合以无序的方式储存多个各不相同的元素 # 用户可以快速地向集合添加元素,或者从集合里面删除元素,也可以对多个集合 进行集合运算操作,比如计算并集,交集和差集...
    99+
    2024-04-02
  • Redis数据操作--无序集合
    | 有序集合和集合一样,都可以包含任意数量的,各不相同的元素,不同于集合 的是,有序集合的每个元素都关联着一个浮点数分值,并且有序集合会按照 分值,以从小到大的顺序来排列有序集合中的各个元素。 &...
    99+
    2024-04-02
  • redis 集群批量操作实现
     Redis集群是没法执行批量操作命令的,如mget,pipeline等。这是因为redis将集群划分为16383个哈希槽,不同的key会划分到不同的槽中。但是,Jedis...
    99+
    2024-04-02
  • python 实现 redis 数据库的操作
    目录一、安装二、连接三、string基本命令四、hash基本命令五、list基本命令六、set基本命令七、zset基本命令八、其他通用命令九、管道命令一、安装 redis 是一个 K...
    99+
    2024-04-02
  • PHP GraphQL与数据库的无缝集成:轻松实现数据操作
    简介 PHP GraphQL是一种用于构建应用程序查询语言(GraphQL)的PHP库。它允许您使用GraphQL来查询和操作您的数据库,而无需编写任何自定义代码。 特性 PHP GraphQL库具有以下特性: 易于使用: 该库非常易...
    99+
    2024-02-03
    关键字: PHP GraphQL 数据库集成 数据操作 Web应用程序
  • SpringBoot集成Redis数据库,实现缓存管理
    目录一、Redis简介  二、Spring2.0集成Redis  1、核心依赖2、配置文件3、简单测试案例4、自定义序列化配置5、序列化测试三、源代码地址&nbs...
    99+
    2024-04-02
  • MySQL与其他数据库的集成与互操作项目经验总结
    MySQL与其他数据库的集成与互操作项目经验总结一、引言MySQL是一种常用的关系型数据库管理系统,广泛应用于各行各业。但在实际应用中,有时我们需要与其他数据库进行集成和互操作,以满足业务需求和数据管理的要求。本文将总结一些MySQL与其他...
    99+
    2023-11-02
    数据库集成 项目经验总结 互操作性
  • python实现与Oracle数据库交互操作示例
    目录1、安装准备2、instantclient的安装说明3、instantclient安装步骤4、还有几个需要注意的地方1)设置NLS_LANG环境变量:解决中文乱码2)关于TNS_...
    99+
    2024-04-02
  • Android集成GreenDao数据库的操作步骤
    数据持久化就是指将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或电脑关机的情况下,这些数据仍然不会丢失。保存在内存中的数据是处于瞬时状态的,而保存在存储设备中的数据是处于持久...
    99+
    2022-11-13
    Android GreenDao数据库 Android集成GreenDao数据库
  • 云数据库同步:实现跨平台互操作性
    在当今快节奏的数字环境中,跨平台互操作性已成为现代应用程序和系统的关键需求。云数据库同步技术通过无缝连接不同平台上的数据库,有效地解决了这一挑战,从而促进无缝数据共享和管理。 跨平台互操作性的优势 云数据库同步提供多种优势,使其成为实现...
    99+
    2024-02-29
    云数据库同步 跨平台互操作性 MySQL PostgreSQL MongoDB
  • java集成itextpdf实现通过pdf模板填充数据生成pdf
    文章目录 一、制作pdf模板1.1、使用excel制作一个表格1.2、转成pdf1.3、设置表单域1.4、最终模版效果 二、引入POM依赖三、代码实现3.1、工具类3.2、实体对象3.3、Controller 一、制作...
    99+
    2023-08-18
    java pdf
  • SpringBoot2如何实现集成JPA持久层框架、简化数据库操作
    这篇文章主要为大家展示了“SpringBoot2如何实现集成JPA持久层框架、简化数据库操作”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SpringBoot2如何实现集成JPA持久层框架、简化...
    99+
    2023-06-02
  • 如何通过memberlist库实现gossip管理集群及集群数据交互问题
    目录通过memberlist库实现gossip管理集群以及集群数据交互概述接口DelegateEventDelegateConflictDelegateMergeDelegatePi...
    99+
    2024-04-02
  • Redis实现数据的交集、并集、补集的示例
    目录场景说明环境说明交并补计算差集的计算交集的计算并集的计算Redis命令说明场景说明 今天我们来模拟一个这样的场景,我们在本地有多个文本文件,每个文件里面存了很多的32位的字符串作为用户的唯一标识,每个用户存做一行,假...
    99+
    2022-08-10
    Redis数据交集 Redis数据并集 Redis数据补集
  • Redis如何实现数据的交集、并集和补集
    本篇内容介绍了“Redis如何实现数据的交集、并集和补集”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!场景...
    99+
    2024-04-02
  • Spring+Redis集成怎么实现关系型数据库持久化
    这篇文章主要讲解了“Spring+Redis集成怎么实现关系型数据库持久化”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring+Redis集成怎么实现关系型数据库持久化”吧!Redis...
    99+
    2023-06-03
  • Redis批量生成数据的实现
    目录Redis批量生成数据Redis自带Debug方法Shell脚本Redis批量生成数据 从研究Redis开始,一直会有一些Redis键值数量或者键值大小的场景要求,显然我们不可能...
    99+
    2024-04-02
  • laravel 从现有的数据库生成模型并通过模型操作数据库
    一:拓展安装 laravel中从现有的数据库生成模型并通过模型操作数据库需要使用到reliese/laravel拓展 reliese/laravel插件地址: https://packagist.org/packages/relie...
    99+
    2023-08-31
    laravel php Powered by 金山文档
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作