我希望通过代码清除NHibernate中的整个二级缓存.有没有办法做这个独立于正在使用的缓存提供程序?(我们让客户在同一个应用程序中同时使用memcache和syscache).
我们希望清除整个缓存,因为数据库外部可能已发生更改(我们无法保证:哪些表/实体受到影响,因此我们必须假设最坏).
我网站上的数据库负载变得非常高,所以现在是时候缓存常见查询,这些查询每小时调用1000次,结果不会发生变化.例如,在我的城市模型中,我执行以下操作:
def self.fetch(id)
Rails.cache.fetch("city_#{id}") { City.find(id) }
end
def after_save
Rails.cache.delete("city_#{self.id}")
end
def after_destroy
Rails.cache.delete("city_#{self.id}")
end
Run Code Online (Sandbox Code Playgroud)
所以现在,当我第一次点击数据库时,我可以使用City.find(1),但接下来的1000次我从内存中得到结果.大.但是大多数对城市的调用都不是City.find(1),而是@ user.city.name,其中Rails不使用fetch但是再次查询DB ...这有意义但不完全是我想要它做的.
我可以做City.find(@ user.city_id),但这很难看.
所以我向你们提问.聪明人在做什么?这样做的正确方法是什么?
我的Python应用程序当前使用python-memcached API来设置和获取memcached中的对象.此API使用Python的本机pickle模块来序列化和反序列化Python对象.
这个API使得在memcached中存储嵌套的Python列表,字典和元组变得简单快捷,将这些对象读回应用程序是完全透明的 - 它只是起作用.
但我不想仅限于使用Python,如果所有的memcached对象都是用pickle序列化的,那么用其他语言编写的客户端将无法工作.
以下是我考虑过的跨平台序列化选项:
考虑到这个应用程序的优先级,memcached的理想对象序列化方法是什么?
python serialization memcached xml-serialization protocol-buffers
我有Memcache问题,我想知道什么是了解我创建的对象有多大的最佳方法.
我唯一的解决方案是将它们放入Memcache中,以字节显示它们的大小(顺便说一下,我可以自定义Memcache的输出吗?我想要可读的千字节......).
谢谢,
凯文
我试图了解Django如何为我的观点设置密钥.我想知道是否有办法从Memcached获取所有保存的密钥.类似于某种cache.all()东西.我一直试图找到密钥,cache.has_key('test')但仍然无法弄清楚如何命名视图键.
更新:我需要这个的原因是因为我需要手动删除部分缓存但不知道Django为我的cache_view键设置的键值
设置简单:
我有以下twemproxy配置:
default:
auto_eject_hosts: true
distribution: ketama
hash: fnv1a_64
listen: 0.0.0.0:22122
server_failure_limit: 1
server_retry_timeout: 600000 # 600sec, 10m
timeout: 100
servers:
- vcache-1:11211:1
- vcache-2:11211:1
Run Code Online (Sandbox Code Playgroud)
twemproxy节点可以解析所有主机名.作为测试的一部分,我取消了vcache-2.理论上,每次尝试与vcache:22122接口时,twemproxy都会联系池中的服务器以方便尝试.但是,如果其中一个缓存节点关闭,那么twemproxy应该从池中"自动弹出"它,因此后续请求不会失败.
由应用程序层决定是否使用vcache:22122尝试失败的接口是由于基础结构问题,如果是,请再试一次.但是我发现在重试时,正在使用相同的故障服务器,因此不会将后续尝试传递给已知良好的缓存节点(在本例中为vcache-1),而是将它们传递给弹出的缓存节点(vcache) -2).
这是尝试重试的php代码片段:
....
// $this is a Memcached object with vcache:22122 in the server list
$retryCount = 0;
do {
$status = $this->set($key, $value, $expiry);
if (Memcached::RES_SUCCESS === $this->getResultCode()) {
return true;
}
} while (++$retryCount < 3);
return false;
Run Code Online (Sandbox Code Playgroud)
- 更新 -
链接到Github上打开的问题以获取更多信息:问题#427
我正在使用Memcached作为我的django应用程序的后端.此代码在正常的django查询中工作正常:
def get_myobj():
cache_key = 'mykey'
result = cache.get(cache_key, None)
if not result:
result = Product.objects.all().filter(draft=False)
cache.set(cache_key, result)
return result
Run Code Online (Sandbox Code Playgroud)
但是当与django-rest-framework api调用一起使用时它不起作用:
class ProductListAPIView(generics.ListAPIView):
def get_queryset(self):
product_list = Product.objects.all()
return product_list
serializer_class = ProductSerializer
Run Code Online (Sandbox Code Playgroud)
我即将尝试提供缓存功能的DRF扩展:
https://github.com/chibisov/drf-extensions
但是github上的构建状态目前正在说"构建失败".
我的应用程序在api调用时非常重读.有没有办法缓存这些电话?
谢谢.
我memcached用来存储复杂计算的整数结果.我有几百个可以缓存的整数对象!我应该将它们缓存在更复杂的对象中的单个键下,还是应该为对象使用数百个不同的键?(我正在缓存的对象不需要每天多次失效)
我试图在我们的环境中理解(并可能部署)memcached.
我们在loadbalancer上有4个web服务器,运行用PHP开发的大型Web应用程序.我们已经在使用APC了.我想看看memcached是如何工作的?至少,可能是我不明白缓存是如何工作的.
我们有一些复杂的动态查询,它们组合了几个表来提取数据.每次,数据都来自不同的客户端数据库,数据不断变化.根据我的理解,如果某些数据存储在缓存中,并且下次请求相同,则返回相同的数据.(或者我在这里可能完全错了).
整个memcache(或者就此而言,任何缓存的东西都有效)如何?
我正在考虑在前面创建缓存层的最佳方法,或者作为对我的RESTful API(用Ruby编写)的GET请求的第一层.
并非每个请求都可以缓存,因为即使对于某些GET请求,API也必须验证请求的用户/应用程序.这意味着我需要配置哪个请求是可缓存的以及每个缓存的答案有效多长时间.对于少数情况,我需要非常短的到期时间,例如15秒及以下.即使尚未达到过期日期,我也应该能够让API应用程序使缓存条目到期.
我已经考虑了许多可能的解决方案,我的两个最佳想法:
API的第一层(甚至在路由之前),我自己的缓存逻辑(手中有所有配置选项),答案和存储到Memcached的到期日期
一个网络服务器代理(高可配置),也许像Squid之类的东西,但我从来没有使用代理这样的情况,我绝对不确定它
我还考虑过像Varnish这样的缓存解决方案,我将Varnish用于"通常"的Web应用程序,它令人印象深刻,但配置有点特别.但如果它是最快的解决方案,我会使用它.
另一个想法是缓存到Solr索引,我已经在数据层中使用它来查询数据库以查找大多数请求.
如果某人有关于此主题的提示或良好来源,请告诉我.