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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM