redis中文乱码问题
1.太久没写博客了,今天写一篇,一是因为最近又有写代码了,二是有一个问题困扰了我很久,但网上资料有几乎没有,也许是因为这个问题太简单,所以没有人写,要么是这个问题太小众,大多数人也没遇到,总之资料太少,所以困扰了很久、摸索了很久才找到答案,答案又如此简单,所以留个记录,如果再有人遇到这个问题,也不用再走弯路。
问题的起因是是使用redis做缓存,刚开始再python里存入数据,再读取数据,都还没多大问题:
import redis
r = redis.Redis(host='localhost', port=6379,decode_responses=True,charset='GBK')
建立连接字符串的时候,指定编码方式charset='GBK',这样再终端查看的时候加--raw选项就可以正常查看中文
redis-cli --raw
2.但是后面需要让python存入数据,asp.net读取出来,结果全是乱码。
我用的是StackExchange.Redis。
开始时是被两个函数名称给误导了,两个函数StringSet和StringGet,以为只能存取字符串,后来仔细查看参数和返回值类型:
bool StringSet(RedisKey key, RedisValue value, TimeSpan? expiry = null, When when = When.Always, CommandFlags flags = CommandFlags.None);
RedisValue StringGet(RedisKey key, CommandFlags flags = CommandFlags.None);
实际上是可以直接存取二进制,那这下就简单了:
public static string Get(string key)
{
Encoding coder = Encoding.GetEncoding("GBK");
byte[] key_bytes = coder.GetBytes(key);
byte[] buffer = RedisHelper.db.StringGet(key_bytes);
if (buffer!=null)
{
string res = coder.GetString(buffer);
return res;
}
return null;
}
public static void Set(string key,string data,int sec=-1)
{
Encoding coder = Encoding.GetEncoding("GBK");
byte[] key_bytes = coder.GetBytes(key);
byte[] data_bytes = coder.GetBytes(data);
if (sec < 0)
{
RedisHelper.db.StringSet(key_bytes, data_bytes);
}
else
{
RedisHelper.db.StringSet(key_bytes, data_bytes, System.TimeSpan.FromSeconds(sec));
}
}
这样用GBK编码,在终端也能正常看到中文(--raw选项)
3.redis 可以直接存取二进制数据,事实上就可以存取任意数据了!