Redis是现在大多数互联网公司都要使用的技术,作为非关系型内存数据库,它在各种复杂并发实时场景中都广泛使用。
今天我们使用redis中的sorted_set来实现实时数据的存储和查询。
sorted_set是排序集合,ZADD后元素位置是根据ZADD时指定的score排序得来的,而不像list那样可以指定元素在最左端LPUSH还是最右端RPUSH。通常情况下,每一条数据的创建时间是不同的,我们可以将数据创建时间的时间戳当做score将数据存储在sorted_set中,这样sorted_set中的数据就是按照时间排序好的,然后使用ZRANGE key start stop [withscores]来获取某一切片范围内的数据,或者ZRANGEBYSCORE key min max[withscores] 来获取某一时间范围内的数据。
对应我们上文介绍的实时营收数据,可以取得某一数量的最新数据或者最近多少分钟的最新数据,代码如下,
class getRecentPayHandler(cross_originAllowed_Handler):
def get(self):
number=self.get_argument('number',None)
minute=self.get_argument('minute',None)
if number:
pays=r.zrange('payZ',-int(number),-1)
self.write({'result':pays})
return
elif minute:
now=datetime.now()
endTimestamp=int(to_datetime(now).timestamp()-3600*8)*1000
startTimestamp=int(endTimestamp-int(minute)*60*1000)
print startTimestamp
print endTimestamp
pays=r.zrangebyscore('payZ',startTimestamp,endTimestamp)
self.write({'result':pays})
return
self.write({'result':[]})
另外,为了模拟缴费事件,代码如下:
# -*- coding:utf-8 -*-
import redis
import json
import time
import random
from datetime import datetime
import itertools
import pandas as pd
regions=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,154,155,156,157,158,159,160,161,162,163,164,165]
f=open('wechatTest.json')
wechats=json.load(f)
f.close()
wechatRegions=zip(wechats,regions)
map(lambda x:x[0].update({'region':x[1]}),wechatRegions)
r=redis.Redis()
for i in itertools.cycle(wechats):
now=datetime.now()
timestamp=1000*(int(pd.to_datetime(now).timestamp())-3600*8)
i.update({'createTime':now.strftime('%Y-%m-%d %H:%M:%S')})
fee=random.sample(range(100,1000,10),1)
i.update({'fee':fee[0]})
i=json.dumps(i)
print i
print timestamp
r.zadd('payZ',{i:timestamp})
time.sleep(10)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。