GemFire/Geode中的国际化(二)

Gemfire Geode redis区别 GemFire、Apache Geode 和 Redis 是三种不同的数据管理工具,它们之间的区别具体如下: 阅读详情

代码走读

商业产品的代码我们是看不到啦,这里我们就以开源的Geode为例,一起看看哪些区域涉及到了国际化实现。(这里笔者使用了内部研发的代码语法感知工具)首先,我们的目光投在了DataSerializer.java中的writeString和readString方法。

public staticvoid writeString(String value, DataOutput out) throws IOException {
    …
    if (value == null) {
      if (isDebugEnabled) {
        logger.trace(LogMarker.SERIALIZER,"Writing NULL_STRING");
      }
      out.writeByte(DSCODE.NULL_STRING);
 
    } else {
      // 注意这里!考虑到可能引入性能损耗
      // 程序会对单字节还是多字节char进行判断,再决定使用何种write方式
      int len = value.length();
      int utfLen = len; // added for bug 40932
      for (int i = 0; i < len; i++) {
        char c = value.charAt(i);
        if ((c <= 0x007F) && (c>= 0x0001)) {
          // nothing needed
        } else if (c > 0x07FF) {
          utfLen += 2;
        } else {
          utfLen += 1;
        }
      }
      boolean writeUTF = utfLen > len;
      if (writeUTF) {
        if (utfLen > 0xFFFF) {
          if (isDebugEnabled) {
            logger.trace(LogMarker.SERIALIZER,"Writing utf HUGE_STRING of len={}", len);
          }
          out.writeByte(DSCODE.HUGE_STRING);
          out.writeInt(len);
          out.writeChars(value);
        } else {
          if (isDebugEnabled) {
            logger.trace(LogMarker.SERIALIZER,"Writing utf STRING of len={}", len);
          }
          out.writeByte(DSCODE.STRING);
          out.writeUTF(value);
        }
      } else {
        if (len > 0xFFFF) {
          if (isDebugEnabled) {
            logger.trace(LogMarker.SERIALIZER,"Writing HUGE_STRING_BYTES of len={}", len);
          }
          out.writeByte(DSCODE.HUGE_STRING_BYTES);
          out.writeInt(len);
          out.writeBytes(value);
        } else {
          if (isDebugEnabled) {
            logger.trace(LogMarker.SERIALIZER,"Writing STRING_BYTES of len={}", len);
          }
          out.writeByte(DSCODE.STRING_BYTES);
          out.writeShort(len);
          out.writeBytes(value);
        }
      }
    }
  }
 
public staticString readString(DataInput in) throws IOException {
    returnInternalDataSerializer.readString(in, in.readByte());
  }

再看HeapDataOutputStream.java中的writeUTF方法,清晰的看到对于ASCII和non-ASCII字符也有着不同的处理逻辑。

public voidwriteUTF(String str) throws UTFDataFormatException {
    if (this.ignoreWrites)
      return;
    checkIfWritable();
    if (ASCII_STRINGS) {
      writeAsciiUTF(str, true);
    } else {
      writeFullUTF(str, true);
    }
  }
 
private voidwriteFullUTF(String str, boolean encodeLength) throws UTFDataFormatException {
    int strlen = str.length();
    if (encodeLength && strlen >65535) {
      throw new UTFDataFormatException();
    }
//这里也为了3字节字符和长度做了预留
//显然4字节字符是不支持的,大家也不用尝试了
    {
      int maxLen = (strlen * 3);
      if (encodeLength) {
        maxLen += 2;
      }
      ensureCapacity(maxLen);
    }
    int utfSizeIdx = this.buffer.position();
    if (encodeLength) {
      // skip bytes reserved for length
      this.buffer.position(utfSizeIdx + 2);
    }
    for (int i = 0; i < strlen; i++) {
      int c = str.charAt(i);
      if ((c >= 0x0001) && (c <=0x007F)) {
        this.buffer.put((byte) c);
      } else if (c > 0x07FF) {
        this.buffer.put((byte) (0xE0 | ((c>> 12) & 0x0F)));
        this.buffer.put((byte) (0x80 | ((c>> 6) & 0x3F)));
        this.buffer.put((byte) (0x80 | ((c>> 0) & 0x3F)));
      } else {
        this.buffer.put((byte) (0xC0 | ((c>> 6) & 0x1F)));
        this.buffer.put((byte) (0x80 | ((c>> 0) & 0x3F)));
      }
    }
    int utflen = this.buffer.position() -utfSizeIdx;
    if (encodeLength) {
      utflen -= 2;
      if (utflen > 65535) {
        // act as if we wrote nothing to thisbuffer
        this.buffer.position(utfSizeIdx);
        throw new UTFDataFormatException();
      }
      this.buffer.putShort(utfSizeIdx, (short)utflen);
    }
  }

最后看UriUtils.java中的decode方法,代码中提前声明public static final String DEFAULT_ENCODING ="UTF-8"; 解决了缺省码表问题,值得我们在编码过程中效法。

public static String decode(final StringencodedValue) {
    return decode(encodedValue,DEFAULT_ENCODING);
  }
 
public staticString decode(String encodedValue, final String encoding) {
    try {
      if (encodedValue != null) {
        String previousEncodedValue;
 
        do {
          previousEncodedValue = encodedValue;
          encodedValue =URLDecoder.decode(encodedValue, encoding);
        } while(!encodedValue.equals(previousEncodedValue));
      }
 
      return encodedValue;
    } catch (UnsupportedEncodingExceptionignore) {
      return encodedValue;
    }
  }

国际化高危区

在前文讲述Redis的时候,我跟大家一起记住了两个国际化高危方法——serialize/ deseialize,今天就让我们一起再认识两张新面孔——toData / fromData

public classPlayer implements DataSerializable {
  private int id;
  private String name;
  private Date birthday;
  private FC club;
 
  @Override
  public void toData(DataOutput out) throwsIOException {
    out.writeInt(this.id);
    out.writeUTF(this.name);
    DataSerializer.writeDate(this.birthday,out);
    DataSerializer.writeObject(this.club, out);
  }
 
  @Override
  public void fromData(DataInput in) throwsIOException, ClassNotFoundException {
    this.id = in.readInt();
    this.name = in.readUTF();
    this.birthday =DataSerializer.readDate(in);
    this.club = (FC)DataSerializer.readObject(in);
  }
}

一旦参数中包含display_name,description之类可能包含non-ASCII字符时,请务必invoke write orread UTF,否则就只能是你家乱码常打开,开放怀抱等你喽!(〒︿〒)

 

Apache顶级项目8-Geode源码深度分析 Apache顶级项目介绍之Geode。Apache顶级项目介绍之8,我们重新恢复Apache顶级项目系列,较之前介绍系列,我们本文直入代码分析,原因有二,Geode即上文我们分析的Gemfire的开源版本,其二被逼无奈,阅读源码查找问题。 阅读详情

相关推荐

【信息科学与工程学】计算机科学与自动化——第一百三十五篇 开发框架篇 系列二 Spring框架系列 03 Spirng 01

编号机制/用法表现形式和配置编译器(底层实现·说明·缺陷·缺陷解决方案(含数学方程式描述与数学建模))引入版本国产化·信创·商用的CPU/GPU/ASIC/NP/DPU/其他硬件S1控制反转 (IoC)​ / 依赖注入 (DI)​- XML配置 () - Java注解 (, , ) - Java配置类 (, )底层实现: 反射 + 工厂模式 + 容器(Map)。 说明: 通过反射实例化Bean,解析依赖关系并注入。 缺陷: 运行时性能损耗(反射调用慢);循环依赖问题(构造器注入场景)

weixin_49199313的博客 378

GemFire/Geode中的国际化(一)

背景 GemFire 作为一款分布式NoSql内存数据库,用来完成分布式缓存,数据持久化,分布式事物、动态扩展等功能。Geode是其开源版本,于2015年4月发布, 该项目是为了将GemFire改造为依托Apache软件基金会、社区自治、多元化的一个社区项目。github的地址是https://github.com/apache/geode   也许大家对GemFire的名字还是有些陌生

国际化梦工厂 8774

GemFire:对GemFire 源码进行分析

本站点主要是对 gemfire.org 网站的博文进行归档, 主要包括 gemfire 入门,基本特性和高级特性讲解,以及gemfire源码分析等. Overview gemfire基本特性 gemfire高级特性 gemfire源码分析

repost: Geode(java), GemFire

Geode 介绍: Geode是一个提供实时、一致访问大型分布式云平台下数据密集型应用的数据管理平台。 Geode 通过跨多进程,把内存、CPU、网络资源和可选的本地磁盘汇集起来,来管理应用程序对象及其行为。它使用动态复制和数据分片技术,来实现高可用性,改善性能、可伸缩性和容错。Geode 除了是一个分布式数据容器,它还是一个内存数据管理系统,提供了可靠的异步事件通知和有保证的消息传递。 Geode 是一个非常成熟、健壮的产品,多个华尔街交易平台首次将 Geode(称为GemFire™)部署在金融部门。如今

ChengChengCheng的博客 242

gemfire简单搭建

gemfire内存数据库的简单集群搭建,适合于对gemfire无从下手的人

gemfire/geode 文档,配置说明

gemfire/geode从环境部署,搭建,到配置说明,全量的官方文档

GemFire读写示例

新工作中用到了内存数据库Gemfire,本文通过一个示例了解GemFire是如何存储数据以及如何进行数据查询的

码农新手 3690

gemfire开发入门

gemfire开发文档gemfire开发文档gemfire开发文档gemfire开发文档gemfire开发文档gemfire开发文档gemfire开发文档gemfire开发文档gemfire开发文档gemfire开发文档gemfire开发文档gemfire开发文档gemfire开发文档gemfire开发文档gemfire开发文档gemfire开发文档gemfire开发文档gemfire开发文档gemfire开发文档gemfire开发文档gemfire开发文档

Apache Geode/GemFire功能特性简介(1)

区域 复制区域 在区域中所有的数据被复制到每一个缓存服务器节点。复制区域使用了‘multiple masters’复制组织结构。当数据区域被复制(没有分区),对于每一个数据条目没有指定的管理者,来自任意成员的初始更新并发地传播到每一个节点。一旦成功处理了这个事件,ACK作为一个回应发送回初始成员。初始成员接到返回的ACK之后,做出...

weixin_33835690的博客 237

spring-data-gemfire-1.3.4.RELEASE.zip

jfixtures.zip,一个可扩展的java fixtures库在rails和play世界中花了一些时间,我错过了一个简单而有效的fixtures工具来将数据加载到我工作的系统中。

LabVIEW事件结构避坑指南:为什么你的‘确定按钮’事件有时会失灵?

本文深入探讨了LabVIEW事件结构中'确定按钮'事件失灵的常见原因及解决方案。从事件队列机制到事件类型选择,详细分析了事件丢失的五大原因,包括事件处理耗时过长、事件类型选择不当等,并提供了优化登录界面案例的实用建议。掌握这些技巧可显著提升LabVIEW用户界面的响应可靠性。

weixin_42548888的博客 355

Apache Geode/GemFire入门(1)-基本概念和模块

在这个入门中我们将走一遍GemFire应用程序代码,学习GemFire Enterprise基本的特性。这个应用详解了GemFire怎么在VMs宕机情况下并不中断服务。当应用运行时动态地添加更多的存储,并且提供更小的延迟来访问你的数据。 入门概览 主要的概念 本入门涵盖了以下概念: GemFire Distributed System...

weixin_34192993的博客 282

保姆级教程:用Wireshark抓包分析10M汽车以太网PLCA轮询机制(附pcap文件)

本文详细介绍了10M汽车以太网PLCA轮询机制的抓包分析与性能优化方法。通过Wireshark实战教程,解析PLCA协议的时分多址特性、总线型拓扑结构及带宽优化策略,帮助工程师提升车内网络的可靠性和实时性。附赠pcap文件供实践参考。

wdx01234567的博客 240

gemfire demo

gemfire的资料真是少,花了1天时间搞了个demo,技术:spring mvc+spring security+jquery easy ui+spring data gemfire+redis gemfire配置文件: <beans xmlns="http://www.springframework.org/schema/beans" xmlns:gfe="http://www.sp

mark's technic world 1180

群晖Web Station实战:从零搭建个人静态导航站

本文详细介绍了如何利用群晖NAS自带的Web Station套件,从零开始搭建个人静态导航站。通过安装Web Station、上传静态网站源码、配置网页服务与网络门户等步骤,无需代码基础即可实现内网访问。文章还分享了文件权限设置、个性化定制及常见问题排查等实用技巧,帮助用户高效管理个人常用网址,充分挖掘NAS的服务器潜能。

tea88的博客 1330

用 i18n 驯服标准文案:SAP Fiori elements 的 UI 文本本地化与可替换实践全景

本文系统介绍了SAP Fiori elements应用中UI文本本地化的全面解决方案。从框架层与应用层文本的分类原则出发,详细解析了标准文本替换的四步法:资源准备、键值定位、模型配置和验证部署。文章特别针对不同开发场景,提供了XML、ABAP CDS和CAP CDS三种注解方式的文本覆盖写法示例。同时深入探讨了语言回退机制、表格组件标准键覆盖等关键技术细节,并指出了实际项目中的常见问题与解决方案。通过结合官方文档和社区实践,为开发人员在不破坏框架约定的前提下,实现稳定可靠的UI文本本地化提供了完整指导。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 297

Apache Geode系列000: 介绍

Geode的发展 Apache Geode由GemFire开源而来,最初在2002年由GemStone Systems公司开发(2010年被VMWare收购,2013年被Pivotal剥离),商标为GemFire。此项技术初期被广泛应用在金融领域,用于华尔街交易平台,作为事务性、低延时的数据引擎。 2015年4月GemGire的代码被提交给Apache孵化器作为孵化项目。但是这个开源是基于Ge...

Think Big,Win Big 9737

Altium Designer应用技巧1: 功能模块的复用方法

Altium Designer应用技巧1: 功能模块的复用方法      我们在使用Altium Designer进行电路图设计时,常会遇到功能模块的复用问题,例如我们经常需要将12V以DC-DC的方式转换成5V,这在很多线路板上都会应用到。现在我们普通的做法是,每个板子都重新绘制一遍,像这样DC-DC的电路,很浪费时间。那么如何采用提高工作效率呢?我们可以采取Altium Desi

snmplink的博客 1万+

Apache Geode/GemFire入门(2)-基本概念和模块

使用持久化 GemFire支持无共享存储持久化。每一个VM写入他们的region data到自己的磁盘文件中。 People region来说,每一个region将要写入整个的region到自己的磁盘文件中。而post region每一份拷贝都将要存在两个不同的peer中。 当你重启持久化成员,你需要调用cacheserver ...

weixin_33835690的博客 272

VSCode PlantUML 插件超详细教程:从安装配置到实战绘图全流程

VSCode PlantUML 插件超详细教程:从安装配置到实战绘图全流程

weixin_69237381的博客 911

003、高通骁龙Spectra ISP架构深度解析:IFE/BPS/IPE流水线与Chromatix调优实战

摘要: 本文深入解析高通骁龙Spectra ISP架构,重点剖析IFE、BPS、IPE三阶段的流水线协作机制与Chromatix调优实战。通过夜景预览"水波纹"案例,揭示HDR对齐与TNR运动估计的关联性问题,指出ISP调优需关注模块间的时序与带宽约束。文章详解各模块核心功能:IFE负责RAW域处理(HDR合成/校正),BPS专注降噪与细节增强,IPE进行YUV域精处理。针对Chromatix调优,强调参数与寄存器映射关系,并给出LSC网格密度、TNR运动灵敏度、LTM光晕等典型问题的解决方案。最后提出实用

zzfmlxs的博客 233

apache ignite系列(一): 简介

apache-ignite简介(一) 1,简介 ​ ignite是分布式内存网格的一种实现,其基于java平台,具有可持久化,分布式事务,分布式计算等特点,此外还支持丰富的键值存储以及SQL语法(基于h2引擎),可以看成是一个分布式内存数据库。 与ignite类似的产品有gemfire(12306目前正在使用),其开源版为geode。与gemfire相比,ignite对sql的支持比较完善,提供...

weixin_30695195的博客 628

uniapp [安卓苹果App端] - 实现获取手机日历读写权限+调用本机日历数据及操作功能+日历中插入事项事件提醒,检测权限手机日历权限是否开启并引导用户同意授权,uniApp app端开启日历授权

uni-app,权限,手机日历权限,安卓Android,苹果ios,uniapp安卓android获取本机日历读写权限使用,uni-app获取日历权限并实现插入事项事件功能 uniapp苹果IOS系统不支持怎么办,判断权限,权限被拒绝了怎么办,获取日历权限报错,读取日历数据农历阴历并操作插入移除,给用户手机日历中放入一条提示,UniApp调用日历进行读写,打包上架后如何获取,安卓ios权限检测,安卓和ios权限获取,uniapp的APP端日历读写权限与使用示例代码,如何开启日历权限,日历的新增事项和删除,判

🏆 前端领域优质创作者 1万+

Apache Geode/GemFire 数据分区和路由机制浅析

本篇文章主要讲解Apache Geode/GemFire 是如何进行数据分区的。 GemFire和大多数分布式系统一样都采用 Hash 的方式对数据进行分区,将 Entry 数据分布到 PartitionedRegion 当中,大家都知道 Entry 数据主要保存在 ConcurrentHashMap 中,ConcurrentHashMap存放在 Bu...

weixin_33895657的博客 217

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Gemfire

分布式缓存领域,大家可能较为熟悉Redis,当红一哥,还有经典老将Memcached, 以及新秀Apache Ignite, 当然还有Oracle的Coherence内存数据网格,今天我们主要关注投行金融领域的分布式缓存一哥Gemfire。我们大名鼎鼎的12306购票网站就是使用GemFire,它解决了内存数据库所有问题,把理论上一切都可在内存中运行变为现实。1. 前世今生Gemfire的第一个商业

猎人在吃肉 3965

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

[转]Apache Ignite——新一代数据库缓存系统

Apache Ignite是一个通用的数据库缓存系统,它不仅支持所有的底层数据库系统,比如RDBMS、NoSQL和HDFS,还支持Write-Through和Read-Through、Write-Behind Caching等可选功能。

heiyeluren的blog(黑夜路人的开源世界) 1万+
上一篇: GemFire/Geode中的国际化(一)
下一篇: 导出CSV文件中的乱码
国际化梦工厂
博客等级 码龄11年 18粉丝 83原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值