Python连接redis,单例和线程池,遇到问题解析
【摘要】 最近打算做个小项目,项目最后定的解决方案是flask + redis,所以需要连接redis1、需求想要使用redis,在常规的开发中,一般我们使用线程池,后续也要使用多线程库,存入的对象是字符串,这个时候就需要把对象进行序列化,直接使用了redis 的内置json 序列化2、demo项目的具体情况就不说了,因为之前没有使用过python对数据库的操作,所以先写一个demo 测试,试着连接r...
最近打算做个小项目,项目最后定的解决方案是flask + redis,所以需要连接redis
1、需求
想要使用redis,在常规的开发中,一般我们使用线程池,后续也要使用多线程库,存入的对象是字符串,这个时候就需要把对象进行序列化,
直接使用了redis 的内置json 序列化
2、demo
项目的具体情况就不说了,因为之前没有使用过python对数据库的操作,所以先写一个demo 测试,试着连接redis
大家都知道做数据库操作,最好需要连接池,这样降低连接的成本,降低高并发时的操作时间,同时我想在程序使用的过程中做个单例,在看了各种单例的情况我选择一种最简单的方式,对于一个demo 够了。
总结一下: 单例,线程池
安装redis 就不赘述了,百度下到处都是。
废话不多说,直接代码走起
直接在控制台 pip install redis 就可以了
看下连接池的代码:
import redis
class RedisPool:
instance = None
def __init__(self):
self.pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True, db=8)
def __getConnection(self):
conn = redis.Redis(connection_pool=self.pool)
return conn
@classmethod
def getConn(cls):
if RedisPool.instance is None:
RedisPool.instance = RedisPool()
return RedisPool.instance.__getConnection()
redisConn = RedisPool.getConn()
redisConn.set('aaa', 'vvv')
对象转json 的函数
def toStr(obj):
return json.dumps(obj,default = lambda x: x.__dict__,ensure_ascii=False)
简单定义一个对象
class RankData:
def __init__(self):
self.data = []
调用存储进redis
from gameRank import RedisPool
from gameRank.JsonUtil import toStr
from gameRank.RankData import RankData
rank = RankData()
rank.data.append({'名字':'香菜','code':'12345'})
rank.data.append({'名字':'香菜','code':'12345'})
rank.data.append({'名字':'香菜','code':'12345'})
rank.data.append({'名字':'香菜','code':'12345'})
rank.data.append({'名字':'香菜','code':'12345'})
rank.data.append({'名字':'香菜','code':'12345'})
rank.data.append({'名字':'香菜','code':'12345'})
rank.data.append({'名字':'香菜','code':'12345'})
rank.data.append({'名字':'香菜','code':'12345'})
redisConn = RedisPool.getConn()
redisConn.hset('20211115','aaa', toStr(rank))
3、遇到的问题
3.1 解决Object of type “XXX“ is not JSON serializable 解决办法
错误:无法进行序列化
在Java中有各种json库,在这里使用了python自带的json,但是没有注意到自定义对象无法序列化,加上下面这行就可以了
default = lambda x: x.__dict__,
3.2 redis 中显示的是二进制
显示非 中文 ,在生成json 的语句中 加上
ensure_ascii=False
4、总结
不难,就是生搬硬套,欢迎点赞评论,
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)