asp.net 中是有缓存的实现:HttpContext.Cache,缓存的数据是放到 Web 服务器的进程 内存里。
在控制台、WinForm、子线程、SignalR 等不支持 HttpContext 的地方还可以使用 MemoryCache.Default(System.Runtime.Caching 这个程序集中) ,HttpContext.Cache 其实就是 对 MemoryCache 的封装。
//写入:
MemoryCache.Default.Add("age", 666, DateTimeOffset.Now.AddMinutes(1));
//读取:
if(MemoryCache.Default.Contains("name"))
{
int age = (int)MemoryCache.Default["age"];
}
进程内缓存最大的优点就是效率高。在可预期数据量不大的情况下推荐使用。 如果数据量比较大或者集群服务器比较多,就要用单独的分布式缓存了,也就是搞一台 或者多台专门服务器保存缓存数据,所有服务器都访问分布式缓存服务器。
Memcached 是一个专门用来做缓存的服务器,而且缓存的数据都在内存中。Memcached 就相当于一个 Dictionary 键值对集合,保存的是键值对,然后根据 key 取 value。 当然 web 服务器和 Memcached 之间还是要网络间通讯,效率还是没有进程内缓存效率 高。Memcached 程序重启之后数据就会消失。
memcached.exe -d install
memcached.exe -d uninstall
Memcached 的.Net 开发包:Install-Package EnyimMemcached
没特殊要求一般用 Set 就可以了。
MemcachedClientConfiguration mcConfig = new MemcachedClientConfiguration(); mcConfig.AddServer("127.0.0.1:11211");
//必须指定端口
using (MemcachedClient client = new MemcachedClient(mcConfig))
{
client.Store(Enyim.Caching.Memcached.StoreMode.Set, "name", "rsfy");
}
如果保存普通类对象,则对象必须可序列化(不同 Memcached 客户端保存对象的机制 都不尽相同)。
2)存入设置过期时间 设置最后一个 TimeSpan 类型的参数:
client.Store(Enyim.Caching.Memcached.StoreMode.Set, "name", "yzk",TimeSpan.FromSeconds(5));
如果之前对于同一个 Key 设置过一个过期时间,之后又设置过一个,以最后一次的为准。
3)读取:如果找不到,则返回 null。
client.Get("name");
当然也可以用
public bool TryGet(string key, out object value)
当然还支持泛型的
public T Get<T>(string key)
5)Key 的选择: Memcaced就相当于一个大键值对,不同系统放到Memcached中的数据都是不隔离的, 因此设定 Key 的时候要选择好 Key,这样就不容易冲突。建议规则“系统名字_模块名字_业务_Key”,比如“Shop_Admin_FilterWords”
6) Increment、Decrement 是用来对计数器进行增减的,不过用得少。用 Redis 更合适。
用来解决并发问题:读出一个值,做一些判断或者处理,再写回,有可能有并发的问题。 Cas 是 Memcached 1.2.5 之后引入的特性,类似于数据库的“乐观锁”,查询的时候查出一个 cas 值,在写入的时候带着这个 cas 值,如果发现 cas 值已经变了,则说明已经有别人改过了。 下面的程序:
var cas = client.GetWithCas("Name");
Console.WriteLine("按任意键继续");
Console.ReadKey();
var res = client.Cas(Enyim.Caching.Memcached.StoreMode.Set, "Name", cas.Result + "1", cas.Cas);
if(res.Result) {
Console.WriteLine("修改成功");
} else {
Console.WriteLine("被别人改了");
}
启动两个实例,测试效果。 Memcached 一般就是做缓存用,因此也不要用这个 Cas。
memcached 重启之后短时间内大量的请求会涌入数据库,给数据库造成压力,解决这 个的方法就是使用集群,有多台 Memcached 服务器提供服务。 当 memcached 服务器压力大了之后也有必要搞 memcached 集群来分担压力。 Memcached 服务器的“雪崩”问题:如果所有缓存设置过期时间一样,那么每隔一段 时间就会造成一次数据库访问的高峰:
**解决的方法就是缓存时间设置不一样,比如加上一个随机数。 **
Memcached 的集群实现很简单,集群节点直接不进行通讯、同步,只要在多个服务器 上启动多个 Memcached 服务器即可,客户端决定把数据写入不同的实例,不搞主从复制, 每个数据库实例保存一部分内容。 然后 mcConfig.AddServer("127.0.0.1:11211");添加多个服务器 ip 地址,然后客户端根据 自己的算法决定把数据写入哪个 Memcached 实例,取数据库的时候再根据同样的定位算法 去哪台服务器上去取。 节点定位算法有很多种,最常用的有两种 Ketama、VBucket。Ketama 是根据 Key 算出一 个 hash 值,根据 hash 值再算到服务器;而 VBucket 也是根据 key 算出 hash 值,但是不是直 接根据 hash 值算出服务地址,而是维护一个 VBucket 表,在表中指定不同的 hash 值由不同 的服务器处理,还可以临时改变指向。建议用 Ketama 就可以了。节点定位算法会自动处理 故障服务器。
mcConfig.NodeLocatorFactory = new KetamaNodeLocatorFactory()。
缓存要求都 不高。
public static class MemcachedHelper
{
public static readonly MemcachedHelperClientConfiguration mcConfig = new MemcachedClientConfiguration();
public static readonly MemcachedClient client = null;
static MemcachedHelper()
{
mcConfig.AddServer("127.0.0.1:11211");
client = new MemcachedClient(mcConfig);
}
public static T GetOrSet<T>(string key, object value) where T : class
{
var getdata = Get<T>(key);
if (getdata != null)
{
return getdata;
}
else
{
Set(key, value);
return Get<T>(key);
}
}
public static void Set(string key, object value)
{
client.Store(Enyim.Caching.Memcached.StoreMode.Set, key, JsonConvert.SerializeObject(value));
}
public static T Get<T>(string key) where T : class
{
try
{
return JsonConvert.DeserializeObject<T>(client.Get(key).ToString());
}
catch (Exception e)
{
return null;
}
}
我试过重新启动apache,缓存的页面仍然出现,所以一定有一个文件夹在某个地方。我没有“公共(public)/缓存”,那么我还应该查看哪些其他地方?是否有一个URL标志也可以触发此效果? 最佳答案 您需要触摸一个文件才能清除phusion,例如:touch/webapps/mycook/tmp/restart.txt参见docs 关于ruby-如何在Ubuntu中清除RubyPhusionPassenger的缓存?,我们在StackOverflow上找到一个类似的问题:
尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot
当我尝试进行bundle安装时,我的gem_path和gem_home指向/usr/local/rvm/gems/我没有写入权限,并且由于权限无效而失败。因此,我已将两个路径都更改为我具有写入权限的本地目录。这样做时,我进行了bundle安装,我得到:bruno@test6:~$bundleinstallFetchinggemmetadatafromhttps://rubygems.org/.........Fetchinggemmetadatafromhttps://rubygems.org/..Bundler::GemspecError:Couldnotreadgemat/afs/
我一直在Heroku上尝试不同的缓存策略,并添加了他们的memcached附加组件,目的是为我的应用程序添加Action缓存。但是,当我在我当前的应用程序上查看Rails.cache.stats时(安装了memcached并使用dalligem),在执行应该缓存的操作后,我得到current和total_items为0。在Controller的顶部,我想缓存我有的Action:caches_action:show此外,我修改了我的环境配置(对于在Heroku上运行的配置)config.cache_store=:dalli_store我是否可以查看其他一些统计数据,看看它是否有效或我做错
我有一个具有页面缓存的ControllerAction,我制作了一个清扫程序,它使用Controller和指定的Action调用expire_page...Controller操作呈现一个js.erb模板,所以我试图确保expire_page删除public/javascripts中的.js文件,但它没有这样做。classJavascriptsController"javascripts",:action=>"lol",:format=>'js')endend...所以,我访问javascripts/lol.js并呈现我的模板。我验证了public/javascripts/lol.js
我的Controller有这个:caches_action:render_ticker_for_channel,:expires_in=>30.seconds在我的路由文件中我有这个:match'/render_c_t/:channel_id'=>'render#render_ticker_for_channel',:as=>:render_channel_ticker在日志文件中我看到了这个:Writefragmentviews/mcr3.dev/render_c_t/63(11.6ms)我如何手动使它过期?我需要从与渲染Controller不同的Controller使它过期,但即使
我在开发和生产中都使用docker,真正困扰我的一件事是docker缓存的简单性。我的ruby应用程序需要bundleinstall来安装依赖项,因此我从以下Dockerfile开始:添加GemfileGemfile添加Gemfile.lockGemfile.lock运行bundleinstall--path/root/bundle所有依赖项都被缓存,并且在我添加新gem之前效果很好。即使我添加的gem只有0.5MB,从头开始安装所有应用程序gem仍然需要10-15分钟。由于依赖项文件夹的大小(大约300MB),然后再花10分钟来部署它。我在node_modules和npm上遇到了
我正在使用Capybara2.1和Ruby1.9.3,使用selenium驱动程序(带有Minitest和测试单元)来测试网络应用程序。我正在努力解决StaleElementReferenceException问题。我已经看到很多关于该主题的讨论,但我无法找到解决我所面临问题的方法。所以基本上,我试图使用以下代码在我的页面上找到所有分页元素:pagination_elements=page.all('.paginationa')然后我对这些元素做一些断言,例如:pagination_elements.first.must_have_content('1')在这些断言之后,我通过单击下一
HTTP缓存是指浏览器或者代理服务器将已经请求过的资源保存到本地,以便下次请求时能够直接从缓存中获取资源,从而减少网络请求次数,提高网页的加载速度和用户体验。缓存分为强缓存和协商缓存两种模式。一.强缓存强缓存是指浏览器直接从本地缓存中获取资源,而不需要向web服务器发出网络请求。这是因为浏览器在第一次请求资源时,服务器会在响应头中添加相关缓存的响应头,以表明该资源的缓存策略。常见的强缓存响应头如下所述:Cache-ControlCache-Control响应头是用于控制强制缓存和协商缓存的缓存策略。该响应头中的指令如下:max-age:指定该资源在本地缓存的最长有效时间,以秒为单位。例如:Ca
我正在构建一个Rails应用程序,该应用程序将基本上包含一组SOAP命令。我不想每次都获取WSDL来实现某种缓存方法,尽管我不太确定从哪里开始执行此操作。是否有特定于Rails的东西可以帮助我,或者我应该通过Ruby下载文件并加载它?只是在寻找某种总体方向...... 最佳答案 如果您使用savon然后是remoteWSDLwillbedownloadedonceperclientinstance:the(remote)WSDLhastobedownloadedandparsedonceforeveryclientandsocome