栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python连接redis,单例和线程池,遇到问题解析

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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、总结

不难,就是生搬硬套,欢迎点赞评论,

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/529476.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号