|
项目中需要将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()方法来去掉多余字节。 |
|
|