成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

基于內(nèi)存的類似redis的緩存方法-創(chuàng)新互聯(lián)

項(xiàng)目中需要用到redis,業(yè)務(wù)起來之后用到的地方更多,問題來了,因?yàn)椴僮鱮edis太頻繁,導(dǎo)致操作redis成為整個項(xiàng)目的瓶頸,經(jīng)過調(diào)研和比較這時(shí)候基于內(nèi)存的cache登場,簡單來說就是純內(nèi)存層面的cache,可以實(shí)現(xiàn)
1、緩存數(shù)量的限制(不能無限制的堆內(nèi)存,會撐爆)
2、能設(shè)置過期時(shí)間(內(nèi)存中只緩存高頻出現(xiàn)的數(shù)據(jù))

創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比漣水網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式漣水網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋漣水地區(qū)。費(fèi)用合理售后完善,十年實(shí)體公司更值得信賴。

放上業(yè)務(wù)流程的對比圖,就是在redis之前加了一層,比較redis雖然基于內(nèi)存但是連接包括操作還是得產(chǎn)生網(wǎng)絡(luò)io操作

基于內(nèi)存的類似redis的緩存方法

下面是我做的對比測試:

普通數(shù)據(jù):

1、假設(shè)全部不命中(內(nèi)存和redis都沒有):
    [root@master test]# python 6.py
    這是100次的結(jié)果
    內(nèi)存:[0.006078958511352539, 0.00607609748840332, 0.006433963775634766]
    redis:[0.00573420524597168, 0.007025003433227539, 0.005178928375244141]
    這是1000次的結(jié)果
 內(nèi)存:[0.07438397407531738, 0.07421493530273438, 0.0615389347076416]
    redis:[0.04864096641540527, 0.04749107360839844, 0.05013895034790039]
    這是10000次的結(jié)果
    內(nèi)存:[0.5369880199432373, 0.48474812507629395, 0.4684739112854004]
    redis:[0.4230480194091797, 0.5131900310516357, 0.43289995193481445]
    這是100000次的結(jié)果
    內(nèi)存:[5.565299987792969, 5.5354228019714355, 5.658163070678711]
    redis:[4.795120000839233, 5.0205230712890625, 4.469913005828857]
2、假設(shè)全部命中:
    [root@master test]# python 6.py
    這是100次的結(jié)果
    內(nèi)存:[0.00040602684020996094, 0.00021195411682128906, 0.00021600723266601562]
    redis:[0.005956888198852539, 0.005934000015258789, 0.005537986755371094]
    這是1000次的結(jié)果
    內(nèi)存:[0.0021610260009765625, 0.0020508766174316406, 0.002026081085205078]
    redis:[0.0546720027923584, 0.04969382286071777, 0.04725193977355957]
    這是10000次的結(jié)果
    內(nèi)存:[0.014709949493408203, 0.01748490333557129, 0.016735076904296875]
    redis:[0.500324010848999, 0.6110620498657227, 0.5946261882781982]
    這是100000次的結(jié)果
    內(nèi)存:[0.20346498489379883, 0.20162200927734375, 0.15467381477355957]
    redis:[5.065227031707764, 5.543213844299316, 5.167007207870483]

json格式的數(shù)據(jù):

1、假設(shè)全部不命中:
    [root@master test]# python json_test.py
    這是100次的結(jié)果
    內(nèi)存  [0.00627589225769043, 0.006350040435791016, 0.006167888641357422]
    redis [0.00538182258605957, 0.005352973937988281, 0.005239009857177734]
    這是1000次的結(jié)果
    內(nèi)存  [0.06096196174621582, 0.05894589424133301, 0.0531618595123291]
    redis [0.04534316062927246, 0.04644417762756348, 0.042047977447509766]
    這是10000次的結(jié)果
    內(nèi)存  [0.526871919631958, 0.49242496490478516, 0.54292893409729]
    redis [0.46350693702697754, 0.5339851379394531, 0.514045000076294]
    這是100000次的結(jié)果
    內(nèi)存 [5.3060479164123535, 5.807142972946167, 4.886216163635254]
    redis [4.287613153457642, 4.528016090393066, 5.158953905105591]
2、假設(shè)全部命中:
    [root@master test]# python json_test.py
    這是100次的結(jié)果
    內(nèi)存  [0.0005319118499755859, 0.0003058910369873047, 0.0002970695495605469]
    redis [0.006021022796630859, 0.005857944488525391, 0.006082773208618164]
    這是1000次的結(jié)果
    內(nèi)存  [0.0028162002563476562, 0.002669811248779297, 0.0026869773864746094]
    redis [0.07850098609924316, 0.06138491630554199, 0.05786609649658203]
    這是10000次的結(jié)果
    內(nèi)存  [0.02676105499267578, 0.026623010635375977, 0.026623010635375977]
    redis [0.6534669399261475, 0.6395609378814697, 0.47389698028564453]
    這是100000次的結(jié)果
    內(nèi)存 [0.20687103271484375, 0.20745611190795898, 0.19935917854309082]
    redis [5.537367105484009, 5.8351359367370605, 4.935602903366089]

可以看到,當(dāng)全部不命中(實(shí)際情況只有在第一次才會出現(xiàn),不然也不用加redis了)的情況下,基于內(nèi)存和基于redis的性能基本相同,但如果命中過之后這個性能就有很大提升了

直接上代碼:

#!/usr/bin/env python
# -*- coding:utf8 -*-
'''
Author : mafei
Date   : 2019-09-26
'''
import time
import weakref
import collections
import ujson as json

class Base(object):
    notFound = {}

    class Dict(dict):
        def __del__(self):
            pass

    def __init__(self, maxlen=10):
        self.weak = weakref.WeakValueDictionary()
        self.strong = collections.deque(maxlen=maxlen)

    @staticmethod
    def now_time():
        return int(time.time())

    def get(self, key):
        v = self.weak.get(key, self.notFound)

        if (v is not self.notFound):
            expire = v[r'expire']
            if (self.now_time() > expire):
                self.weak.pop(key)
                return self.notFound
            else:
                return v
        else:
            return self.notFound

    def set(self, key, value):

        self.weak[key] = strongRef = Base.Dict(value)
        self.strong.append(strongRef)

class MemoryCache(object):
    def __init__(self, maxlen=1000 * 10000, life_cycle=5*60):
        self.memory_cache = Base(maxlen=maxlen)
        self.maxlen = maxlen
        self.life_cycle = life_cycle

    @staticmethod
    def _compute_key(key):
        return key

    def get(self, k):
        memory_key = self._compute_key(k)
        result = self.memory_cache.get(memory_key).get('result', None)
        if result is None:
            return result
        return result

    def set(self, k, v, life_cycle=None):
        self._set_memory(k, v, life_cycle)

    def get_json(self, key):
        res = self.get(key)
        try:
            return json.loads(res)
        except:
            return res

    def set_json(self, k, v, life_cycle=None):
        try:
            v = json.dumps(v)
        except:
            pass
        self.set(k, v, life_cycle)

    def set_with_lock(self, k, v, life_cycle=None):
        self._set_memory(k, v, life_cycle)

    def _set_memory(self, k, v, life_cycle=None):
        life_cycle = life_cycle or self.life_cycle
        memory_key = self._compute_key(k)
        self.memory_cache.set(memory_key, {'ip': k, r'result': v, r'expire': life_cycle + self.memory_cache.now_time()})

調(diào)用時(shí)只需要傳入2個參數(shù):
maxlen : 內(nèi)存中最多緩存多少條數(shù)據(jù)
life_cycle: 數(shù)據(jù)失效時(shí)間

優(yōu)點(diǎn):
1、高效,比直接調(diào)用redis要快很多
2、不會產(chǎn)生網(wǎng)絡(luò)io和磁盤io

缺點(diǎn):
1、支持的結(jié)構(gòu)比較單一,當(dāng)然這個可以自己擴(kuò)充方式實(shí)現(xiàn)
2、如果要更新內(nèi)存中的值不太方便,可以有其他方式實(shí)現(xiàn)

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)站名稱:基于內(nèi)存的類似redis的緩存方法-創(chuàng)新互聯(lián)
轉(zhuǎn)載來于:http://jinyejixie.com/article46/peohg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、動態(tài)網(wǎng)站、品牌網(wǎng)站建設(shè)、微信公眾號、面包屑導(dǎo)航、移動網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)
广平县| 固原市| 大余县| 彭泽县| 大渡口区| 名山县| 曲麻莱县| 安国市| 沙田区| 卓尼县| 高安市| 吉隆县| 交城县| 雅安市| 苗栗县| 深泽县| 泰宁县| 阳信县| 淮南市| 贵阳市| 南投县| 尼勒克县| 桦南县| 临朐县| 都江堰市| 金昌市| 普安县| 吴旗县| 武隆县| 尉氏县| 宜阳县| 寿阳县| 囊谦县| 马龙县| 宜黄县| 勃利县| 海原县| 台山市| 南涧| 英山县| 调兵山市|