?
??? 项目中需要将oracle中的数据同步到redis中进行缓存,redis默认是UTF-8格式缓存数据,同步工作是java工程来开发的,使用缓存的工程是C++写的,C++中使用缓存是直接将业务数据与缓存数据进行对比,然后处理。由于C++中业务数据是GBK,所以要求redis中必须以GBK格式来存储数据,原因是如果将redis的数据换成UTF-8,C++中就必须每次对数据进行转换,业务数据量大的话,对性能有影响。
??? 由于redis中存储多种数据,不可能因为一个业务将格式更改。所以只能是在存入数据时进行处理,由于数据是从oracle中获取,oracle是UTF-8编码,所以需要转码。
??? 解决方案如下:
//oracle查询 ps = conn.prepareStatement(syncSql); rs = ps.executeQuery(); //设置要处理的编码格式 Charset cs=Charset.forName("GBK"); //通过数组处理 Map<byte[],byte[]> map = new HashMap<byte[],byte[]>(); while (rs.next()) { try { //获得UTF-8编码字符串 String str = rs.getString("CODE"); //使用Charset 处理 CharBuffer cb = CharBuffer.wrap(str); ByteBuffer bbf = cs.encode(cb); //去掉多余的数组长度 byte[] valueByte = new byte[bbf.limit()]; System.arraycopy(bbf.array(), 0, valueByte, 0, bbf.limit()); //存储数据 jedis.set(rs.getString("KEY").getBytes(), valueByte);
?
??? 这里有几点要注意:
????? 1. redis存储过程需要使用byte[],如果用字符串直接处理会导致1个GBK中文变成6个字节。
????? 2. byte[]数组在操作时处理长度要通过limit()方法来去掉多余字节。
?