redis自定义缓存

 1 import weakref, collections
 2 import time
 3
 4
 5 class LocalCache():
 6     notFound = object()
 7
 8     class Dict(dict):
 9         def __del__(self):
10             pass
11
12     def __init__(self,maxlen=20):
13         self.weak = weakref.WeakKeyDictionary()
14         self.strong=collections.deque(maxlen=maxlen)
15
16     @staticmethod
17     def nowTime():
18         return int(time.time())
19
20     def get(self, key):
21         # 每个键值对后面加个字段过期时间
22         # 第一次获取 expire=当前时间+过期时间
23         # 非第一次获取时候,expire判断是否过期,过期可认为数据没有找到
24         # 过期后应该删除数据
25         value = self.weak.get(key, self.notFound)
26         # 没有过期
27         if (value is not self.notFound):
28             expire = value[r‘expire‘]
29             # 已经过期
30             if (self.nowTime() > expire):
31                 return self.notFound
32             else:
33                 return value
34         # 过期了-返回没有找到
35         else:
36             return self.notFound
37     def set(self,key,value):
38         self.weak[key]=strongRef=LocalCache.Dict(value)
39         self.strong.append(strongRef)
40
41
42 from functools import wraps
43
44
45 def funcCache(expire=1):
46     caches = LocalCache()
47
48     def _wrappend(func):
49         @wraps(func)
50         def __wrapped(*args, **kwargs):
51             # 计算出缓存的key值
52             key = str(func) + str(args) + str(kwargs)
53
54             result = caches.get(key)
55
56             if (result is LocalCache.notFound):
57                 result = func(*args, **kwargs)
58
59                 caches.set(key, {r‘result‘: result, r‘expire‘: expire + caches.nowTime()})
60
61                 result = caches.get(key)
62
63             return result
64
65         return __wrapped
66
67     return _wrappend
68 f=funcCache()

原文地址:https://www.cnblogs.com/zhedadao/p/9735431.html

时间: 2024-10-12 19:12:24

redis自定义缓存的相关文章

【新手总结】在.Net项目中使用Redis作为缓存服务

最近由于项目需要,在系统缓存服务部分上了redis,终于有机会在实际开发中玩一下,之前都是自己随便看看写写,很零碎也没沉淀下来什么,这次算是一个系统学习和实践过程的总结. 和Redis有关的基础知识 Redis是一个开源的分布式NoSql数据库,可以用来做缓存服务.消息队列.数据存储等等,数据类型之丰富,效率之高,简直逆天!没有了解过的可以移步去问度娘~客户端之丰富,足可见它的社区有多强大: 其中C#的客户端就有这么多: 没错,我们的项目里也选择了最热门的StackExchange.Redis作

Redis作为缓存自我总结

redis缓存服务器笔记 redis是一个高性能的key-value存储系统,能够作为缓存框架和队列 但是由于他是一个内存内存系统,这些数据还是要存储到数据库中的 作为缓存框架: create/updae/delete---同时存到redis和数据库 query--先从redis查,没有记录才从数据库查,并把从数据库查的结果也放一份到redis 作为缓存队列: 2.把对象Object存储到redis中,怎么存?memcache存取对象是序列化和反序列化 使用通用的序列化.反序列化(频繁的会很消耗

Spring AOP整合redis 实现缓存统一管理

项目使用redis作为缓存数据,但面临着问题,比如,项目A,项目B都用到redis,而且用的redis都是一套集群,这样会带来一些问题.问题:比如项目A的开发人员,要缓存一些热门数据,想到了redis,于是乎把数据放入到了redis,自定义一个缓存key:hot_data_key,数据格式是项目A自己的数据格式,项目B也遇到了同样的问题,也要缓存热门数据,也是hot_data_key,数据格式是项目B是自己的数据格式,由于用的都是同一套redis集群,这样key就是同一个key,有的数据格式适合

知乎技术分享:从单机到2000万QPS并发的Redis高性能缓存实践之路

本文来自知乎官方技术团队的"知乎技术专栏",感谢原作者陈鹏的无私分享. 1.引言 知乎存储平台团队基于开源Redis 组件打造的知乎 Redis 平台,经过不断的研发迭代,目前已经形成了一整套完整自动化运维服务体系,提供很多强大的功能.本文作者陈鹏是该系统的负责人,本次文章深入介绍了该系统的方方面面,值得互联网后端程序员仔细研究. (本文同步发布于:http://www.52im.net/thread-1968-1-1.html) 2.关于作者 陈鹏:现任知乎存储平台组 Redis 平

Redis 分布式缓存 Java 框架

为什么要在 Java 分布式应用程序中使用缓存? 在提高应用程序速度和性能上,每一毫秒都很重要.根据谷歌的一项研究,假如一个网站在3秒钟或更短时间内没有加载成功,会有 53% 的手机用户会离开. 缓存是让分布式应用程序加速的重要技术之一.存储的信息越接近 CPU,访问速度就越快.从 CPU 缓存中加载数据比从 RAM 中加载要快得多,比从硬盘或网络上加载要快得多得多. 要存储经常访问的数据,分布式应用程序需要在多台机器中维护缓存.分布式缓存是降低分布式应用程序延迟.提高并发性和可伸缩性的一种重要

Spring Boot 整合Redis 实现缓存

本文提纲 一.缓存的应用场景 二.更新缓存的策略 三.运行 springboot-mybatis-redis 工程案例 四.springboot-mybatis-redis 工程代码配置详解 运行环境: Mac OS 10.12.x JDK 8 + Redis 3.2.8 Spring Boot 1.5.1.RELEASE 一.缓存的应用场景 什么是缓存? 在互联网场景下,尤其 2C 端大流量场景下,需要将一些经常展现和不会频繁变更的数据,存放在存取速率更快的地方.缓存就是一个存储器,在技术选型

Mybatis源码分析自定义缓存、分页的实现

一.缓存 我们知道,在Mybatis中是有缓存实现的.分一级缓存和二级缓存,不过一级缓存其实没啥用.因为我们知道它是基于sqlSession的,而sqlSession在每一次的方法执行时都会被新创建.二级缓存是基于namespace,离开了它也是不行.有没有一种方式来提供自定义的缓存机制呢? 1.Executor Executor是Mybatis中的执行器.所有的查询就是调用它的<E> List<E> query()方法.我们就可以在这里进行拦截,不让它执行后面的查询动作, 直接从

Redis之缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级

Redis之缓存雪崩.缓存穿透.缓存预热.缓存更新.缓存降级 1.缓存雪崩 发生场景:当Redis服务器重启或者大量缓存在同一时期失效时,此时大量的流量会全部冲击到数据库上面,数据库有可能会因为承受不住而宕机 解决办法: 1)随机均匀设置失效时间 2)设置过期标志更新缓存 3)并发量不是特别多的时候,使用最多的解决方案是加锁排队 2.缓存穿透 发生场景:是指查询一个数据库一定不存在的数据.正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并

SpringBoot项目+Shiro(权限框架)+Redis(缓存)集成

项目是SpringCloud框架,分布式项目,包括Eureka.Zuul.Config.User-Svr(用户管理的服务,既是服务端也是客户端): SpringCloud框架的SpringBoot 的项目搭建就不再赘述,这里重点介绍如何引入集成 Shiro 框架: Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码学和会话管理.使用Shiro的易于理解的API,您可以快速.轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序. 一.数据库设计