我在之前的 <python使用redis 神器 ---redisco(一)>中已经简单介绍了redisco这个python的redis库的特点。
接下来这篇文章想着重分享一下如何将python内置的数据类型通过redisco存储到redis内,实现方便的存取和原子化操作,而不用去关心存储在redis里的数据会因为多进程(线程)需要添加“锁”这种繁琐的操作。
我先讲下我当时遇到的麻烦把,公司项目中的游戏服务器在一开始开发的时候都是以单进程来调试开发的,当我们在开发一些类似于副本或者战场之类功能的时候不得不在程序内生成以为所谓的“战场”或者“副本”的数据结构来存储数据,并给在参加这些战斗的玩家共享数据。那么一般在python内部会用一个class或者dict来设计这些数据结构。
当然在单进程的情况下没有问题,因为这些数据都是在内存里交互。但是当服务器架构被改造成多进程后,不同的玩家会随机的连接在服务器的各个进程上,那么他们就不能像之前很方便的共享单进程时里这些战场的数据。
一般在今天要解决多进程数据共享也不是什么很复杂的问题了,无非是用缓存,RPC调用等等。
但是这些方法都不能很方便的解决将之前用python生成的数据结构数据进行方便的存储和读取,一般会进行一次编码和解码,比如都转成json,或者二进制,效率不高而且繁琐,最恶心的关键数据比如比分,金钱,这些在不同的进行需要进行更改时要加锁,这样性能又会下降,想想就恶心。
好了,终于可以让我们的redisco出场了,长话短说,我们来看看用它来存储python数据如何方便。
python redisco
=========================
字典,类 models.Model
列表 list
字符串,数字 key,value对
上面这张表是python内数据对应到redisco内数据结构的映射
主要讲下当你在使用redisco中models.Model用来替代python内部的字典和类时的注意事项
在models.Model中当你生成了一个数据调用save方法存入redis后比如这样写的
- from redisco import models
- class Person(models.Model):
- name = models.Attribute(required=True)
- created_at = models.DateTimeField(auto_now_add=True)
- fave_colors = models.ListField(str)
- age = models.Counter()
-
score =
models.IntegerField()
在你的进程内生成一个数据
test = Person()
test.name = 'xiaoming'
test.save() #存进redis
如果你不销毁test变量,那么可以一直直接访问它的属性
比如
>>print test.name
>>xiaoming
>>print test.age
>>0
修改score属性
>>test.score = 1
>>test.save()#跟新redis内数据
修改age
>>test.incr('age',5)
>>print test.age
>>5
注意区别同样是数字 redisco 内 Counter 和 IntegerField 一个不需要调用save方法一个需要
==========================
那么神奇的地方仅仅只有这点????
如果此时有个b进程也在修改test这个数据
会怎么样?
我直接告诉你结果吧
如果你要正确的修改test的score
在每次修改前都需要重新获取一次test数据
而修改age则不用,你只要调用test的incr() 和decr() 就可以修改
将简单点,在a进程和b进程同事通过 Person.objects.filter(name='tset')[0] 获取了叫‘test’名字的这个人的数据
然后a,b2个进程同时使用 test.incr('age')
再print test.age你会发现增加了2 而不是增加了1
对于list类型和zset类型在之前的文章已经提过就不细说了
分享到:
相关推荐
Redis作为一个高性能的键值存储系统,常被用作数据库、缓存和消息中间件,而redisco则将Redis的强大功能与Python的易用性相结合。 ### 数据模型 在redisco中,你可以创建自定义的持久化数据模型,这些模型类似于...
例如,可以使用 `json.dumps()` 函数将 Python 对象转换为 JSON 字符串,然后使用 `r.lpush()` 或其他 Redis 命令将数据存入。 对于描述中的示例,有两个 JSON 对象:一个专家对象 `someexpert` 和一个框架列表 `...
1. **模型定义**:在`python_redis_orm`中,你需要定义一个继承自`BaseModel`的类,类的属性对应Redis中的键,类型可以是基本的Python数据类型,如字符串、整数等。例如: ```python from python_redis_orm ...
它针对 Redis 的原始 Python 客户端进行了优化,提供了更丰富的 Python 数据类型支持,使得在使用 Redis 存储和检索数据时更加方便和直观。在Python开发中,尤其是在处理大量结构化数据时,Python-hotredis 可以显著...
毕业设计+Python基于Scrapy+Redis分布式爬虫设计+源码案例+Python + Scrapy + redis 毕业设计+Python基于Scrapy+Redis分布式爬虫设计+源码案例+Python + Scrapy + redis 毕业设计+Python基于Scrapy+Redis分布式爬虫...
这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是...
下面我们将深入探讨如何在Python中导入`redis`包以及使用它的基本操作。 首先,为了在Python中使用`redis`包,你需要确保已经安装了这个库。如果没有,可以使用`pip`来安装: ```bash pip install redis ``` 安装...
Redis的优势在于其高速读写性能,因为它将数据存储在内存中。它支持多种数据结构,如字符串、哈希、列表、集合和有序集合,使得在处理复杂的数据操作时更加便捷。Python3可以使用redis-py库连接Redis服务器,执行...
`pydis`需要在Python中实现这些高效的数据结构,以提供与Redis类似的性能。 3. **内存管理**:为了处理大规模数据,`pydis`可能采用了优化的内存管理策略,比如对象池或者内存预分配,以减少内存分配和释放的开销。...
Redis支持的数据类型包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。例如,你可以创建一个列表: ```python r.rpush('mylist', 'item1', 'item2', 'item3') ``` 然后,...
在这个小示例中,我们将探讨如何使用Python操作Redis,包括数据的读取、写入、推送以及删除等基本操作。 首先,确保已经安装了`redis-py`库,如果没有,可以通过以下命令安装: ```bash pip install redis ``` 接...
Python 的 Redis 数据库连接与使用 Python 的 Redis 数据库...Python 的 Redis 数据库连接与使用提供了一个强大和灵活的数据存储解决方案,支持多种数据类型和操作方式,并且支持 master-slave 同步和管道发布订阅。
本脚本是用python写的,用于实现redis配置的自动备份。
总的来说,Python的`redis`库提供了丰富的API,能够满足各种Redis操作需求,无论是简单的键值存储还是复杂的缓存策略,都能轻松应对。通过熟练掌握这个库,可以有效地利用Redis提升应用的性能和响应速度。
资源分类:Python库 所属语言:Python 资源全名:python-redis-orm-0.4.1.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
Python实现基于Scrapy-Redis的分布式爬虫实现框架源码.zip本资源中的源码都是经过本地编译过可运行的,评审分达到95分以上。资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有...
在Python中,使用Redis客户端连接到Redis集群,利用Redis的JSON功能存储聊天数据,Redis流处理与Hugging Face API的实时交互。这使得模型的响应能快速地传递回客户端。 4. **AI模型集成**:Hugging Face提供了一个...
Redis操作速度快,因为它将所有数据存储在内存中,只有在需要时才将数据持久化到磁盘。当我们需要快速响应用户请求时,Redis能够提供显著的性能提升。描述中的“第二次从Redis中拿”指的是在第一次从数据库获取数据...
这里我们将深入探讨如何使用Python抓取数据并将其存储到Redis的Hash数据类型中。 首先,我们需要导入必要的库,如`os`, `sys`, `requests`, `bs4`(BeautifulSoup)以及`redis`。`requests`库用于发送HTTP请求获取...