Python连接redis,单例和线程池,遇到问题解析
Posted 香菜聊游戏
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python连接redis,单例和线程池,遇到问题解析相关的知识,希望对你有一定的参考价值。
最近打算做个小项目,项目最后定的解决方案是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、总结
不难,就是生搬硬套,欢迎点赞评论,
以上是关于Python连接redis,单例和线程池,遇到问题解析的主要内容,如果未能解决你的问题,请参考以下文章