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,单例和线程池,遇到问题解析的主要内容,如果未能解决你的问题,请参考以下文章

6 单例模式与线程池

整理Java开发篇

单例和多线程

双重检查创建线程安全的单例和无锁

Java 单例和同步

Redis