Memcached
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。
memcached安装:
memcached -d -m 10 -u root -l 192.168.132.130 -p 12000 -c 256 -P /tmp/memcached.pid 参数说明: -d 是启动一个守护进程 -m 是分配给Memcache使用的内存数量,单位是MB -u 是运行Memcache的用户 -l 是监听的服务器IP地址 -p 是设置Memcache监听的端口,最好是1024以上的端口 -c 选项是最大运行的并发连接数,默认是1024,按照你服务器的负载量来设定 -P 是设置保存Memcache的pid文件
使用python操作memcached:
python操作memcached需要安装python-memcached模块
连接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 = "v1"),那么要执行一下步骤:
- 根据算法将 k1 转换成一个数字
- 将数字和主机列表长度求余数,得到一个值 N( 0 <= N < 列表长度 )
- 在主机列表中根据 第2步得到的值为索引获取主机,例如:host_list[N]
- 连接 将第3步中获取的主机,将 k1 = "v1" 放置在该服务器的内存中
代码实现如下:
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‘)
对memcache的基本操作:
添加键值,若存在则异常
import memcache mc = memcache.Client([‘192.168.132.130:12000‘], debug=True) # 如果memcache中存在kkkk,则替换成功,否则一场 mc.replace(‘kkkk‘,‘999‘)
设置键值对,如果key不存在,则创建,如果key存在,则修改,set设置一个,set_multi设置多个
import memcache mc = memcache.Client([‘192.168.132.130:12000‘], debug=True) mc.delete(‘key0‘) mc.delete_multi([‘key1‘, ‘key2‘])
获取键值对,get获取一个,get_multi获取多个
import memcache mc = memcache.Client([‘192.168.132.130:12000‘], debug=True) val = mc.get(‘key0‘) item_dict = mc.get_multi(["key1", "key2", "key3"])
修改键值对
append,修改指定key的值,在该值 后面 追加内容
prepend ,修改指定key的值,在该值 前面 插入内容
import memcache mc = memcache.Client([‘192.168.132.130:12000‘], debug=True) # k1 = "v1" mc.append(‘k1‘, ‘after‘) # k1 = "v1after" mc.prepend(‘k1‘, ‘before‘) # k1 = "beforev1after"
自增与自减键值对
incr 自增,将Memcached中的某一个值增加 N ( N默认为1 )
decr 自减,将Memcached中的某一个值减少 N (
N默认为1 )
import memcache mc = memcache.Client([‘192.168.132.130:12000‘], debug=True) mc.set(‘k1‘, ‘777‘) mc.incr(‘k1‘) # k1 = 778 mc.incr(‘k1‘, 10) # k1 = 788 mc.decr(‘k1‘) # k1 = 787 mc.decr(‘k1‘, 10) # k1 = 777
Redis操作
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
基本使用:
set foo bar OK redis> get foo "bar"
python操作redis:
import redis r = redis.Redis(host=‘192.168.132.130‘, port=6379) r.set(‘foo‘, ‘Bar‘) print r.get(‘foo‘)
redis连接池:redis-py使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。默认,每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数 Redis,这样就可以实现多个Redis实例共享一个连接池。
import redis pool = redis.ConnectionPool(host=‘192.168.132.130‘, port=6379) r = redis.Redis(connection_pool=pool) # pipe = r.pipeline(transaction=False) pipe = r.pipeline(transaction=True) r.set(‘name‘, ‘ares‘) r.set(‘role‘, ‘man‘) pipe.execute()
redis的发布与订阅:
发布者:服务器
订阅者:Dashboad和数据处理
发布订阅实例:
from monitor.RedisHelper import RedisHelper obj = RedisHelper() redis_sub = obj.subscribe() while True: msg= redis_sub.parse_response() print msg
发布者:
from monitor.RedisHelper import RedisHelper obj = RedisHelper() obj.public(‘hello‘)
未完待续!