python实现redis客户端单例+hbase客户端单例

当业务需要大量去连接redis或者hbase的时候,大量的连接会造成socket的大量占用,导致的结果就是服务器没有更多的端口去分配,这种情况下的最好解决方案就是实现客户端连接的单例模式,保持连接永远是同一个。说到这,可能大家没有经历过,如果在每秒钟插入4000条数据的话,这个现象就非常明显了。下面就实现下python实现操作redis+hbase单例模式,有很多改进之处,根据自己业务进行调整,可以通过打印实例的ID进行验证:

import happybase
import redis
class _RedisMgrSingleton(type):
    ‘‘‘redis的单例‘‘‘
    def __init__(self, name, bases, dict):
        super(_RedisMgrSingleton, self).__init__(name, bases, dict)
        self._instance = {}
    def __call__(self, host,port,db):
        if not self._instance.has_key((host,port,db)):
            self._instance[(host,port,db)] = super(_RedisMgrSingleton, self).__call__(host,port,db)
        return self._instance[(host,port,db )]

class HbaseSingleton(type):
    ‘‘‘hbase的单例‘‘‘
    def __init__(self, name, bases, dict):
        super(HbaseSingleton, self).__init__(name, bases, dict)
        self._instance = {}
    def __call__(self, host,table):
        if not self._instance.has_key((host,table)):
            self._instance[(host,table)] = super(HbaseSingleton, self).__call__(host,table)
        return self._instance[(host,table)]

class RedisMgr:
    "redis操作专用类"
    def  __init__(self,host,port,db,max_connections=3):
        "eg:  host    ‘192.168.2.184‘   port  6379    db   14"
        self.host=host
        self.port=port
        self.db=db
        self.conn=redis.Redis(connection_pool= redis.ConnectionPool(host=host,port=port,db=db,max_connections=max_connections))
    def run_redis_fun(self,funname,*args):
        fun=getattr(self.conn,funname)
        print args
        return  fun(*args)
    def pipe(self):
        return self.conn.pipeline(transaction=False)
    __metaclass__ = _RedisMgrSingleton      #元类实现单例

class HbaseOperate(object):
    def __init__(self,host,table):
        self.host = host
        self.table = table
        self.conn = happybase.Connection(self.host)
        self.table = self.conn.table(self.table)

    def run(self,fun,*args):
        # result =self.table.row(*args)
        funname = getattr(self.table,fun)
        return funname(*args)
    def cells(self,column,info,version):
        return self.table.cells(column,info,versions=version)
    __metaclass__ = HbaseSingleton      #元类实现单例

conn = HbaseOperate(‘xxx.xx.11.8‘,"history_visitor_product")
result = conn.cells(‘chenhuachao‘,‘info:visiotr‘,3)
print result
print "第一次",id(conn)
conn1 = HbaseOperate(‘xxx.xxx.11.8‘,"history_visitor_product")
result1= conn1.cells(‘chenhuachao‘,‘info:visiotr‘,6)
print result1
print "第二次",id(conn1)
#output
[‘test10‘, ‘test9‘, ‘test97‘]
第一次 38014896
[‘test10‘, ‘test9‘, ‘test97‘, ‘test17‘, ‘test1345\n‘]
第二次 38014896
时间: 2024-10-08 10:04:33

python实现redis客户端单例+hbase客户端单例的相关文章

原!!win7-64 安装python的 redis客户端库

安装python的redis客户端库 本人系统已装python2.7 利用cmd命令行: 1.cmd-->python -->>>进入python命令下 >>>from urllib import urlopen >>>data = urlopen('http://peak.telecommunity.com/dist/ez_setup.py') >>>open('ez_setup.py','wb').write(data.re

浏览器新实用功能开发研究:单页富客户端应用的会话/视图状态复制及远程同步功能

浏览器新实用功能开发研究:单页富客户端应用的会话/视图状态复制及远程同步功能 目录 1 一个简单的使用场景 2 单页(富客户端)应用的会话/视图状态表示 3 状态复制及远程同步 4 SPA情景下的Web Cache变化 一个简单的使用场景 我之前成功地在3台机器上使用Google OAuth账户登陆过feedly,不幸的是,后来Google的账号登陆地址被gfw封了,所以我没办法在新电脑上进入我的feedly,值得庆幸的是,feedly始终缓存了我的登陆凭据(不知道是不是用Cookie表示的?)

Redis 学习(三)redis服务器集群、客户端分片

下面是来自知乎大神的一段说明,个人觉得非常清晰,就收藏了. 为什么集群? 通常,为了提高网站响应速度,总是把热点数据保存在内存中而不是直接从后端数据库中读取.Redis是一个很好的Cache工具.大型网站应用,热点数据量往往巨大,几十G上百G是很正常的事儿,在这种情况下,如何正确架构Redis呢? 首先,无论我们是使用自己的物理主机,还是使用云服务主机,内存资源往往是有限制的,scale up不是一个好办法,我们需要scale out横向可伸缩扩展,这需要由多台主机协同提供服务,即分布式多个Re

阿里云-Redis-Help-连接实例-Redis客户端连接:.net客户端

ylbtech-阿里云-Redis-Help-连接实例-Redis客户端连接:.net客户端 1.返回顶部 1. .net客户端 操作步骤如下所示: 下载并使用.net客户端. git clone https://github.com/ServiceStack/ServiceStack.Redis 在.net 客户端中新建.net项目. 添加客户端引用,引用文件在库文件的ServiceStack.Redis/lib/tests中. 在新建的.net项目中输入如下代码来连接云数据库Redis.详细

阿里云-Redis-Help-连接实例-Redis客户端连接:Jedis客户端

ylbtech-阿里云-Redis-Help-连接实例-Redis客户端连接:Jedis客户端 1.返回顶部 1. Jedis客户端 Jedis客户端访问云数据库Redis版服务,有以下两种方法: Jedis单链接 JedisPool连接池连接 操作步骤如下: 下载并安装Jedis客户端,详细步骤请参见Jedis使用说明. Jedis单连接示例 打开Eclipse客户端,创建一个Project,输入如下代码段: import redis.clients.jedis.Jedis; public c

python之模块ftplib(FTP协议的客户端)

# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之模块ftplib(FTP协议的客户端) #需求:快速进行ftp上传 ,下载,查询文件 from ftplib import FTP ftp = FTP() #设置变量 timeout = 30 port = 21 ftp.connect('192.168.1.188',port,timeout) # 连接FTP服务器 ftp.login('UserName','888888') # 登录 p

redis源码学习(客户端)

大概介绍 redis 客户端设计主要是存储客户的链接,请求,请求解析的命令,执行结果.先看server的结构和client的结构,server里面有多个client,相当于一个服务端可以连多个客户端,服务端根据事件触发模式依次处理客户端的请求. server结构 struct redisServer { /* General */ // 配置文件的绝对路径 char *configfile; /* Absolute config file path, or NULL */ // serverCr

ServiceStack.Redis——Redis在.net上的客户端解决方案

ServiceStack.Redis--Redis在.net上的客户端解决方案 源码及使用: https://github.com/ServiceStack/ServiceStack.Redis 例子: https://github.com/ServiceStack/ServiceStack.Examples/tree/master/src/RedisStackOverflow 上面的例子中container.Register<IRedisClientsManager>(c => new

Python socket模块实现TCP服务端客户端

Python socket模块实现TCP服务端客户端 写了详细的注释,如果有哪一行不明白,可留言哦. 服务端脚本 # _*_ coding: utf-8 _*_ __author__ = 'xiaoke' __date__ = '2018/6/13 14:39' # 这个脚本创建一个TCP服务器,它接收来自客户端的消息,然后将消息加上时间戳前缀并返回客户端 import socket from time import ctime HOST = '' PORT = 21567 BUFSIZ = 4