Memcached基本操作 --Memcached

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons
一、Memcached概述

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

二、服务端安装Memcached
1、下载安装包

[root@instance-mtfsf05r ~]# wget https://memcached.org/files/memcached-1.5.16.tar.gz

2、解压缩

[root@instance-mtfsf05r ~]# tar -zxvf memcached-1.5.16.tar.gz

3、进入目录

[root@instance-mtfsf05r ~]# cd memcached-1.5.16

4、编译

[root@instance-mtfsf05r memcached-1.5.16]# make && make test

5、安装

[root@instance-mtfsf05r memcached-1.5.16]# make install

6、运行Memcached服务端

[root@instance-mtfsf05r memcached-1.5.16]# memcached -d -m 10 -u root -l 10.211.55.4 -p 12000 -c 256 -P /tmp/memcached.pid

三、客户端连接Memcached服务端
1、Python安装python-memcached模块

pip3 install python-memcached

2、python-memcached模块集群操作
import memcache

# 支持集群,将数据写在不同的机器
mc = memcache.Client(['106.12.115.136:'], debug=True)
# 可以设置权重
# mc = memcache.Client([('106.12.115.136:12000', 1), ('106.12.115.136:12000', 2)], debug=True)
mc.set('key', 'value')
ret = mc.get('key')
print(ret)

# 相关底层,将key转换成数字,将数字对服务器个数进行取余操作
# import binascii
# def cmemcache_hash(key):
#     return (((binascii.crc32(key) & 0xffffffff) >> 16) & 0x7fff) or 1
# serverHashFunction = cmemcache_hash
3、Memcache操作之add方法

add方法:用于创建一个键值对,如果key已经存在,就会报异常

import memcache

mc = memcache.Client(['106.12.115.136:5004'], debug=True)
mc.set('key1', 'value1')
mc.set('key1', 'value2')
4、Memcache操作之replace方法

replace方法:用于修改key的value值,如果key不存在就会报异常。

import memcache

mc = memcache.Client(['106.12.115.136:5004'], debug=True)
mc.replace('key1', 'value2')# 报异常
5、Memcache操作之set和set_multi方法

set:创建一个键值对,如果key存在就修改它的值,如果不存在就创建这个键值对
set_multi:创建若干个键值对,如果key(keys)存在就修改它(它们)的值,如果不存在key(keys),就创建它(他们)。

import memcache

mc = memcache.Client(['106.12.115.136:'], debug=True)
mc.set('key1', 'v1')
# 可以设置超时时间
mc.set('key1','v1',10) # 设置的超时时间是10秒
mc.set_multi({'key1': 'v1', 'key2': 'v2'})
# 可以设置超时时间
mc.set_multi({'key1': 'v1', 'key2': 'v2'},10)
6、Memcache操作之delete和delete_multi

delete:删除指定的一个键值对
delete_multi:删除指定的多个键值对

import memcache

mc = memcache.Client(['106.12.115.136:'], debug=True)
mc.set('key1', 'v1')
mc.set_multi({'key1': 'v1', 'key2': 'v2'})
mc.delete('key1')
mc.delete_multi(['key1', 'key2'])
7、Memcache操作之get和get_multi

get:获取一个键值对
get_multi:获取多个键值对

import memcache

mc = memcache.Client(['106.12.115.136:'], debug=True)
mc.set('key1', 'v1')
mc.set_multi({'key1': 'v1', 'key2': 'v2'})
mc.delete('key1')
mc.delete_multi(['key1', 'key2'])

mc.get('key1')
mc.get_multi(['key1', 'key2'])
8、Memcache操作之append和prepend

append:修改指定key值,在该值后面追加内容
prepend:修改指定key值,在该值前面插入内容

import memcache

mc = memcache.Client(['106.12.115.136:'], debug=True)
mc.set('key1', 'v1')
mc.append('key1', 'after') #key:v1after
mc.prepend('key2', 'before') #key:beforev1
9、Memcache操作之dec和incr

incr:将Memcached中的某个键对应的值增加n(n默认是1)
decr:将Memcached中的某个键对应的值减少n(n默认是1)

import memcache

mc = memcache.Client(['106.12.115.136:'], debug=True)
mc.set('key1', '1')
# incr方法
mc.incr('key1')
mc.incr('key1', 1)
# decr方法
mc.decr('key1')
mc.decr('key1', 1)
10、Memcache操作之gets和cas

有这样的几段程序代码:
test01.py

import memcache

mc = memcache.Client([('127.0.0.1:6000'), 1], debug=True)
mc.set('key1', 1000) #设置key1初始值1000

test02.py

import memcache

mc = memcache.Client([('127.0.0.1:6000'), 1], debug=True)
ret = mc.get('key1')
print(ret) # 得到1000
i = input('回车结束!')
mc.set('key1', 999) # 设置key1为999

test03.py

import memcache

mc = memcache.Client([('127.0.0.1:6000'), 1], debug=True)
ret = mc.get('key1')
print(ret)
i = input('回车结束!')
mc.set('key1', 999)  # 设置key1为999

若test02.py和test03.py代表两个用户要执行的程序,如果用这两个程序执行购买商品,已知的是商品库存key1是1000。他们同时购买,购买后分别将key1的值设置为999。问题来了,实际上key1的值应该是998,如何解决?为了避免这样的问题,Memcached提供了一个解决方案,下面是改进后的程序代码:
test02.py

import memcache

mc = memcache.Client([('127.0.0.1:6000'), 1], debug=True,cache_cas = Ture)
ret = mc.gets('key1')
print(ret) # 得到1000
i = input('回车结束!')
mc.cas('key1', 999) # 设置为999

test03.py

import memcache

mc = memcache.Client([('127.0.0.1:6000'), 1], debug=True, cache_cas = Ture)
ret = mc.gets('key1')
print(ret) # 得到1000
i = input('回车结束!')
mc.cas('key1', 999) # 发生错误

可以同时获取数据,但是对于设置数据,如果有一个程序对数据进行修改(设置),另一个再修改(回写)就会出错。借助Memcached提供的gets和cas方法就可以解决这种问题。

猜你喜欢

转载自blog.csdn.net/Thanlon/article/details/93159168
今日推荐