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

举报
香菜聊游戏 发表于 2021/12/10 10:24:17 2021/12/10
【摘要】 最近打算做个小项目,项目最后定的解决方案是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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。