use - meetbill/redis-orm GitHub Wiki

使用手册

1 设置 redis

redisorm.setup_redis("default","127.0.0.1",6379)
print redisorm.SYSTEMS

2 创建表类

import redisorm
class User(redisorm.Model):pass

3 操作表中数据

3.1 创建数据

print "########################## create"
print User.objects.create(name='wangbin', age=26)
print User.objects.create(name='meetbill', age=26)
print User.objects.create(name='meetbill_expire', age=26,expire=3)
print User.objects.create(name='meetbill', age=25)

3.2 查找数据

print "########################## find"
print User.objects.find(age=26)
print User.objects.find(age=26).list()
print User.objects.find(age=26).list()[0].tags

3.3 查询数据

3.3.1 根据条件获取数据

print "########################## [get data]"
for info in User.objects.find(age=26).list():
    print "attrs:[%s] expire:[%s]"%(info.attrs,User.ttl(info))
print "-------------------------- [get data] test expire"
time.sleep(4)
for info in User.objects.find(age=26).list():
    print info.attrs

instance demo

{
	'unique_tag': u 'name:wise-miplimit',
	'_saved_tags': [u 'slot:0', u 'handshake:0', u 'slice:4', u 'name:wise-miplimit', u 'id:vQKjQMqGqj56z2Gc', u 'expire:None', u 'time:2020-02-07 19:30:01', u 'fail:0', u 'controller_check:1'],
	'tags': [u 'handshake:0', u 'slice:4', u 'time:2020-02-07 19:30:01', u 'name:wise-miplimit', u 'controller_check:1', u 'slot:0', u 'fail:0'],
	'expire': None,
	'attrs': {
		'slot': 0,
		'handshake': 0,
		'slice': 4,
		'name': 'wise-miplimit',
		'time': '2020-02-07 19:30:01',
		'fail': 0,
		'controller_check': 1
	},
	'id': 'vQKjQMqGqj56z2Gc'
}

3.3.2 获取所有数据

print "########################## all"
for info in User.objects.all().list():
    print info.attrs

---------------------------------------output
{'age': 26, 'name': 'meetbill'}
{'age': 25, 'name': 'meetbill'}
{'age': 26, 'name': 'wangbin'}

3.4 删除数据

print "########################## delete_instance"
for info  in  User.objects.all().list():
    print "[id]%s [tags]%s \n"%(info.id,info.tags)
    print User.objects.delete_instance(info)

3.5 清理过期数据

User.objects.expire()

备注:进行 get 数据时,有 1% 的机会会触发清理过期数据操作,代码如下:

if random_true(0.01):
    self.expire()

4 其他操作

4.1 设置 unique

设置表中的 unique 字段,如果发现已存在,则会删除已有的数据,使用最新的数据

使用方法

class User(redisorm.Model):
    unique_field = "name"
    pass

4.2 设置忽略字段

有些字段内容过多时,生成 tag 就会比较占用空间,这个时候可以进行将某些字段进行忽略

使用方法

class User(redisorm.Model):
    unique_field = "name"
    # 可以通过设置 exclude_attrs 来进行设置忽略字段 
    exclude_attrs = ["desc"]
    pass

4.3 动态设置 key 前缀,即表名

4.3.1 场景

下发执行任务,比如更改某个 service 的所有配置文件,启动一个线程(此线程启动个子进程进行执行对应操作)

但需要查询任务的执行状态

4.3.2 分析

每次发起任务,可以动态生成一个表名(如使用 reqid)

work 进程

主线程生成任务时(还未放到队列),将所有实例都设置状态为 "PENDING"
执行线程取到任务时,将实例设置状态为 "RUNNING"
任务执行成功时,将实例设置状态为 "SUCCESS"
任务执行失败时,将实例设置状态为 "FAILURE"

查询任务时,通过此表名查询下面所有实例的执行状态

4.3.3 操作

def get_model(_model_name):
    class ServiceModel(redisorm.Model):
        # 主键
        unique_field = "name"
        # 设置不加索引字段, 设置了索引的话,会增加 Redis 存储 (异常输出信息/时间)
        exclude_attrs = ["output", "time"]
        # 设置表名
        model_name = _model_name

    return ServiceModel

service_model = get_model("test1234555")

# 实例执行状态
+-------------------------------------------------
|  WAITING --> PENDING --> RUNNING --> SUCCESS
|                             |
|                             V
|                          FAILURE
+-------------------------------------------------
from datetime import datetime

service_model.objects.create(name='test_unit1',
                             status='SUCCESS',
                             time=datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
                             output="OK")
service_model.objects.create(name='test_unit2',
                             status='FAILURE',
                             time=datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
                             output="err info")