溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

mysql中單個(gè)庫(kù)數(shù)據(jù)該怎么樣同步到redis數(shù)據(jù)庫(kù)中

發(fā)布時(shí)間:2020-05-12 11:53:22 來(lái)源:億速云 閱讀:353 作者:三月 欄目:編程語(yǔ)言

文主要給大家介紹mysql中單個(gè)庫(kù)數(shù)據(jù)該怎么樣同步到redis數(shù)據(jù)庫(kù)中,文章內(nèi)容都是筆者用心摘選和編輯的,具有一定的針對(duì)性,對(duì)大家的參考意義還是比較大的,下面跟筆者一起了解下mysql中單個(gè)庫(kù)數(shù)據(jù)該怎么樣同步到redis數(shù)據(jù)庫(kù)中吧。

實(shí)際代碼只有一點(diǎn),其他的為備忘

# -*- coding:utf-8 -*-
import MySQLdb
import redis

class Config:
    def __init__(self):
        self.mysql_host = '192.168.44.60'
        self.mysql_user = 'root'
        self.mysql_port = 3306
        self.mysql_password = '123456'
        self.mysql_db = 'bamboo'
        self.mysql_charset = 'utf8'
        self.mysql_show_tables = "show tables"
        self.mysql_desc_table = "desc %s"
        self.mysql_query_info = "select * from  %s"

        self.redis_host = "192.168.44.60"
        self.redis_port = 6379
        self.redis_passwd = 123456
        self.redis_db = 0

config = Config()

class MySQLHelper:
    myVersion = 0.1

    def __init__(self):
        self.host = config.mysql_host
        self.user = config.mysql_user
        self.password = config.mysql_password
        self.charset = config.mysql_charset
        self.db = config.mysql_db
        try:
            self.conn = MySQLdb.connect(host=self.host, user=self.user, passwd=self.password,db=self.db,charset=self.charset)
            self.cursor = self.conn.cursor()
        except MySQLdb.Error as e:
            print ('MySql Error : %d %s' % (e.args[0], e.args[1]))

    def query(self, sql):
        try:

            cursor = self.cursor
            cursor.execute(sql)
            return cursor
        except MySQLdb.Error as e:
            print('MySql Error: %s SQL: %s' % (e, sql))

    def queryOnlyRow(self, sql):
        try:
            cursor = self.query(sql)
            result = cursor.fetchall()
            desc = cursor.description

            row = {}
            for i in range(0, len(result)):
                row[desc[i][0]] = result[i]
            return row
        except MySQLdb.Error as e:
            print('MySql Error: %s SQL: %s' % (e, sql))

    def queryAll(self, sql):
        try:

            cursor = self.query(sql)
            result = cursor.fetchall()

            desc = cursor.description
            rows = []
            for cloumn in result:
                row = {}
                for i in range(0, len(cloumn)):
                    row[desc[i][0]] = cloumn[i]
                rows.append(row)
            return rows

        except MySQLdb.Error as e:
            print('MySql Error: %s SQL: %s' % (e, sql))

    def queryTableNums(self,sql):
        try:
            cursor = self.query(sql)
            result = cursor.fetchall()
            row = []
            for cloumn in result:
                row.append(cloumn[0])
            return row

        except MySQLdb.Error as e:
            print('Mysql Error: %s SQL: %s' %(e,sql))

    def insert(self, tableName, pData):
        try:
            newData = {}
            for key in pData:
                newData[key] = "'" + str(pData[key]) + "'"
            key = ','.join(newData.keys())
            value = ','.join(map(str,newData.values()))
            sql = "insert into " + tableName + "(" + key + ") values(" + value + ")"
            self.query("set names 'utf8'")
            self.query(sql)
            self.commit()
        except MySQLdb.Error as e:
            self.conn.rollback()
            print('MySql Error: %s %s' % (e.args[0], e.args[1]))

    def update(self, tableName, pData, whereData):
        try:
            newData = []
            keys = pData.keys()
            for i in keys:
                item = "%s=%s" % (i, "'" + pData[i] + "'")
                newData.append(item)
            items = ','.join(newData)
            newData2 = []
            keys = whereData.keys()
            for i in keys:
                item = "%s=%s" % (i, "'" + whereData[i] + "'")
                newData2.append(item)
            whereItems = " AND ".join(newData2)
            sql = "update " + tableName + " set " + items + " where " + whereItems
            self.query("set names 'utf8'")
            self.query(sql)
            self.commit()
        except MySQLdb.Error as e:
            self.conn.rollback()
            print('MySql Error: %s %s' % (e.args[0], e.args[1]))

    def getLastInsertRowId(self):
        return self.cursor.lastrowid

    def getRowCount(self):
        return self.cursor.rowcount

    def commit(self):
        self.conn.commit()

    def close(self):
        self.cursor.close()
        self.conn.close()

class RedisHelper():

    __redis_instance = None

    def __init__(self):
        self.host = config.redis_host
        self.port = config.redis_port
        self.passwd = config.redis_passwd
        self.db = config.redis_db
        try:
            self.connPoor = redis.ConnectionPool(host=self.host,port=self.port,db=self.db,password=self.passwd)
            self.rd = redis.Redis(connection_pool=self.connPoor)
        except redis.DataError as e:
            print('Redis Error : %d %s' % (e.args[0], e.args[1]))

    @staticmethod
    def getObj():
        if RedisHelper.__redis_instance:
            return RedisHelper.__redis_instance
        else:
            RedisHelper.__redis_instance = RedisHelper().rd
            return RedisHelper.__redis_instance

    # string 操作

    def setkey(self,key,value,**kwargs):
        """
        set(name, value, ex=None, px=None, nx=False, xx=False)
        :param key: 鍵
        :param value: 值
        :param kwargs:
            在Redis中設(shè)置值,默認(rèn),不存在則創(chuàng)建,存在則修改
            參數(shù):
            ex,過(guò)期時(shí)間(秒)
            px,過(guò)期時(shí)間(毫秒)
            nx,如果設(shè)置為True,則只有name不存在時(shí),當(dāng)前set操作才執(zhí)行
            xx,如果設(shè)置為True,則只有name存在時(shí),當(dāng)前set操作才執(zhí)行
        :return: True or False
        """
        res = self.rd.set(key,value,**kwargs)

        return res

    def getkey(self,key):
        return self.rd.get(key)

    def setnxkey(self,key,value):
        """
        :param key:
        :param value:
        :return: True or False
        設(shè)置值,只有key不存在時(shí),執(zhí)行設(shè)置操作(添加)
        """
        return self.rd.setnx(key,value)

    def setexkey(self,key,value,time=5):
        """
        :param key:
        :param value:
        :param time: 過(guò)期時(shí)間 (秒 或 timedelta對(duì)象)
        :return: True or False
        """
        return self.rd.setex(key,time,value)

    def psetexkey(self,key,value,time):
        """
        :param key:
        :param value:
        :param time: time_ms,過(guò)期時(shí)間(數(shù)字毫秒 或 timedelta對(duì)象)
        :return:
        """
        return self.rd.psetex(key,time,value)

    def msetkey(self,mapping):
        """
        批量設(shè)置多個(gè)值
        :param mapping: {'k1':'v1','k2':'v2'} or k1='v1',k2='v2'
        :return:
        """
        return self.rd.mset(mapping)

    def mgetkey(self,keys,*args):
        """
        批量獲取多個(gè)值
        'k1','k2' or ['k1','k2']
        :param keys:
        :param args:
        :return:
        """
        return self.rd.mget(keys,args)

    def getsetkey(self,key,value):
        """
        獲取值并設(shè)置新值
        :param key:
        :param value:
        :return:
        """
        return self.rd.getset(key,value)

    def getrangekey(self,key,start,end):
        """
        獲取子序列(根據(jù)字節(jié)獲取,非字符) 一個(gè)漢字,是占3個(gè)字節(jié)
        :param key:
        :param start: bytes 起始位置(包含)
        :param end: bytes  結(jié)束位置(包含)
        :return:
        set 'name' 'helloworld'
        OK
        GETRANGE 'name' 0 2
        "hel"
        getrange 'name' 0 -1
        "helloworld"
        """
        return self.rd.getrange(key,start,end)

    def setrange(self,key,index,value):
        """
        修改字符串內(nèi)容,從指定字符串索引開(kāi)始向后替換(新值太長(zhǎng)時(shí),則向后添加)
        參數(shù):

        :param key:
        :param index: 字符串的索引,字節(jié)(一個(gè)漢字三個(gè)字節(jié))
        :param value: 要設(shè)置的值
        :return:
        """
        return self.rd.setrange(key,index,value)

    def strlenkey(self,key):
        """
        返回name對(duì)應(yīng)值的字節(jié)長(zhǎng)度(一個(gè)漢字3個(gè)字節(jié))
        :param key:
        :return:
        """
        return self.rd.strlen(key)

    def incrkey(self,key):
        """
        自增 name對(duì)應(yīng)的值,當(dāng)name不存在時(shí),則創(chuàng)建name=amount,否則,則自增。
        :param key:
        :param amount: 自增數(shù) 必須是整數(shù) 一次只能自增一個(gè)
        :return:
        """

        return self.rd.incr(key,1)

    def incrbykey(self,key,amount=1):
        """
        自增 key對(duì)應(yīng)的值,當(dāng)key不存在時(shí),則創(chuàng)建key=amount,否則,則自增。
        :param key:
        :param amount: 自增數(shù) 必須是整數(shù)
        :return:
        """
        try:
            if not isinstance(amount,int):
                raise TypeError('amount 必須是整數(shù)')
            return self.rd.incrby(key,amount)
        except Exception as e:
            return "Func incrbykey Error : %d %s" % (e.args[0], e.args[1])

    def incrbyfloatkey(self,key,amount=1.0):
        """
        自增 key對(duì)應(yīng)的值,當(dāng)key不存在時(shí),則創(chuàng)建key=amount,否則,則自增。
        :param key:
        :param amount: 自增數(shù)(浮點(diǎn)型)
        :return:
        """
        try:
            if not isinstance(amount,float):
                raise TypeError('amount 必須是浮點(diǎn)數(shù)')
            return self.rd.incrbyfloat(key,amount)
        except Exception as e:
            return "Func incrbyfloatkey Error : %d %s" % (e.args[0], e.args[1])

    def decrkey(self,key):
        """
        自減 name對(duì)應(yīng)的值,當(dāng)name不存在時(shí),則創(chuàng)建name=amount,否則,則自減
        :param name:
        :return:
        """
        self.rd.decr(key,1)

    def decrbykey(self,key,amount=1):
        """
        自減 key對(duì)應(yīng)的值,當(dāng)key不存在時(shí),則創(chuàng)建key=amount,否則,則自減。
        :param key:
        :param amount: 自減數(shù) 必須是整數(shù)
        :return:
        """
        try:
            if not isinstance(amount, int):
                raise TypeError('amount 必須是整數(shù)')
            return self.rd.decrby(key, amount)
        except Exception as e:
            return "Func decrbykey Error : %d %s" % (e.args[0], e.args[1])

    def appendkey(self,key,value):
        """
        在redis key對(duì)應(yīng)的值后面追加內(nèi)容
        :param key:
        :param value: 要追加的字符串
        :return:
        """
        return self.rd.append(key,value)

    def setbitkey(self,key,index,value):
        """
        注:如果在Redis中有一個(gè)對(duì)應(yīng): n1 = "foo",
        那么字符串foo的二進(jìn)制表示為:01100110 01101111 01101111
        所以,如果執(zhí)行 setbit('n1', 7, 1),則就會(huì)將第7位設(shè)置為1,
        那么最終二進(jìn)制則變成 01100111 01101111 01101111,即:"goo"

        擴(kuò)展,轉(zhuǎn)換二進(jìn)制表示:
        source = "陳思維"
        source = "foo"
        for i in source:
        num = ord(i)
        print bin(num).replace('b','')
        特別的,如果source是漢字 "陳思維"怎么辦?
        答:對(duì)于utf-8,每一個(gè)漢字占 3 個(gè)字節(jié),那么 "陳思維" 則有 9個(gè)字節(jié)
        對(duì)于漢字,for循環(huán)時(shí)候會(huì)按照 字節(jié) 迭代,那么在迭代時(shí),將每一個(gè)字節(jié)轉(zhuǎn)換 十進(jìn)制數(shù),然后再將十進(jìn)制數(shù)轉(zhuǎn)換成二進(jìn)制
        11100110 10101101 10100110 11100110 10110010 10011011 11101001 10111101 10010000

        對(duì)name對(duì)應(yīng)值的二進(jìn)制表示的位進(jìn)行操作
        :param key:
        :param index: 位的索引(將值變換成二進(jìn)制后再進(jìn)行索引)
        :param value: 值只能是 1 或 0
        :return:
        """
        try:
            if not isinstance(index,int):
                raise TypeError('index 只能是數(shù)字')
            if  value not in [0,1]:
                raise ValueError('value 只能是0或1' )

            return self.rd.setbit(key,index,value)

        except Exception as e:
            return "Redis Error : %d %s" % (e.args[0], e.args[1])

    def getbitkey(self,key,index):
        """
        獲取name對(duì)應(yīng)的值的二進(jìn)制表示中的某位的值 (0或1)
        :param key:
        :param index: 0 or 1
        :return:
        """
        try:
            if index not in [0,1]:
                raise ValueError("index 值只能是0或1")
            return self.rd.getbit(key,index)
        except Exception as e:
            return "Redis Error : %d %s" % (e.args[0], e.args[1])

    def bitcountkey(self,key,start=None,end=None):
        """
        獲取name對(duì)應(yīng)的值的二進(jìn)制表示中 1 的個(gè)數(shù)
        :param key:
        :param start:
        :param end:
        :return:
        """
        return self.rd.bitcount(key,start,end)

    def bitopkey(self,operation,new_key,*keys):
        """
        bitop("AND", 'new_name', 'n1', 'n2', 'n3')
        獲取Redis中n1,n2,n3對(duì)應(yīng)的值,然后講所有的值做位運(yùn)算(求并集),然后將結(jié)果保存 new_name 對(duì)應(yīng)的值中
        r.set("foo","1")  # 0110001
        r.set("foo1","2")  # 0110010
        print(r.mget("foo","foo1"))  # ['goo1', 'baaanew']
        print(r.bitop("AND","new","foo","foo1"))  # "new" 0 0110000
        print(r.mget("foo","foo1","new"))

        source = "12"
        for i in source:
        num = ord(i)
        print(num)  # 打印每個(gè)字母字符或者漢字字符對(duì)應(yīng)的ascii碼值 f-102-0b100111-01100111
        print(bin(num))  # 打印每個(gè)10進(jìn)制ascii碼值轉(zhuǎn)換成二進(jìn)制的值 0b1100110(0b表示二進(jìn)制)
        print bin(num).replace('b','')  # 將二進(jìn)制0b1100110替換成01100110

        獲取多個(gè)值,并將值做位運(yùn)算,將最后的結(jié)果保存至新的name對(duì)應(yīng)的值
        :param operation: AND(并) 、 OR(或) 、 NOT(非) 、 XOR(異或)
        :param new_key: new key
        :param keys: 要查找的Redis的name
        :return:
        """
        return self.rd.bitop(operation,new_key,keys)

    # hash 操作

    def hsetkey(self,name,key,value):
        """
        name對(duì)應(yīng)的hash中設(shè)置一個(gè)鍵值對(duì)(不存在,則創(chuàng)建;否則,修改)

        :param name: redis的name
        :param key: name對(duì)應(yīng)的hash中的key
        :param value: name對(duì)應(yīng)的hash中的value
        :return:
        """
        return self.rd.hset(name,key,value)

    def hmsetkey(self,name,mapping):
        """
        在name對(duì)應(yīng)的hash中批量設(shè)置鍵值對(duì)
        :param name:
        :param mapping: {'k1':'v1','k2':'v2'}
        :return:
        """
        return self.rd.hmset(name,mapping)

    def hgetkey(self,name,key):
        """
        在name對(duì)應(yīng)的hash中獲取根據(jù)key獲取value
        :param name:
        :param key:
        :return:
        """
        return self.rd.hget(name,key)

    def hgetallkey(self,name):
        """
        獲取hash中對(duì)應(yīng)name的所有值
        :param name:
        :return:
        """
        return self.rd.hgetall(name)

    def hmgetkey(self,name,keys,*args):
        """
        在name對(duì)應(yīng)的hash中獲取多個(gè)key的值
        :param name:
        :param keys: ['k1','k2','k3']
        :param args: 'k1','k2','k3'
        :return:
        """
        return self.rd.hmget(name,keys,args)

    def hlenkey(self,name):
        """
        獲取name對(duì)應(yīng)的hash中的鍵值對(duì)的個(gè)數(shù)
        :param name:
        :return:
        """
        return self.rd.hlen(name)

    def hallkeys(self,name):
        """
        獲取name對(duì)應(yīng)的hash中所有的key的值
        :param name:
        :return:
        """
        return self.rd.hkeys(name)

    def hvalskeys(self, name):
        """
        獲取name對(duì)應(yīng)的hash中所有的value的值
        :param name:
        :return:
        """
        return self.rd.hvals(name)

    def hexistskeys(self,name,key):
        """
        檢查name對(duì)應(yīng)的hash是否存在當(dāng)前傳入的key 類似字典的in
        :param name:
        :param key:
        :return:
        """
        return self.rd.hexists(name,key)

    def hdelkeys(self,name,*keys):
        """
        將name值對(duì)應(yīng)的hash中指定key的鍵值對(duì)刪除
        :param name:
        :param keys: 'k1' or 'k1','k2'
        :return:
        """
        return self.rd.hdel(name,keys)

    def hincrby(self,name,key,amount=1):
        """
        將key對(duì)應(yīng)的value--整數(shù) 自增1或者2,或者別的整數(shù) 負(fù)數(shù)就是自減(自增name對(duì)應(yīng)的hash中的指定key的值,不存在則創(chuàng)建key=amount)
        :param name:
        :param key:
        :param amount:
        :return:
        """
        try:
            if not isinstance(amount,int):
                raise TypeError('amount 只能是整數(shù)')
            return self.rd.hincrby(name,key,amount)
        except Exception as e:
            return "Func hincrby Error : %d %s" % (e.args[0], e.args[1])

    def hincrbyfloatkeys(self,name,key,amount=1.0):
        """
        將key對(duì)應(yīng)的value--浮點(diǎn)數(shù) 自增1.0或者2.0,或者別的浮點(diǎn)數(shù) 負(fù)數(shù)就是自減 (自增name對(duì)應(yīng)的hash中的指定key的值,不存在則創(chuàng)建key=amount)
        :param name:
        :param key:
        :param amount: 自增數(shù)(浮點(diǎn)數(shù))
        :return:
        """
        try:
            if not isinstance(amount,float):
                raise TypeError('amount 只能是浮點(diǎn)數(shù)')
            return self.rd.hincrbyfloat(name, key, amount)
        except Exception as e:
            return "Func hincrby Error : %d %s" % (e.args[0], e.args[1])

    def hscankeys(self,name,cursor=0,match=None,count=None):
        """
        增量式迭代獲取,對(duì)于數(shù)據(jù)大的數(shù)據(jù)非常有用,hscan可以實(shí)現(xiàn)分片的獲取數(shù)據(jù),并非一次性將數(shù)據(jù)全部獲取完,從而放置內(nèi)存被撐爆
        :param name:
        :param curosr: 游標(biāo)(基于游標(biāo)分批取獲取數(shù)據(jù))
        :param match: 匹配指定key,默認(rèn)None 表示所有的key
        :param count: 每次分片最少獲取個(gè)數(shù),默認(rèn)None表示采用Redis的默認(rèn)分片個(gè)數(shù)
        :return:
        """
        return self.rd.hscan(name,cursor,match,count)

    def hscaniterkeys(self,name,match=None,count=None):
        """
        利用yield 封裝hscan創(chuàng)建生成器,實(shí)現(xiàn)分批器redis中獲取數(shù)據(jù)
        :param name:
        :param match: 匹配指定key,默認(rèn)表示所有key
        :param count: 每次分片最少獲取個(gè)數(shù),默認(rèn)None表示采用Redis的默認(rèn)分片個(gè)數(shù)
        :return:
        """
        return self.rd.hscan_iter(name,match,count)

    # list 操作

    def lpushkeys(self,key,values):
        """
        增加(類似于list的append,只是這里是從左邊新增加)--沒(méi)有就新建
        在name對(duì)應(yīng)的list中添加元素,每個(gè)新的元素都添加到列表的最左邊
        lpush('xx',11,12,13)
        :param key:
        :param values:
        :return:
        """
        return self.rd.lpush(key,values)

    def  rpushkeys(self,key,values):
        """
        增加(類似于list的append,只是這里是從右邊新增加)--沒(méi)有就新建
        在name對(duì)應(yīng)的list中添加元素,每個(gè)新的元素都添加到列表的最右邊
        rpush('xx',11,12,13)
        :param key:
        :param values:
        :return:
        """
        return self.rd.rpush(key,values)

    def lpushxkeys(self,key,value):
        """
        在key對(duì)應(yīng)的list中添加一個(gè)元素,只有key存在時(shí),值添加到列表的最左邊,key不存在則不能創(chuàng)建,但是不報(bào)錯(cuò)
        :param key:
        :param values:
        :return:
        """
        return self.rd.lpushx(key,value)

    def rpushxkeys(self,key,value):
        """
        在key對(duì)應(yīng)的list中添加一個(gè)元素,只有key存在時(shí),值添加到列表的最右邊,key不存在則不能創(chuàng)建,但是不報(bào)錯(cuò)
        :param key:
        :param value:
        :return:
        """
        return self.rd.rpushx(key,value)

    def linsertkeys(self,key,where,refvalue,value):
        """
        在key對(duì)應(yīng)的列表的某一個(gè)值前或后插入一個(gè)新值

        r.linsert("list2", "before", "11", "00")   # 往列表中左邊第一個(gè)出現(xiàn)的元素"11"前插入元素"00"

        :param key:
        :param where: before or after
        :param refvalue: 標(biāo)桿值,即:在它前后插入數(shù)據(jù)
        :param value:  要插入的數(shù)據(jù)
        :return:
        """
        try:
            if str(where).lower() not in ['before','after']:
                raise ValueError('where 值只能是 before 或 after')
            return self.rd.linsert(key,where,refvalue,value)
        except Exception as e:
            return "Func linsertkeys Error: %d %s"%(e.args[0],e.args[1])

    def lsetkeys(self,key,index,value):
        """
        對(duì)key對(duì)應(yīng)的list中的某一個(gè)索引位置重新賦值
        :param key:
        :param index: 索引值,從0 開(kāi)始
        :param value:
        :return:
        """
        try:
            if not isinstance(index,int):
                raise TypeError('index 只能是整數(shù)')
            return self.rd.lset(key,index,value)
        except Exception as e:
            return "Func lsetkeys: %d %s"%(e.args[0],e.args[1])

    def lremkeys(self,key,num,value):
        """
        在key對(duì)應(yīng)的list中刪除指定的值
        :param key:
        :param value:
        :param num: num=0,刪除列表中所有指定值,num=2,從前到后,刪除2個(gè),num=1,從前到后,刪除左邊第一個(gè),num=-2,從后到前,刪除兩個(gè)
        :return:
        """
        return self.rd.lrem(key,num,value)

    def lpopkeys(self,key):
        """
        在key 對(duì)應(yīng)的列表的左側(cè)獲取第一個(gè)元素并在列表中移除,返回值則是第一個(gè)元素
        :param key:
        :return:
        """
        return self.rd.lpop(key)

    def rpopkeys(self,key):
        """
        在key 對(duì)應(yīng)的列表的右側(cè)獲取第一個(gè)元素并在列表中移除,返回值則是第一個(gè)元素
        :param key:
        :return:
        """
        return self.rd.rpop(key)

    def ltrimkeys(self,key,start,end):
        """
        在key對(duì)應(yīng)的list中移除沒(méi)有在start - end 索引之間的值
        :param key:
        :param start: 索引的開(kāi)始位置
        :param end: 索引的結(jié)束位置
        :return:
        """
        return self.rd.ltrim(key,start,end)

    def lindexkeys(self,key,index):
        """
        在name對(duì)應(yīng)的list中根據(jù)索引獲取列表元素
        :param key:
        :param index:
        :return:
        """
        return self.rd.lindex(key,index)

    def rpoplpushkeys(self,srckey,dstkey):
        """
        將元素從一個(gè)表移動(dòng)到另一個(gè)表中(從一個(gè)列表取出最右邊的元素,同時(shí)將其添加至另一個(gè)列表的最左邊)
        :param srckey:
        :param detkey:
        :return:
        """
        return self.rd.rpoplpush(srckey,dstkey)

    def brpoplpushkeys(self,srckey,dstkey,timeout=0):
        """
        從一個(gè)列表的右側(cè)移除一個(gè)元素并將其添加到另一個(gè)列表的左側(cè),可以設(shè)置超時(shí)
        :param srckey:
        :param dstkey:
        :param timeout: 當(dāng)seckey對(duì)應(yīng)的list中沒(méi)有數(shù)據(jù)時(shí),阻塞等待其有數(shù)據(jù)的超時(shí)時(shí)間 單位為秒,0表示永遠(yuǎn)阻塞
        :return:
        """
        return self.rd.brpoplpush(srckey,dstkey,timeout)

    def blpopkeys(self,keys,timeout):
        """
        將多個(gè)列表排序,按照從左到右去pop對(duì)應(yīng)的list元素
        :param keys:
        :param timeout: 超時(shí)時(shí)間,當(dāng)元素所有列表的元素獲取完之后,阻塞等待列表內(nèi)有數(shù)據(jù)的時(shí)間(秒), 0 表示永遠(yuǎn)阻塞
        :return:
        """
        return self.rd.blpop(keys,timeout)

    def brpopkeys(self,keys,timeout):
        """
        將多個(gè)列表排序,按照從右到左去pop對(duì)應(yīng)的list元素
        :param keys:
        :param timeout: 超時(shí)時(shí)間,當(dāng)元素所有列表的元素獲取完之后,阻塞等待列表內(nèi)有數(shù)據(jù)的時(shí)間(秒), 0 表示永遠(yuǎn)阻塞
        :return:
        """
        return self.rd.brpop(keys,timeout)

    def llenkeys(self,key):
        """
        返回key的數(shù)據(jù)長(zhǎng)度
        :param key:
        :return:
        """
        return self.rd.llen(key)

    def lrangekeys(self,key,start=0,end=-1):
        """
        獲取key的全部數(shù)據(jù)值 通常與llen聯(lián)用
        :param key:
        :param start: 起始位置(包括)
        :param end: 結(jié)束位置(包括)
        :return:
        """
        return self.rd.lrange(key,start,end)

    def listiterkeys(self,key):
        """
        list增量迭代
        :param key:
        :return: 返回yield 生成器
        """
        list_count = self.rd.llen(key)
        for index in range(list_count):
            yield self.rd.lindex(key,index)

    # set 操作

    def saddkeys(self,key,values):
        """
        :key對(duì)應(yīng)的集合中添加元素,重復(fù)的元素將忽略
        saddkeys('xxx',1,2,3,4,5)
        :param key:
        :param values:
        :return:
        """
        return self.rd.sadd(key,values)

    def scardkeys(self,key):
        """
        獲取元素個(gè)數(shù),類似于len
        :param key:
        :return:
        """
        return self.rd.scard(key)

    def smemnerkeys(self,key):
        """
        獲取key對(duì)應(yīng)的集合的所有成員
        :param key:
        :return:
        """
        return self.rd.smembers(key)

    def sscankeys(self, key, cursor=0, match=None, count=None):
        """
        獲取集合中所有的成員 -- 元組形式
        :param key:
        :param cursor:
        :param match:
        :param count:
        :return:
        """
        return self.rd.sscan(key,cursor,match,count)

    def sscaniterkeys(self,key,match=0,count=None):
        """
        獲取集合中所有的成員 --迭代器方式
        :param key:
        :param match:
        :param count:
        :return:
        """
        return self.rd.sscan_iter(key,match,count)

    def sdiffkeys(self,keys,*args):
        """
        在第一個(gè)key對(duì)應(yīng)的集合中且不在其他key對(duì)應(yīng)的集合的元素集合
        sdiffkeys('a','b) 在集合a中并且不再集合b中
        :param keys:
        :param args:
        :return:
        """
        return self.rd.sdiff(keys,args)

    def sdiffstorekeys(self,dstkey,keys,*args):
        """
        獲取第一個(gè)key對(duì)應(yīng)的集合中且不在其他name對(duì)應(yīng)的結(jié)合,在將其加入到dstkey對(duì)應(yīng)的集合中
        :param dstkey:
        :param keys:
        :param args:
        :return:
        """
        res = self.rd.sdiffstore(dstkey,keys,args)
        return res

    def sinterkeys(self,keys,*args):
        """
        獲取多個(gè)keys對(duì)應(yīng)集合的交集
        :param keys:
        :param args:
        :return:
        """
        return self.rd.sinter(keys,args)

    def sinterstorekeys(self,dstkey,keys,*args):
        """
        獲取多個(gè)keys對(duì)應(yīng)集合的交集,再將其加入到dstkey對(duì)應(yīng)的集合中
        :param dstkey:
        :param keys:
        :param args:
        :return:
        """
        res = self.rd.sinterstore(dstkey,keys,args)
        return res

    def sunionkeys(self,keys,*args):
        """
        獲取多個(gè)key對(duì)應(yīng)的集合的并集
        :param keys:
        :param args:
        :return:
        """
        return self.rd.sunion(keys,args)

    def sunionstorekeys(self,dstkey,keys,*args):
        """
        獲取多個(gè)key對(duì)應(yīng)集合的并集,并將其結(jié)果保存到dstkey對(duì)應(yīng)的集合中
        :param dstkey:
        :param keys:
        :param args:
        :return:
        """
        return self.rd.sunionstore(dstkey,keys,args)

    def sismemberkeys(self,key,value):
        """
        檢查value是否是key對(duì)應(yīng)的結(jié)合的成員,結(jié)果返回True or False
        :param key:
        :param value:
        :return: True or False
        """
        return self.rd.sismember(key,value)

    def smovekeys(self,srckey,dstkey,value):
        """
        將某個(gè)成員從一個(gè)集合中移動(dòng)到另一個(gè)集合
        :param srckey:
        :param dstkey:
        :param value:
        :return:
        """
        return self.rd.smove(srckey,dstkey,value)

    def spopkeys(self,key):
        """
        從集合移除一個(gè)成員,并將其返回,說(shuō)明一下,集合是無(wú)序的,所有都是隨機(jī)刪除的
        :param key:
        :return:
        """
        return self.rd.spop(key)

    def sremkeys(self,key,values):
        """
        在key對(duì)應(yīng)的集合中刪除某些值
        sremkeys('xx','a','b')
        :param key:
        :param values:
        :return:
        """
        return self.rd.srem(key,values)

    #  有序集合  zset 操作

    def zaddkeys(self,key,mapping):
        """
        在key對(duì)應(yīng)的有序集合中添加元素
        zaddkeys('xx',{'k1':1,'k2':2})

        :param key:
        :param args:
        :param kwargs:
        :return:
        """
        return self.rd.zadd(key,mapping)

    def zcardkeys(self,key):
        """
        獲取有序集合元素的個(gè)數(shù)
        :param key:
        :return:
        """
        return self.rd.zcard(key)

    def zrangekeys(self,key,start,stop,desc=False,withscores=False,score_cast_func=float):
        """
        獲取有序集合索引范圍內(nèi)的元素
        :param key:
        :param start: 索引起始位置
        :param stop: 索引結(jié)束位置
        :param desc: 排序規(guī)則,默認(rèn)按照分?jǐn)?shù)從小到大排序
        :param withscores: 是否獲取元素的分?jǐn)?shù),默認(rèn)之火去元素的值
        :param score_cast_func: 對(duì)分?jǐn)?shù)進(jìn)行數(shù)據(jù)轉(zhuǎn)換的函數(shù)
        :return:
        """
        return self.rd.zrange(key,start,stop,desc,withscores,score_cast_func)

    def zrevrangekeys(self,key,start,end,withscores=False,score_cast_func=float):
        """
        從大到小排序
        :param key:
        :param start:
        :param end:
        :param withscores:
        :param score_cast_func:
        :return:
        """
        return self.rd.zrevrange(key,start,end,withscores,score_cast_func)

    def zrangebyscorekeys(self,key,min,max,start=None,num=None,withscores=False,score_cast_func=float):
        """
        按照分?jǐn)?shù)返回獲取key對(duì)應(yīng)的有序集合的元素
        zrangebyscore("zset3", 15, 25)) # # 在分?jǐn)?shù)是15-25之間,取出符合條件的元素
        zrangebyscore("zset3", 12, 22, withscores=True)   # 在分?jǐn)?shù)是12-22之間,取出符合條件的元素(帶分?jǐn)?shù))

        :param key:
        :param min:
        :param max:
        :param start:
        :param num:
        :param withscores:
        :param score_cast_func:
        :return:
        """
        return self.rd.zrangebyscore(key,min,max,start,num,withscores,score_cast_func)

    def zrevrangebyscorekeys(self,key,max,min,start=None,num=None,withscores=False,score_cast_func=float):
        """
        按照分?jǐn)?shù)范圍獲取有序集合的元素并排序(默認(rèn)按照從大到小排序)
        :param key:
        :param max:
        :param min:
        :param start:
        :param num:
        :param withscores:
        :param score_cast_func:
        :return:
        """
        return self.rd.zrevrangebyscore(key,max,min,start,num,withscores,score_cast_func)

    def zscankeys(self,key,cursor=0,match=None,count=None,score_cast_func=float):
        """
        獲取所有元素 -- 默認(rèn)按照分?jǐn)?shù)順序排序
        :param key:
        :param cursor:
        :param match:
        :param count:
        :param score_cast_func:
        :return:
        """
        return self.rd.zscan(key,cursor,match,count,score_cast_func)

    def zscaniterkeys(self,key,match=None,count=None,score_cast_func=float):
        """
        獲取所有元素的迭代器
        :param key:
        :param match:
        :param count:
        :param score_cast_func:
        :return:
        """
        return self.rd.zscan_iter(key,match,count,score_cast_func)

    def zcountkeys(self,key,min,max):
        """
        獲取key對(duì)應(yīng)的有序集合中分?jǐn)?shù)在[min,max] 之間的個(gè)數(shù)
        :param key:
        :param min:
        :param max:
        :return:
        """
        return self.rd.zcount(key,min,max)

    def zincrbykey(self,key,value,amount=1):
        """
        自增key對(duì)應(yīng)的有序集合key對(duì)應(yīng)的分?jǐn)?shù)
        :param key:
        :param value:
        :param amount:
        :return:
        """
        return self.rd.zincrby(key,amount,value)

    def zrankeys(self,key,value):
        """
        獲取某個(gè)值在key對(duì)應(yīng)的有序集合中的索引(從0開(kāi)始),默認(rèn)是從小到大順序
        :param key:
        :param value:
        :return:
        """
        return self.rd.zrank(key,value)

    def zrevrankey(self,key,value):
        """
        獲取某個(gè)值在key對(duì)應(yīng)的有序集合中的索引,默認(rèn)是從大到小順序
        :param key:
        :param value:
        :return:
        """
        return self.rd.zrevrank(key,value)

    def zremkeys(self,key,values):
        """
        刪除key對(duì)應(yīng)的有序集合中值是value的成員
        :param key:
        :param value:
        :return:
        """
        return self.rd.zrem(key,values)

    def zremrangebyrankeys(self,key,min,max):
        """
        刪除根據(jù)排行范圍刪除,按照索引刪除
        :param key:
        :param min:
        :param max:
        :return:
        """
        return self.rd.zremrangebyrank(key,min,max)

    def zremrangebyscoreskeys(self,key,min,max):
        """
        刪除根據(jù)分?jǐn)?shù)范圍刪除,按照分?jǐn)?shù)范圍刪除
        :param key:
        :param min:
        :param max:
        :return:
        """
        return self.rd.zremrangebyscore(key,min,max)

    def zscoreskeys(self,key,value):
        """
        獲取key對(duì)應(yīng)有序集合中value對(duì)應(yīng)的分?jǐn)?shù)
        :param key:
        :param value:
        :return:
        """
        return self.rd.zscore(key,value)

    # 其他常用操作

    def deletekeys(self,*keys):
        """
        根據(jù)刪除redis中的任意數(shù)據(jù)類型
        deletekeys('gender','cname') 可以刪除多個(gè)key
        :param keys:
        :return:
        """
        return self.rd.delete(*keys)

    def existskeys(self,key):
        """
        檢測(cè)redis的key 是否存在,存在就返回True,False則不存在
        :param key:
        :return:
        """
        return  self.rd.exists(key)

    def getkeys(self,pattern=""):
        """
        根據(jù)模型獲取redis的key

        getkeys * 匹配數(shù)據(jù)庫(kù)中所有 key 。
        getkeys h?llo 匹配 hello , hallo 和 hxllo 等。
        getkeys hllo 匹配 hllo 和 heeeeello 等。
        getkeys h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo

        :param pattern:
        :return:
        """
        return self.rd.keys(pattern)

    def expirekeys(self,key,time):
        """
        設(shè)置超時(shí)時(shí)間,為某個(gè)key設(shè)置超時(shí)時(shí)間
        :param key:
        :param time: 秒
        :return:
        """
        return self.rd.expire(key,time)

    def renamekeys(self,srckey,dstkey):
        """
        對(duì)key進(jìn)行重命名
        :param srckey:
        :param dstkey:
        :return:
        """
        return self.rd.rename(srckey,dstkey)

    def randomkeys(self):
        """
        隨即獲取一個(gè)key(不刪除)
        :return:
        """
        return self.rd.randomkey()

    def getkeytypes(self,key):
        """
        獲取key的類型
        :param key:
        :return:
        """
        return self.rd.type(key)

    def scankeys(self,cursor=0,match=None,count=None):
        """
        查看所有key,終極大招
        :param cursor:
        :param match:
        :param count:
        :return:
        """
        return self.rd.scan(cursor,match,count)

    def scaniterkeys(self,match=None,count=None):
        """
        查看所有key的迭代器,防止內(nèi)存被撐爆
        :param match:
        :param count:
        :return:
        """
        return self.rd.scan_iter(match,count)

    def dbsizekeys(self):
        """
        當(dāng)前redis包含多少條數(shù)據(jù)
        :return:
        """
        return self.rd.dbsize()

    def savekeys(self):
        """
        將數(shù)據(jù)刷入磁盤(pán)中,保存時(shí)阻塞
        :return:
        """
        return self.rd.save()

    def flushdbkeys(self,asynchronous=False):
        """
        清空當(dāng)前數(shù)據(jù)庫(kù)的所有數(shù)據(jù),請(qǐng)謹(jǐn)慎使用
        :param asynchronous:異步
        :return:
        """
        return self.rd.flushdb(asynchronous)

    def flushallkeys(self,asynchronous=False):
        """
        清空redis所有庫(kù)中的數(shù)據(jù),不到最后時(shí)刻 請(qǐng)不要使用
        :param asynchronous: 異步
        :return:
        """

        return self.rd.flushall(asynchronous)

    # 創(chuàng)建管道

    """
    redis默認(rèn)在執(zhí)行每次請(qǐng)求都會(huì)創(chuàng)建(連接池申請(qǐng)連接)和斷開(kāi)(歸還連接池)一次連接操作,
    如果想要在一次請(qǐng)求中指定多個(gè)命令,則可以使用pipline實(shí)現(xiàn)一次請(qǐng)求指定多個(gè)命令,
    并且默認(rèn)情況下一次pipline 是原子性操作。
    管道(pipeline)是redis在提供單個(gè)請(qǐng)求中緩沖多條云服務(wù)器命令的基類的子類。
    它通過(guò)減少云服務(wù)器-客戶端之間反復(fù)的TCP數(shù)據(jù)庫(kù)包,從而大大提高了執(zhí)行批量命令的功能。

    """
    def createpipe(self):
        """
        pipeline(transaction=False)    # 默認(rèn)的情況下,管道里執(zhí)行的命令可以保證執(zhí)行的原子性,執(zhí)行pipe = r.pipeline(transaction=False)可以禁用這一特性。
        pipe = r.pipeline() # 創(chuàng)建一個(gè)管道

        pipe.set('name', 'jack')
        pipe.set('role', 'sb')
        pipe.sadd('faz', 'baz')
        pipe.incr('num')    # 如果num不存在則vaule為1,如果存在,則value自增1
        pipe.execute()

        pipe.set('hello', 'redis').sadd('faz', 'baz').incr('num').execute()

        :return:
        """
        return  self.rd.pipeline()

    def disconectkeys(self):
        return self.connPoor.disconnect()

class QueryAllData():
    def __init__(self):
        self.show_tables = config.mysql_show_tables
        self.desc_table = config.mysql_desc_table
        self.query_info = config.mysql_query_info

    def query_tables_info(self):
        mhelper = MySQLHelper()
        tables_list = mhelper.queryTableNums(self.show_tables)
        tables_attr = {}
        for table in tables_list:
            rows = mhelper.queryAll(self.query_info %table)
            tables_attr[table] = rows

        mhelper.close()
        return tables_attr

    def mysql2redis(self,redisobj):

        mysql_data = self.query_tables_info()

        for keys, values in mysql_data.items():
            # keys 為表名字
            for val in values:
                # val 為每一行的數(shù)據(jù)
                keysorted = sorted(val.keys())
                for s in keysorted:
                    #s 為數(shù)據(jù)的key
                    item = '%s:%s'%(keys,str(val['id']))
                    ischange = redisobj.hgetkey(item,s)
                    if ischange != val[s]:
                        redisobj.hsetkey(item,s,val[s])

if __name__ == "__main__":

    queryalldata = QueryAllData()
    rhelper = RedisHelper()
    while True:
        queryalldata.mysql2redis(rhelper)

看完以上關(guān)于mysql中單個(gè)庫(kù)數(shù)據(jù)該怎么樣同步到redis數(shù)據(jù)庫(kù)中,很多讀者朋友肯定多少有一定的了解,如需獲取更多的行業(yè)知識(shí)信息 ,可以持續(xù)關(guān)注我們的行業(yè)資訊欄目的。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI