memcached是一个高性能的分布式内存对象缓存系统,用于动态web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库次数,从而提高动态、数据库驱动网站的速度。memcached基于一个存储键值对的hashmap。其守护进程是用c写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。

memcached的安装:

服务器端主要是安装memcached服务器端。

官网:http://memcached.org  下载:wget http://memcached.org/libevent-1.4.36.tar.gz

首先安装libevent:

  1、wget https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent-2.1.8-stable.tar.gz  下载libevent

  2、安装步骤:./configuer --prefix=/usr  && make  && make install

  3、测试libevent是否安装成功:ls  -al /usr/lib | grep libevent

接下来就可以安装memcached了:

  解压后进入目录:./configure --with-libevent=/usr && make && make install

如果中间出现报错,仔细检查错误信息,按照错误信息来配置或者增加相应的库或路径。安装完成后会把memcached放到/usr/local/bin/memcached

  启动memcached服务:/usr/local/bin/memcached -d -m 10 -u root -l 192.168.141.64 -p 12000 -c 256 -P /tmp/memcached.pid  

-d选项是启动一个守护进程,
-m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB,
-u是运行Memcache的用户,我这里是root,
-l是监听的服务器IP地址,如果有多个地址的话,我这里指定了服务器的IP地址192.168.0.200,
-p是设置Memcache监听的端口,我这里设置了12000,最好是1024以上的端口,
-c选项是最大运行的并发连接数,默认是1024,我这里设置了256,按照你服务器的负载量来设定,
-P是设置保存Memcache的pid文件,我这里是保存在 /tmp/memcached.pid,

  结束memcached进程:kill 'cat /tmp/memcached.pid'

memcached的命令: 

存储命令:set/add/replace/append/cas
获取命令:get/gets
其他命令:delete/stats等

python操作memcached:

安装API:Python操作memcached使用Python-memcached模块

下载安装:https://pypi.python.org/pypi/python-memcached

windows下:首先python -m -pip install -U pip setuptools

linux下:首先pip install -U pip setuptools

然后:pip install python-memcached即可完成。

1、简单操作:

import memcache

mc = memcache.Client(['192.168.254.129:9001'], debug=True)
mc.set('foo', 'bar')
ret = mc.get('foo')
print(ret)
#debug为True表示运行出现错误时,显示错误信息,上线后移除该信息。

简单操作

2、天生支持集群:

python-memcached模块原生支持集群操作,其原理是在内存维护一个主机列表,且集群中主机的权重值和主机在列表中重复出现的次数成正比。

 主机    权重

    1.1.1.1   1

    1.1.1.2   2

    1.1.1.3   1

那么在内存中主机列表为:

    host_list = ["1.1.1.1", "1.1.1.2", "1.1.1.2", "1.1.1.3", ]

集群分布

如果用户在内存中创建一个键值对(如:k1='k1'),那么要执行以下步骤:

  1、根据算法将k1转换成一个数字

  2、将数字和主机列表长度求余数,得到一个值N(0<N<列表长度)

  3、在主机列表中根据N的值为索引获取主机

  4、连接主机,将k1=‘k1’放置在该主机的内存中

mc = memcache.Client([('1.1.1.1:12000', 1), ('1.1.1.2:12000', 2), ('1.1.1.3:12000', 1)], debug=True)

mc.set('k1', 'v1')

代码实现

3、add  添加一条键值对,如果已经存在key,抛出异常,但代码依然往下执行。

import memcache

mc = memcache.Client(['192.168.254.129:9001'], debug=True)
mc.set('foo', 'bar')
mc.add('foo', 'ba') #报错,对已经存在的key重复添加,失败。
ret = mc.get('foo')
print(ret)

add

4、replace   修改某个key的值,如果key不存在,则抛出异常

import memcache

mc = memcache.Client(['192.168.254.129:9001'], debug=True)
mc.set('foo', 'bar')
mc.replace('bar', '') #不存在键‘bar’,抛出异常,但代码继续往下执行
ret = mc.get('bar')
print(ret)

replace

5、set和set_multi与delete和delete_multi以及get和get_multi

      set为设置一个键值对,如果key存在则修改,不存在则创建

       set_multi为设置多个键值对,如果key不存在,则创建,存在则修改。

       delete为在memcached中删除指定的键值对

       delete_multi为在memcached中删除多个指定的键值对。

       get 为获取指定的键的值,只返回值,不存在则返回None。

       get_multi 为获取多个键的值,返回字典。

import memcache
mc = memcache.Client([('192.168.254.129:9001', 1)], debug=True)
mc.set('key1', 'cable')
mc.set_multi({'key1': 'cabel', 'key2': 'tangseng'})
res = mc.get('foo')
print(res)
ret = mc.get_multi(['key1', 'key2'])
print(ret)
mc.delete('foo')
mc.delete_multi(['key1', 'key2'])
print(mc.get('foo'))

用法

6、append和prepend

  append为修改指定key的值,在该值后面追加内容,不存在键则抛出异常

  prepend为修改指定key的值,在该值前面插入内容,不存在则抛出异常

import memcache
mc = memcache.Client([('192.168.254.129:9001', 1)], debug=True)
mc.set('key1', 'cable')
mc.set_multi({'key1': 'cabel', 'key2': 'tangseng'})
mc.append('key1', 'cai')
mc.prepend('key2', 'chi')
print(mc.get_multi(['key1', 'key2']))

append与prepend

那么,输出的结果为:{'key1': 'cabelcai', 'key2': 'chitangseng'}

7、decr 和 incr

  decr 自减,将memcached中的某个值减少N(N默认为1)

  incr 自增,将memcached中的某个值增加N(N默认为1)

  注意:在自增或自减时,如果key的值不是数字,则报错,并且代码不向下执行。

import memcache
mc = memcache.Client([('192.168.254.129:9001', 1)], debug=True)
mc.set_multi({'k1': '', 'k2': 999, 'k3': 'test'})
mc.incr('k1', delta=2)
mc.decr('k2')
ret = mc.get_multi(['k1', 'k2', 'k3'])
print(ret)

自增和自减

8、gets和cas  为原子型事件操作:

import memcache
mc = memcache.Client([('192.168.254.129:9001', 1)], debug=True)
mc.set_multi({'k1': '', 'k2': 999, 'k3': 'test'})
v = mc.gets('k1')
print(v)
# 如果有人在gets之后和cas之前修改了k1,那么,下面的设置将会执行失败
mc.cas('k1', '')
print(mc.get('k1'))

原子型事件

PS:本质上每次执行gets时,会从memcached中获取一个自增数字,通过cas去修改gets的值时,会携带之前获取的自增值和memcached中的自增值进行比较,如果相等,则可以提交,如果不相等,那么表示执行期间,有其他人执行过操作,则不允许本次修改,该值依然为原始值,即在gets之前的值,其他人即使修改了,也无效。

最新文章

  1. jQuery插件开发代码
  2. 新手指南: Linux 新手应该知道的 26 个命令
  3. Sql server之sql注入篇
  4. thusc滚粗记
  5. HDU 5234 DP背包
  6. HTML 5 应用程序缓存
  7. mina学习(一)
  8. HTTP学习笔记4-请求与响应结构例子
  9. 服务器上开启远程sqlserver小细节
  10. 使用LINQ的几个小技巧
  11. 使用BackgroundWorker组件进行异步操作编程
  12. Python自然语言处理学习笔记之性别识别
  13. 单源最短路径问题-Dijkstra算法
  14. Golang访问Redis初体验
  15. JDK1.7中HashMap底层实现原理
  16. 基于ArcGISServer进行分页矢量查询的方案进阶
  17. promise和setTimeout执行顺序的问题
  18. 【PAT】反转链表
  19. jQuery中event.target和this的区别
  20. VS2017用正则表达式替换多行代码

热门文章

  1. 把IP字符串转换为IPv4标准格式
  2. Redis 【Hash】 一句话说明
  3. RocketMQ的一些特性
  4. WPF 用户控件嵌入网页
  5. 【转】Windows 平台下 Go 语言的安装和环境变量设置
  6. word转html实现预览(asp.net)
  7. 您必须先调用“WebSecurity.InitializeDatabaseConnection”方法,然后再调用&quot;WebSecurity&quot;类的任何其他方法。
  8. php index.php修改之后未生效
  9. 鸟哥linux私房菜学习笔记 第二章知识点
  10. jQuery自适应-3D旋转轮播图