码迷,mamicode.com
首页 > 其他好文 > 详细

编码之痛:操作系统迁移后redis缓存无法命中

时间:2018-04-19 23:54:45      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:lan   反馈   看到了   env   其他   对比   无法   lookup   file   

前几天一台内网服务器从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的都应该被烧死!!!!!!!

感觉又虚度了光阴。

编码之痛:操作系统迁移后redis缓存无法命中

标签:lan   反馈   看到了   env   其他   对比   无法   lookup   file   

原文地址:https://www.cnblogs.com/fairjm/p/8886406.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!