您的位置:首页 > 编程语言 > Python开发

BerkeleyDB的使用

2015-11-16 15:31 881 查看
#BerkeleyDB的性能之高就不用说,性能优越在于用人之上,用得好性能自然很棒,用得不好,适得其反。
class Queue(object):
"""docstring for Bqueue"""
def __init__(self,dbFile):
#创建DB
home = C["DB_PATH"]
self.dbFile = home + os.sep + dbFile
self.lock = threading.Lock()
self.dbenv=bsddb.db.DBEnv()
self.dbenv.open(home,bsddb.db.DB_CREATE | bsddb.db.DB_INIT_MPOOL)
self.mydb = bsddb.db.DB(self.dbenv)
self.mydb.set_re_len(1024)
self.mydb.open(self.dbFile,dbtype = bsddb.db.DB_QUEUE, flags = bsddb.db.DB_CREATE)

def put(self,item):
"""
写入队列,注意用json把item(字典类型)转为字符串
"""
try:
itemStr = json.dumps(item)
self.lock.acquire()
self.mydb.append(itemStr)
self.lock.release()
#self.mydb.sync()
except Exception, e:
raise e

def get(self):
"""
出队列,注意把字符串转回字典
"""
try:
self.lock.acquire()
itemStr = self.mydb.consume()
self.lock.release()
except Exception, e:
raise e

if itemStr:
return json.loads(itemStr[1])

def qsize(self):
"""
获取队列大小
"""
try:
self.lock.acquire()
dbStat = self.mydb.stat()
ndata = dbStat['ndata']
except Exception, e:
ndata = -1
finally:
self.lock.release()

return ndata
#return -2

def close(self):
"TODO:关闭数据库,队列不再可用"
print "CLOSING QUEUE.."
self.mydb.close()
self.dbenv.close()

class HighCache(object):
"""docstring for HighCache"""
def __init__(self, cachefilename):
home = C["DB_PATH"]
self.cachefilename=home+os.sep+cachefilename
self.lock = threading.Lock()
self.dbenv=bsddb.db.DBEnv()
self.dbenv.open(home,bsddb.db.DB_CREATE|bsddb.db.DB_INIT_MPOOL)#启用共享内存缓存池子系统  DB_INIT_MPOOL缓存
self.mydb=db.DB(self.dbenv)
self.mydb.open(self.cachefilename,dbtype=db.DB_RECNO,flags=db.DB_CREATE)

def putdata(self,item):
'''
进入缓存的数据
'''
try:
db=json.dumps(item)
self.lock.acquire()
self.mydb.append(db)
self.lock.release()
except Exception, e:
raise e

def getdata(self):
'''
从缓存中获取的数据
'''
try:
self.lock.acquire()
db=self.mydb.items()
self.lock.release()
return db
except Exception, e:
raise e
if db:
return json.loads(db[1])

def getOne(self):
self.lock.acquire()
#val = self.mydb.get()
#self.mydb.delete(1)
cur = self.mydb.cursor()
val = cur.first()
if val:
print self.mydb.stat()
cur.delete()
self.lock.release()
return val

#清空缓存
def sync(self):
self.lock.acquire()
self.dbenv.memp_sync()#full flush
#self.mydb.sync()
self.lock.release()

#关闭缓存队列
def close(self):
self.mydb.close()
self.dbenv.close()

#测试代码
if __name__ == '__main__':

# MyQueue = Bqueue("queue.db")
# a = {"name":"wh"}
# b = {"name":"zrf"}
# MyQueue.put(a)
# MyQueue.put(b)
# print MyQueue.get()

mycache=HighCache("cachefile.db")
a = {"name":"wh"}
b = {"name":"zrf"}
#mycache.putdata(a)
#mycache.putdata(b)
#print mycache.getdata()
print mycache.getOne()
mycache.sync()
mycache.close()
#代码还有待进一步优化和改进......
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python