zoukankan      html  css  js  c++  java
  • 编码之痛:操作系统迁移后redis缓存无法命中

    前几天一台内网服务器从ubuntu迁移到了centos,检查一切正常后就没有太在意。

    今天有同事反馈迁移后的机器上的服务一个缓存总是无法获取,对比了下环境、JVM参数,尝试了war包替换等方式照样复现。
    在有问题的机器上装了redis-cli让同事去看也是可以获取到的,一时没有了头绪。
    打算请教其他同事,让有问题的同事把查询等发我一下,然后就看到了... .... key设置为了中文,一下子头大了... ...

    检查机器的locale都没什么问题:

    $ env |grep LANG
    LANG=en_US.UTF-8
    
    $ locale
    LANG=en_US.UTF-8
    

    但用jinfo查看centos那台后发现被设置为了ANSI... ...

    file.encoding = ANSI_X3.4-1968
    

    代码里一检查果然代码里没有设置charset使用了默认的,默认的获取规则:

        public static Charset defaultCharset() {
            if (defaultCharset == null) {
                synchronized (Charset.class) {
                    String csn = AccessController.doPrivileged(
                        new GetPropertyAction("file.encoding"));
                    Charset cs = lookup(csn);
                    if (cs != null)
                        defaultCharset = cs;
                    else
                        defaultCharset = forName("UTF-8");
                }
            }
            return defaultCharset;
        }
    

    加上file.encoding之后就可以了...

    这也暴露了两个问题,一个是代码依赖了默认编码,另一个是服务器的JVM参数设置不全面,没覆盖常见的场景。
    还有最重要的一点...凡是用中文做key的都应该被烧死!!!!!!!

    感觉又虚度了光阴。


    UPDATE 2018/07/09
    迁了docker之后发现生成的文件也乱码了,变成了???...后来一看是LOCALE设置的问题
    只需要加上(zh_CN用的image不支持..):

    ENV LANG en_US.UTF-8  
    ENV LANGUAGE en_US:en  
    ENV LC_ALL en_US.UTF-8
    

    就好了

  • 相关阅读:
    MySql模糊查询like通配符使用详细介绍
    使用powershell批量添加Qt的文件(生成pro)
    宏定义的教训
    使用powershell批量添加Keil和IAR的头文件路径
    python和数据科学(Anaconda)
    CDCE913产生任意频率
    QT中检索设定目录下所有指定文件的方法
    QT中将ASCII转换为对应数值的方法
    STM8如何使用自带的bootloader
    QT中使用函数指针
  • 原文地址:https://www.cnblogs.com/fairjm/p/8886406.html
Copyright © 2011-2022 走看看