Memcached 缓存个体,对象,泛型,表

最近,为提高数据查询速度,想做点缓存,通过网上了解,觉得,最好使用的就是Memcached;下面简单给大家介绍下Memcached;

 

 下面是两位大牛关于Memcached的介绍;大家可以看看

 

http://zhoufoxcn.blog.51cto.com/792419/528212

 

http://leepiao.blog.163.com/blog/static/48503130201104103344851/

 如下是我的总结:

Memcached是一个命令行窗口程序,可以在命令行窗口中启动也可以封装在系统服务中启动。在启动Memcached时需要提供一些必须的参数,指定Memcached运行时监听的端口和最大使用的内存大小等。如果缓存的数据大小超过指定内存,那么Memcached就会按照LRU(Least Recently Used)算法自动“删除”不使用的缓存(标记为失效),新增的缓存数据就可以使用这些标记为失效的数据所占用的内存,这样就不用担心Memcached超出所指定内存的问题。此外,为了提高性能,在缓存数据过期后Memcached并不是从物理内存中删除缓存的数据,仅仅在取出改数据的时候检查它是否已经过了有效期。
目前有多种平台的Memcached版本,比如Linux、FreeBSD、Solaris (memcached 1.2.5以上版本)、Mac OS X及Windows平台,在Windows平台上还有32位和64位版本。
Memcached有一套协议,利用这套协议可以对Memcached进行数据存取和查看Memcached的状态,很多程序语言都依据这套协议来操作Memcached,比如PHP、Java、C、C++及C#等。
获取了对应平台的Memcached版本就可以运行Memcached了。在这里仅以Windows平台上的32位Memcached为例

 

1 把memcached文件夹放在指定路径,我选择了C盘根目录

2 使用管理员身份(切记)在命令行按照memcached;

   memcached.exe -d install

3

在客户端还可以通过telnet来查看和操作Memcached,前提是服务器端和客户端都支持Telnet协议,在Windows7和Windows2008中默认都不支持,需要在控制面板中安装和启用。
首先打开控制面板,然后点击“打开或关闭Windows功能”,如下图所示:
 

 


点击“打开或关闭Windows功能”之后会看到当前系统启用的功能的状态,根据当前机器选择打开Telnet服务器端或者客户端功能,如下图所示:
 

 

 
经过上面的操作之后就可以在客服端远程查看Memcached的状态或者操作Memcached了。下面的命令就是连接到Memcached:
telnet localhost 11121
连接之后会出现一个命令行窗口,在这个命令行窗口中输入"stats"就可以看到当前Memcached的状态,如下就是刚刚启动的Memcached的状态数据:
STAT pid 852
STAT uptime 1399
STAT time 1300979378
STAT version 1.2.5
STAT pointer_size 32
STAT curr_items 0
STAT total_items 0
STAT bytes 0
STAT curr_connections 3
STAT total_connections 5
STAT connection_structures 4
STAT cmd_get 0
STAT cmd_set 0
STAT get_hits 0
STAT get_misses 0
STAT evictions 0
STAT bytes_read 23
STAT bytes_written 415
STAT limit_maxbytes 67108864
STAT threads 1
END
通过这个数据我们就可以了解Memcached的状态了。
这些数据所代表的意义如下:
pid:32u,服务器进程ID。 
uptime:32u, 服务器运行时间,单位秒。 
time :32u, 服务器当前的UNIX时间。
version :string, 服务器的版本号。 
curr_items :32u, 服务器当前存储的内容数量 Current number of items stored by the server 
total_items :32u, 服务器启动以来存储过的内容总数。
bytes :64u, 服务器当前存储内容所占用的字节数。
curr_connections :32u, 连接数量。 
total_connections :32u, 服务器运行以来接受的连接总数。
connection_structures:32u, 服务器分配的连接结构的数量。 
cmd_get :32u, 取回请求总数。 
cmd_set :32u, 存储请求总数。 
get_hits :32u, 请求成功的总次数。
get_misses :32u, 请求失败的总次数。
bytes_read :64u, 服务器从网络读取到的总字节数。
bytes_written :64u, 服务器向网络发送的总字节数。
limit_maxbytes :32u, 服务器在存储时被允许使用的字节总数。
上面的描述中32u和64u表示32位和64位无符号整数,string表示是string类型数据。

 

 

.NET中应用Memcached

 

下面是一个Enyim Memcached的例子:

缓存单体;对象,泛型;表都可以

需要引用dll Memcached.ClientLibrary

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using Memcached.ClientLibrary;

using System.Collections;

namespace WindowsFormsApplication1

{

    public partial class Form1 : Form

    {

 

        public Form1()

        {

            InitializeComponent();

            SockIOPool pool = SockIOPool.GetInstance();

            string[] servers = { "127.0.0.1:11211" };

            pool.SetServers(servers);

            pool.MinConnections = 3;

            pool.MaxConnections = 5;

            pool.InitConnections = 3;

            pool.SocketConnectTimeout = 5000;

            pool.Initialize();

        }

 

        private void button1_Click(object sender, EventArgs e)

        {

 

            MemcachedClient client = new MemcachedClient();

            client.EnableCompression = false;

            client.Set("key1", "单体测试");

            MessageBox.Show("key1:单体测试");

            //Person demo = new Person { UserId = 1, UserName = "李刚" };

            //client.Set("demo", demo);

            //client.Get("demo");

 

            //Console.WriteLine("———————–Memcached Set 设置值————————–");

            //client.Set("key1", "value1");

            //Console.WriteLine(client.Get("key1"));

            //Console.WriteLine("———————–Memcached Add 设置值————————–");

            //client.Add("key2", "value2");

            //Console.WriteLine(client.Get("key2"));

            //client.Set("key2", "value1 value2");

            //Console.WriteLine(client.Get("key2"));

            //Console.WriteLine("———————–Memcached Replace 设置值————————–");

            //client.Replace("key2", "value3");

            //Console.WriteLine(client.Get("key2"));

 

            //Console.WriteLine("———————–Memcached 键值是否存在————————–");

            //if (client.KeyExists("key2"))

            //{

            //    Console.WriteLine("键key2 存在");

            //}

            //if (client.KeyExists("hechen") == false)

            //{

            //    Console.WriteLine("键hechen 不存在");

            //}

 

            //Console.WriteLine("———————–Memcached 删除数据————————–");

            //client.Add("key4", "value4");

            //Console.WriteLine("key4==>" + client.Get("key4"));

            //client.Delete("key4");

            //if (!client.KeyExists("key4"))

            //{

            //    Console.WriteLine("key4 已将删除");

            //}

 

            //Console.WriteLine("———————–Memcached 数据过期————————–");

            //client.Add("key5", "value5", DateTime.Now.AddMilliseconds(5000));

            //Console.WriteLine(client.Get("key5"));

            //System.Threading.Thread.Sleep(6000);

            //Console.WriteLine("过期: " + client.Get("key5"));

        }

 

        private void button2_Click(object sender, EventArgs e)

        {

            MemcachedClient client = new MemcachedClient();

            txt01.Text = client.Get("key1").ToString();

        }

 

        private void button4_Click(object sender, EventArgs e)

        {

            Person person = new Person { UserId = 1, UserName = "李刚" };

            MemcachedClient client = new MemcachedClient();

            client.EnableCompression = false;

            client.Set("key2", person);

            MessageBox.Show("key2:对象PersonUserId = 1, UserName =李刚");

        }

 

        private void button3_Click(object sender, EventArgs e)

        {

            MemcachedClient client = new MemcachedClient();

            object demo = client.Get("key2");

            Person cc = demo as Person;

            txt01.Text = cc.UserId.ToString() + ";" + cc.UserName.ToString();

        }

 

        private void button6_Click(object sender, EventArgs e)

        {

            ArrayList arraylist = new ArrayList();

            arraylist.Add("泛型集合测试1");

            arraylist.Add("泛型集合测试2");

            arraylist.Add("泛型集合测试3");

            MemcachedClient client = new MemcachedClient();

            client.EnableCompression = false;

            client.Set("key3", arraylist);

            MessageBox.Show("key3:泛型集合测试1,泛型集合测试2,泛型集合测试3");

        }

 

        private void button5_Click(object sender, EventArgs e)

        {

            MemcachedClient client = new MemcachedClient();

            object demo = client.Get("key3");

            ArrayList arraylist = demo as ArrayList;

            int count = arraylist.Count;

            txt01.Text = arraylist[0].ToString() + ";" + arraylist[1].ToString() + ";" + arraylist[2].ToString() + ";";

        }

 

        private void button8_Click(object sender, EventArgs e)

        {

            DataTable dt = new DataTable();

            string str = "";

            dt.Columns.Add("id");

            dt.Columns.Add("name");

            DataRow dr = dt.NewRow();

            for (int i = 0; i < 3; i++)

            {

                dr = dt.NewRow();

                dr["id"] = "00" + i.ToString();

                dr["name"] = "姓名" + i.ToString();

                dt.Rows.Add(dr);

                str += dr["id"] + "," + dr["name"] + ";";

            }

 

            MemcachedClient client = new MemcachedClient();

            client.EnableCompression = false;

            client.Set("key4", dt);

            MessageBox.Show("key4:" + str);

 

        }

 

        private void button7_Click(object sender, EventArgs e)

        {

            MemcachedClient client = new MemcachedClient();

            object demo = client.Get("key4");

            DataTable dt = demo as DataTable;

            int count = dt.Rows.Count;

            txt01.Text = dt.Rows[0][0].ToString() + "," + dt.Rows[0][1].ToString() + ";" + dt.Rows[1][0].ToString() + "," + dt.Rows[1][1].ToString() + ";" + dt.Rows[2][0].ToString() + "," + dt.Rows[2][1].ToString() + ";";

        }

 

      

    }

}

 

 

memcache 的限制  

memcache单个缓存值限制为1M(1000000bytes),超过这个限制的时候会出如下错误。

ValueError: Values may not be more than 1000000 bytes in length; received 2000000 bytes

memcache的keys限制为250 bytes,超过这个长度会报错。

ValueError: Keys may not be more than 250 bytes in length, received 14670 bytes

memcache的时间设置没限制,但服务器会自动清理缓存,官方好像说过最长为1个月时间(3600*24*30)。

2.6.Memcache::add
2.5.1.说明
bool Memcache::add ( string $key , mixed $var [, int $flag [, int $expire ]]
) 添加一个要缓存的数据如果作为这个缓存的数据的键在服务器上还不存在的情况下,
2.5.2.参数
key 缓存数据的键 其长度不能超过250个字符
var 值,整型将直接存储,其他类型将被序列化存储 ,其值最大为1M

flag 是否使用 zlib 压缩
,当flag=MEMCACHE_COMPRESSED的时侯,数据很小的时候不会采用zlib压缩,只有数据达到一定大小才对数据进行zlib压缩。(没有具体的测试数据进行压缩的最小值是多少)
expire 过期时间,0 为永不过期,可使用 unix 时间戳格式或距离当前时间的秒数,设为秒数时不能大于 2592000(30
天)
2.5.3.返回值
成功返回 TRUE,失败返回 FALSE,如果这个键已经存在,其他方面memcache:;add()的行为与memcache::set相似
2.5.4.范例
<?
$memcache_obj = memcache_connect("localhost", 11211);
/* procedural API */
memcache_add($memcache_obj, ‘var_key‘, ‘test variable‘, FALSE, 30);
/* OO API */
$memcache_obj-add(‘var_key‘, ‘test variable‘, FALSE, 30);
?>

2.6.Memcache::replace
2.6.1.说明
bool Memcache::replace ( string $key , mixed $var [, int $flag [, int $expire
]] )
替换一个指定 已存在key 的的缓存变量内容
2.6.2.参数
key 缓存数据的键, 其长度不能超过250个字符
var 值,整型将直接存储,其他类型将被序列化存储,其值最大为1M

flag 是否使用 zlib 压缩
,当flag=MEMCACHE_COMPRESSED的时侯,数据很小的时候不会采用zlib压缩,只有数据达到一定大小才对数据进行zlib压缩。(没有具体的测试数据进行压缩的最小值是多少)
expire 过期时间,0 为永不过期,可使用 unix 时间戳格式或距离当前时间的秒数,设为秒数时不能大于 2592000(30
天)
2.6.3.返回值
成功返回 TRUE,失败返回 FALSE。
2.6.4.范例
<?php
$memcache_obj = memcache_connect(‘memcache_host‘, 11211);
/* procedural API */
memcache_replace($memcache_obj, "test_key", "some variable", FALSE, 30);
/* OO API */
$memcache_obj-replace("test_key", "some variable", FALSE, 30);
?>

2.7.Memcache::set
2.7.1.说明
bool Memcache::set ( string $key , mixed $var [, int $flag [, int $expire ]]
) 设置一个指定 key 的缓存变量内容
2.7.2.参数
key 缓存数据的键, 其长度不能超过250个字符
var 值,整型将直接存储,其他类型将被序列化存储,其值最大为1M

flag 是否使用 zlib 压缩
,当flag=MEMCACHE_COMPRESSED的时侯,数据很小的时候不会采用zlib压缩,只有数据达到一定大小才对数据进行zlib压缩。(没有具体的测试数据进行压缩的最小值是多少)
expire 过期时间,0 为永不过期,可使用 unix 时间戳格式或距离当前时间的秒数,设为秒数时不能大于 2592000(30
天)
2.7.3.返回值
成功返回 TRUE,失败返回 FALSE。
2.7.4.范例
<?php
/* procedural API */
/* connect to memcached server */
$memcache_obj = memcache_connect(‘memcache_host‘, 11211);
/*
set value of item with key ‘var_key‘
using 0 as flag value, compression is not used
expire time is 30 second
*/
memcache_set($memcache_obj, ‘var_key‘, ‘some variable‘, 0, 30);
echo memcache_get($memcache_obj, ‘var_key‘);

/* OO API */
$memcache_obj = new Memcache;
/* connect to memcached server */
$memcache_obj-connect(‘memcache_host‘, 11211);
/*
set value of item with key ‘var_key‘, using on-the-fly compression
expire time is 50 seconds
*/
$memcache_obj-set(‘var_key‘, ‘some really big variable‘, MEMCACHE_COMPRESSED, 50);
echo $memcache_obj-get(‘var_key‘);
?>

2.8.Memcache::get
2.8.1.说明
string Memcache::get ( string $key [, int $flags ] )
array Memcache::get ( array $keys [, array $flags ] )
获取某个 key 的变量缓存值
2.8.2.参数
key 缓存值的键

flags 如果是传址某个变量,获取缓存值被set或是add的flag结果将被存于该变量
2.8.3.返回值
返回缓存的指定 key 的变量内容或者是在失败或该变量的值不存在时返回 FALSE
如果传出的key的数组中的key都不存在,返回的结果是一个空数组,反之则返回key与缓存值相关联的关联数组
2.8.4.范例

/* procedural API */
$memcache_obj = memcache_connect(‘memcache_host‘, 11211);
$var = memcache_get($memcache_obj, ‘some_key‘);
/* OO API */
$memcache_obj = new Memcache;
$memcache_obj-connect(‘memcache_host‘, 11211);
$var = $memcache_obj-get(‘some_key‘);
/*
You also can use array of keys as a parameter.
If such item wasn‘t found at the server, the result
array simply will not include such key.
*/
/* procedural API */
$memcache_obj = memcache_connect(‘memcache_host‘, 11211);
$var = memcache_get($memcache_obj, Array(‘some_key‘, ‘another_key‘));
//如果some_key,another_key不存在 $var = array();
//如果some_key,another_key存在     $var = array(‘some_key‘=‘缓存值‘, ‘another_key‘=‘缓存值‘);
/* OO API */
$memcache_obj = new Memcache;
$memcache_obj-connect(‘memcache_host‘, 11211);
$var = $memcache_obj-get(Array(‘some_key‘, ‘second_key‘));
?>


2.9.Memcache::delete
2.9.1.说明
bool Memcache::delete ( string $key [, int $timeout ] )
删除某一个变量的缓存
2.9.2.参数
key     缓存的键 键值不能为null和‘’,当它等于前面两个值的时候php会有警告错误。

timeout 删除这项的时间,如果它等于0,这项将被立刻删除反之如果它等于30秒,那么这项被删除在30秒内
2.9.3.返回值
成功返回 TRUE,失败返回 FALSE。
2.9.4.范例
<?php
/* procedural API */
$memcache_obj = memcache_connect(‘memcache_host‘, 11211);
/* after 10 seconds item will be deleted by the server */
memcache_delete($memcache_obj, ‘key_to_delete‘, 10);
/* OO API */
$memcache_obj = new Memcache;
$memcache_obj-connect(‘memcache_host‘, 11211);
$memcache_obj-delete(‘key_to_delete‘, 10);
?>

 

转载于:https://www.cnblogs.com/panshengqiang/p/3605599.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/300032.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 语言特性

Codeusing System;using System.Collections.Generic;using System.Text;namespace InterfaceShadow{ interface ISomeInterface { void DoSomething(); } class Class1 : ISomeInterface { #region ISomeInterface 成员 public void DoSo…

北方人的快乐。。。| 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅&#xff08;视频来源 最走心的视频&#xff0c;侵权删&#xff09;

游国色天香中国馆有感

游国色天香中国馆有感——代腾飞 2007年9月16日 于成都漫步花丛望楼亭湖上泛舟烟雨行中国山河多绣丽怎叫诗人不生情

微型计算机c560,2010广东省计算机等级考试试题 二级C试题最新考试试题库

1、办公自动化是计算机的一项应用&#xff0c;按计算机应用的分类&#xff0c;它属于( C )A、科学计算 B、实时控制 C、数据处理 D、辅助设计2、计算机最主要的工作特点是( A )A、程序存储与自动控制 B、高速度与高精度C、可靠性与可用性 D、有记忆能力3、一般情况下&#xff0…

如何掌握C#的核心技术

如何掌握C#的核心技术原图来自网络&#xff0c;如有侵权&#xff0c;请联系小编删除。引子前不久看到一个段子&#xff0c;某年宁波交警引进人脸识别技术抓拍行人闯红灯&#xff0c;结果一天下来被发现闯红灯次数最多的是珠海女子董小姐&#xff0c;日闯红灯3000多次。宁波交警…

Zend_Feed 的项目实际应用

author songfengRSS0.9/1.0/2.0 ATOM 全部是内容聚合的应用&#xff0c;优点一是浏览者可以订阅其网站&#xff0c;能收到最新的网站更新内容&#xff0e;二是有利于搜索引擎抓取&#xff0e;个人感觉缺点是会被其它网站当成复制品&#xff0c;批量 抓取网站更新内容&…

mysqldump 的常用参数。

mysqldump 常用参数详解&#xff1a;--databases&#xff1a;备份多个数据库&#xff0c;选项后跟多个库名。备份文件中会包含USE db_name。--events : 备份事件--routines&#xff1a;备份存储过程和函数--ignore-tableTableName :指定不需要备份的表--tables&#xff1a;…

怪咖发明家,乔布斯给了他四亿,他没要,转身靠发明救了10亿人。

全世界只有3.14 %的人关注了青少年数学之旅提到乔布斯&#xff0c;大家会想到什么呢&#xff1f;苹果公司创始人&#xff1f;iPhone手机&#xff1f;iPad?人生赢家&#xff1f;不过大家肯定没有想到乔布斯也有吃瘪的时候&#xff1a;有一次&#xff0c;乔布斯对电动平衡车赛格…

西北纺织工学院97级计算机系学生毕业名单,原西北纺织工学院更名为西安工程大学...

原西北纺织工学院&#xff0c;曾更名为西安工程科技学院&#xff0c;2006年2月更名为西安工程大学。西北纺织工学院位于世界闻名的历史文化古都西安市&#xff0c;是中国纺织总会直属高等院校&#xff0c;也是我国西北和西南地区唯一的一所纺织高等学府&#xff0c;担负着培育纺…

祝贺|合肥.NET俱乐部第二期技术沙龙活动圆满成功

热烈祝贺合肥.NET俱乐部第二期技术沙龙圆满成功&#xff0c;感恩参与活动的每一位小伙伴&#xff01;正是因为有你们才促成了这次聚会的成功。现对此次活动进行简单回顾并附上精彩的活动图片&#xff0c;每一位参与活动者名单&#xff0c;以及此次活动讲师分享的PPT供大家学习下…

几个常用的JS代码.

//函数列表function PostCookie(cookieName) { var expdate new Date(); expdate.setTime(expdate.getTime() 604800000); document.cookiecookieName";expires"expdate.toGMTString()";path /;domain.52z.com"; }//用于产生随机轮转广告 i 随机个…

SQL中合并多行记录的方法总汇

SQL中合并多行记录的方法总汇——前几天还在抱怨&#xff1a;sql只有sum(数值)&#xff0c;不能sum(字符串)——如果不是分组统计&#xff0c;用select values values , value也是可以的——但是如果是分组sum(字符串)&#xff0c;肯定不行了&#xff01;——下面是用函数实…

Python中文编码判别及转换

为什么80%的码农都做不了架构师&#xff1f;>>> 养成使用utf8格式的习惯&#xff0c;但是不能保证所有的代码都是utf8格式&#xff0c;所以这里提供三个函数 getCoding tran2UTF8 tran2GBK &#xff0c;分别是查看编码格式&#xff0c;转换为utf8&#xff0c;gbk格…

计算机二级中制作流程图的视频教程,流程图怎么做?1分钟教会你流程图制作方法...

流程是指在特定情景下用一系列逻辑满足特定用户需求的一种总结&#xff0c;借助流程图不仅可以梳理产品需求背后的逻辑和流程&#xff0c;还可以将新的想法和概念借助流程图这个载体分享出来&#xff0c;让整个项目参与者更好的认知产品设计的思路和逻辑。为了让职场的你更好的…

Source Generators实现简版AutoMapper

问题在业务开发中&#xff0c;我们常常需要将一个对象映射成另一个对象。例如将领域实体(UserEntity)映射成暴露给服务外部使用的数据传输对象(UserDto)。而AutoMapper则是目前主流的解决方案&#xff0c;实现类似如下代码&#xff1a;var configuration new MapperConfigurat…

15岁大学毕业,一生800多篇专著论文,双眼失明却凭一条公式称霸数学界

全世界只有3.14 %的人关注了青少年数学之旅从文明之火初燃的那一刻起数学就与之为伴从万年前“数”的产生到现代科技的迅猛发展数学不仅是窥探宇宙万物的入口也是最高智慧的结晶在漫漫的人类历史长河中各个伟大的数学家犹如布满“数学星空”中的星群他们追求最高的精确最合理的…

SEO | 重新认识一下Meta标签

很多人忽视了HTML标签META的强大功效&#xff0c;一个好的META标签设计可以大大提高你的个人网站被搜索到的可能性&#xff0c;有兴趣吗&#xff0c;谁我来重新认识一下META标签吧&#xff01; META标签是HTML语言HEAD区的一个辅助性标签&#xff0c;它位于HTML文档头部的<H…

不知道为什么IList.Contains()总是返回FALSE

需要override bool Equals(object obj) 转载于:https://www.cnblogs.com/shiningrise/archive/2009/04/16/1436845.html

Java程序员应该知道的10个Eclipse调试技巧

为什么80%的码农都做不了架构师&#xff1f;>>> Eclipse是众多Java程序员实用的开发工具&#xff0c;其中开发技巧也是繁多&#xff0c;但作为优秀的Java程序员&#xff0c;需要掌握最起码的调试技巧。 1 条件断点 2 异常断点 3 监视点 4 评估/检查 5 修改变量值 6…

计算机课程建设 指导思想,计算机基础精品课程建设实施方案(规划).doc

计算机基础精品课程建设实施方案(规划).doc《计算机基础》精品课程建设实施方案(规划)21 世纪人类将进入信息化社会&#xff0c;知识和信息是推动信息社会发展的直接动力。利用计算机进行信息的获取、分析处理、传递交流和开发应用的能力是信息社会的人才必须具备的素养&#x…