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 可以直接存取二进制数据,事实上就可以存取任意数据了!

posted @ 2019-04-19 14:12  eyye的眼睛  阅读(7929)  评论(0编辑  收藏  举报