日期:2014-05-16  浏览次数:20516 次

java存储GBK编码数据到redis

?

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

?