开箱即用 - Memcache缓存

2024-06-03 11:32
文章标签 缓存 开箱 即用 memcache

本文主要是介绍开箱即用 - Memcache缓存,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

废话少说,先上代码C# memcache Demo

memcache 是服务器缓存系统,以键值对方式保存数据到内存中,把对象序列化后,理论上可支持所有的数据类型。

使用情景:怎么用都可以,注意的是它只把数据保存到内存中,重启memcache 服务后丢失,如果要持久化,须要额外程序处理。

一般在web系统中用memcache 缓存常用的数据来缓解数据库查询压力和提高系统性能。它相当于数据库和程序间的中间件。

memcache 早就如雷贯耳,想要用到系统中往往无从下手,下面就花一分钟时间把memcache 用起来;

快速入门(quick start)

服务器端配置
就一个exe ,下载后用命令安装即可,下载memcached

以管理员身份方式运行cmd 命令提示符; cd 到下载memcached.exe 所在的路径; 输入下面的安装命令,即可把 memcache 安装到windows 服务;

打开windows服务,找到memcached server 服务,运行即可启动 memcached 服务,默认端口11211, 就用这端口,不用改;

memcached.exe -d install
命令安装

开箱即用 - Memcache缓存

安装后的服务

开箱即用 - Memcache缓存

客户端使用

NuGet安装EnyimMemcached

开箱即用 - Memcache缓存

xml配置

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!-- memcached 配置开始 --><configSections>
<sectionGroup name="enyim.com"><section name="memcached" type="Enyim.Caching.Configuration.MemcachedClientSection, Enyim.Caching" />
</sectionGroup></configSections><enyim.com>
<memcached><servers><add address="127.0.0.1" port="11211" /></servers><transcoder type="ProtoBuf.Caching.Enyim.NetTranscoder, protobuf-net.Enyim" />
</memcached></enyim.com><!-- memcached 配置结束 --><startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /></startup>
</configuration>

看到了吧,上面的 <add address="127.0.0.1" port="11211" />就是memcache 服务器的 ip 和开放接口, 默认就是 11211

开撸代码

class Program{static void Main(string[] args){MemcachedClient client = new MemcachedClient;//-- 新增或更新,存在key, 则覆盖client.ExecuteStore(StoreMode.Set, "test-set-key1", "whatever set 1");//-- 新增或更新,存在key, 则覆盖: 指定有效期 1 小时client.ExecuteStore(StoreMode.Set, "test-set-key2", "whatever set 2", DateTime.Now.AddHours(1));//-- 新增, 存在该key, 则不覆盖client.ExecuteStore(StoreMode.Add, "test-add-key1", "whatever add 1");//-- 更新, 不存在该key, 则不做更新client.ExecuteStore(StoreMode.Replace, "test-replace-key1", "whatever replace key1");//-- 取值client.Get<string>("test-set-key1"); // whatever set 1client.Get<string>("test-add-key1"); // whatever add 1//-- 缓存对象: 对象必须可序列化Foo foo = new Foo { Id = 1, Name = "foo1" };client.ExecuteStore(StoreMode.Set, "obj1", foo, DateTime.Now.AddHours(1));//取值var cacheFoo = client.Get<Foo>("obj1");}}[Serializable]public class Foo{public int Id { get; set; }public string Name { get; set; }}

就这么简单

下面深入点点

配合数据库做缓存的处理流程

为了缓存数据是最新的,必须要处理与数据库同步,有两种方式:

  • 同时更新数据库和缓存;
  • 只更新数据库,根据key, 把缓存移除或设为null,按上面的处理流程,下次拿到null, 就从数据库取最新的数据并缓存;

如何维护key是非常关键的工作;

请求 WebApi, 返回对象带有 k__BackingField

不能用Serializable 修饰类,但缓存对象必须可序列化,可改用 protobuf-net 的 DataContract 修饰类, DataMember 修饰属性; 虽然比较麻烦,但性能比.net 自带的 Serializable 要好;

用了 protobuf-net 序列化对象后,有时 memcache 的 fGet<T>范型方法莫名抛出异常,这是 protobuf-net 的bug, 最简便的方法是加try catch , 也可拿它源码改;

这篇关于开箱即用 - Memcache缓存的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1026861

相关文章

缓存雪崩问题

缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。 解决方案: 1、使用锁进行控制 2、对同一类型信息的key设置不同的过期时间 3、缓存预热 1. 什么是缓存雪崩 缓存雪崩是指在短时间内,大量缓存数据同时失效,导致所有请求直接涌向数据库,瞬间增加数据库的负载压力,可能导致数据库性能下降甚至崩溃。这种情况往往发生在缓存中大量 k

Redis中使用布隆过滤器解决缓存穿透问题

一、缓存穿透(失效)问题 缓存穿透是指查询一个一定不存在的数据,由于缓存中没有命中,会去数据库中查询,而数据库中也没有该数据,并且每次查询都不会命中缓存,从而每次请求都直接打到了数据库上,这会给数据库带来巨大压力。 二、布隆过滤器原理 布隆过滤器(Bloom Filter)是一种空间效率很高的随机数据结构,它利用多个不同的哈希函数将一个元素映射到一个位数组中的多个位置,并将这些位置的值置

防止缓存击穿、缓存穿透和缓存雪崩

使用Redis缓存防止缓存击穿、缓存穿透和缓存雪崩 在高并发系统中,缓存击穿、缓存穿透和缓存雪崩是三种常见的缓存问题。本文将介绍如何使用Redis、分布式锁和布隆过滤器有效解决这些问题,并且会通过Java代码详细说明实现的思路和原因。 1. 背景 缓存穿透:指的是大量请求缓存中不存在且数据库中也不存在的数据,导致大量请求直接打到数据库上,形成数据库压力。 缓存击穿:指的是某个热点数据在

PHP APC缓存函数使用教程

APC,全称是Alternative PHP Cache,官方翻译叫”可选PHP缓存”。它为我们提供了缓存和优化PHP的中间代码的框架。 APC的缓存分两部分:系统缓存和用户数据缓存。(Linux APC扩展安装) 系统缓存 它是指APC把PHP文件源码的编译结果缓存起来,然后在每次调用时先对比时间标记。如果未过期,则使用缓存的中间代码运行。默认缓存 3600s(一小时)。但是这样仍会浪费大量C

缓存策略使用总结

缓存是提高系统性能的最简单方法之一。相对而言,数据库(or NoSQL数据库)的速度比较慢,而速度却又是致胜的关键。 如果使用得当,缓存可以减少相应时间、减少数据库负载以及节省成本。本文罗列了几种缓存策略,选择正确的一种会有很大的不同。缓存策略取决于数据和数据访问模式。换句话说,数据是如何写和读的。例如: 系统是写多读少的吗?(例如基于时间的日志)数据是否是只写入一次并被读取多次?(例如用户配

uniapp小程序下载缓存服务器上的图片

1. 使用uni.downloadFile,但是注意下载图片的地址里的域名,需要在微信公众平台里面的downloadFile合法域名进行配置。 export default function downloadAndCacheImage(imageUrl, name) {return new Promise((resolve, reject) => {console.log("imageUrl",

基于canal的Redis缓存双写

canal地址:alibaba/canal: 阿里巴巴 MySQL binlog 增量订阅&消费组件 (github.com)https://github.com/alibaba/canal 1. 准备 1.1 MySQL 查看主机二进制日志 show master status 查看binlog是否开启 show variables like 'log_bin' 授权

插件:清理maven错误缓存.bat

插件:https://pan.baidu.com/s/1nHIxHoo1C4MvFlW7QbZe5Q?pwd=7zenhttps://pan.baidu.com/s/1nHIxHoo1C4MvFlW7QbZe5Q?pwd=7zen没错误缓存时: 有错误缓存时:

Android/Linux 磁盘写入缓存/等待时间 参数修改

Linux系统当进行文件写操作时,并不会将数据立马写入磁盘,而是写写到缓存,等待达到占用内存一定比例或超过一定时间才会批量将这些缓存数据写入磁盘,这样可以减少IO操作,提升性能和磁盘寿命。如果数据还没来得及写入磁盘发生硬件掉电,这些数据就会丢失。应用可以调用sync实时将内容写入磁盘避免丢失。排查丢失问题可以在断电前执行sync命令,看能不能复现,若无法复现,说明就是缓存没有及时写入磁盘导致。

缓存的常见问题 以及解决博客文章

1.jedispool 连 redis 高并发卡死  (子非鱼yy) https://blog.csdn.net/ztx114/article/details/78291734 2. Redis安装及主从配置 https://blog.csdn.net/ztx114/article/details/78320193 3.Spring中使用RedisTemplate操作Redis(sprin