[python]mysql数据缓存到redis中 取出时候编码问题

描述:

一个web服务,原先的业务逻辑是把mysql查询的结果缓存在redis中一个小时,加快请求的响应。

现在有个问题就是根据请求的指定的编码返回对应编码的response。

首先是要修改响应的body的编码,由于mysql去出来就是unicode,所以直接使用

```

content = content.encode(charset)

```

来转化,然后在请求header中也加入字符编码。

解决:

可是这样测试下来,有的请求可以返回正确的编码格式,有的还是乱码,最后猜测是redis中数据类型的问题

#redis 中取出的缓存数据
type(content)
<type 'str'>
import chardet
chardet.detect(content)
{'confidence': 0.99, 'encoding': 'utf-8'} #编码还是utf-8

#msyql取出的字段数据
type(content)
<type 'unicode'>

一种方式是在redis中就存储unicode编码,缓存的时候还是unicode,为啥到redis里面再取出来就是str了呢? 可能还需特殊处理吧。

一种方式是对content判断类型,分别处理。

最后的解决片段:

if isinstance(content, unicode):
    content = content.encode(charset)
elif isinstance(content, str):
    content = content.decode("utf-8").encode(charset)

参考: http://www.pythonclub.org/python-basic/codec

本文出自 “orangleliu笔记本”博客,转载请务必保留此出处http://blog.csdn.net/orangleliu/article/details/41445947

作者orangleliu 采用署名-非商业性使用-相同方式共享协议

时间: 2024-10-14 02:02:48

[python]mysql数据缓存到redis中 取出时候编码问题的相关文章

缓存到Redis中记录数据

一.先配好 Redis http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2011/0406/7873.html 我自己配好的地址. <appSettings> <add key="RedisUrl" value="10.10.4.50:7895" /> //域名 <add key="Redisdata" value="12" /> //

DjangoRestFramework实现JWT登录,并将token缓存到redis中

创建一个Django应用FirstApp,并实现用户注册接口,用户注册功能实现见上篇用户注册,调用接口创建一个用户数据(包含用户名密码),项目结构如下 安装DjangoJWT pip3 install djangorestframework-jwt 项目目录下settings.py文件中配置DjangoJWT REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_jwt.authentication.JSON

【redis,1】java操作redis: 将string、list、map、自定义的对象保存到redis中

一.操作string .list .map 对象 1.引入jar: jedis-2.1.0.jar 2.代码 /** * @param args */ public static void main(String[] args) { //连接redis服务 Jedis jedis = new Jedis("192.168.88.15",6379); //密码验证-如果你没有设置redis密码可不验证即可使用相关命令 //        jedis.auth("abcdefg&

【redis,1】java操作redis: 将string、list、map、自己定义的对象保存到redis中

一.操作string .list .map 对象 1.引入jar: jedis-2.1.0.jar 2.代码 /** * @param args */ public static void main(String[] args) { //连接redis服务 Jedis jedis = new Jedis("192.168.88.15",6379); //password验证-假设你没有设置redispassword可不验证就可以使用相关命令 //        jedis.auth(&

1.scrapy爬取的数据保存到es中

先建立es的mapping,也就是建立在es中建立一个空的Index,代码如下:执行后就会在es建lagou 这个index. from datetime import datetime from elasticsearch_dsl import DocType, Date, Nested, Boolean, \ analyzer, InnerDoc, Completion, Keyword, Text, Integer from elasticsearch_dsl.connections im

浮点型数据转存到字符串中(转)

一.C语言中数值型数据分为两大类:整型和浮点型整型:char int short long浮点型:float(单精度) double(双精度) 二.浮点型数据转存到字符串中char str[30]; //定义一个字符数组,来存储数据double d=123.456; //定义一个浮点型变量dsprintf(str,"%f", d ); //格式串同printf()格式要求sprintf(str,"%.2f", d ); //保留两位小数,第三位四舍五入 三.整型数据

Excel文件数据保存到SQL中

1.获取DataTable /// <summary> /// 查询Excel文件中的数据 /// </summary> /// <param name="strPath">文件路径</param> /// <param name="sheetName">工作表名</param> /// <returns>DataTable</returns> public DataTa

使用sqoop将mysql数据导入到hive中

首先准备工具环境:hadoop2.7+mysql5.7+sqoop1.4+hive3.1 准备一张数据库表: 接下来就可以操作了... 一.将MySQL数据导入到hdfs 首先我测试将zhaopin表中的前100条数据导出来,只要id.jobname.salarylevel三个字段. 再Hdfs上创建目录 hadoop fs -mkdir -p /data/base #用于存放数据 我们cd到sqoop目录下执行命令 # \ 用于换行bin/sqoop import --connect jdbc

因在缓存对象中增加字段,而导致Redis中取出缓存转化成Java对象时出现反序列化失败的问题

背景描述 因为业务需求的需要,我们需要在原来项目中的一个DTO类中新增两个字段(我们项目使用的是dubbo架构,这个DTO在A项目/服务的domain包中,会被其他的项目如B.C.D引用到).但是这个DTO对象已经在Redis缓存中存在了,如果我们直接向类中增加字段而不做任何处理的话,那么查询操作查出来的缓存对象就会报反序列化失败的错误,从而影响正常的业务流程,那么来看一下我的解决方案吧. 升级缓存版本号 我们的正式环境和预发布环境是共用Redis和Mysql.如果修改了DTO且没有加@Json