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 可以直接存取二進制數據,事實上就可以存取任意數據了!