python-操作缓存

memcached
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。
 
memcached启动:
 memcached -d -m 10    -u root -l 192.168.1.100 -p 45555-c 256 -P /tmp/memcached.pid
 参数说明:
    -d 是启动一个守护进程
    -m 是分配给Memcache使用的内存数量,单位是MB
    -u 是运行Memcache的用户
    -l 是监听的服务器IP地址
    -p 是设置Memcache监听的端口,最好是1024以上的端口
    -c 选项是最大运行的并发连接数,默认是1024,按照你服务器的负载量来设定
    -P 是设置保存Memcache的pid文
 
 1 #服务端安装memcached,本地安装对应api模块
 2 #在python中调用模块
 3 import memcache
 4 #建立链接对应ip端口
 5 mc = memcache.Client(['192.168.1.100:45555'], debug=True)
 6 #修改值,存在修改,不存在添加
 7 mc.set("foo", "bar")
 8 #根据key获取value值
 9 ret = mc.get('foo')
10 print ret
11 >>>bar
 1 import memcache
 2 
 3 #支持多个集群根据权重去对应集群中获取值
 4 mc = memcache.Client([('1.1.1.1:12000', 1), ('1.1.1.2:12000', 2), ('1.1.1.3:12000', 1)], debug=True)
 5 
 6 #修改值存在修改,不存在添加
 7 mc.set('k1', 'v1')
 8 
 9 #添加纪录
10 mc.add('k2','v2')
11 mc.add('k2','v2')#报错
12 
13 如果memcache中存在kkkk,则替换成功,否则一场
14 
15 #替换值如果存在则修改,存在报异常
16 mc.replace('kkkk','999')
17 
18 #设置多个键值对
19 mc.set_multi({'k3': 'v3', 'k4': 'v4'})
20 
21 #删除值
22 mc.delete('k1')
23 
24 #批量删除
25 mc.delete_multi(['k1', 'k2'])
26 
27 #根据key获取值
28 val = mc.get('k1')
29 
30 #批量获取值
31 item_dict = mc.get_multi(["k1", "k2", "k3"])
32 
33 #根据key在value后面追加值
34 mc.append('k1', 'after')
35 # k1 = "v1after"
36 
37 #根据key在value前面追加值
38 mc.prepend('k1', 'before')
39 # k1 = "beforev1after"
40 
41 #incr,根据key将value的值自增1
42 mc.incr('k1')
43 #decr ,根据key将value的值自减1
44 mc.decr ('k1')
#为了避免多个用户同时修改提交数据导致数据不一致
mc = memcache.Client(['192.168.1.100:45555'],debug=True,cache_cas=True)
v = mc.gets('product_count')
print(v)
mc.cas('product_count','111')#报错
#gets与cas中间修改值得话会报错
mc.cas('product_count','889')

redis

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
redis与memcache比较
1 Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储,memcached只支持一种数据类型。
2 Redis支持数据的备份,即master-slave模式的数据备份。
3 Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
启动服务端
    src/redis-server
 启动客户端 
    src/redis-cli
 1 #调用redis模块
 2 import redis
 3 #链接redis服务端
 4 r = redis.Redis(host='192.168.1.100', port=41111)
 5 #修改值
 6 r.set('foo', 'Bar')
 7 #获取值
 8 print r.get('foo')
 9 >>>'Bar'
10 
11 #redis-py使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。默认,每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数Redis,这样就可以实现多个Redis实例共享一个连接池。
12 import redis
13 pool = redis.ConnectionPool(host='192.168.1.100', port=41111)
14 r = redis.Redis(connection_pool=pool)
15 r.set('foo', 'Bar')
16 print r.get('foo')
17 #set(name, value, ex=None, px=None, nx=False, xx=False)
18 #在Redis中设置值,默认,不存在则创建,存在则修改
19 #参数:
20 #     ex,过期时间(秒)
21 #     px,过期时间(毫秒)
22 #     nx,如果设置为True,则只有name不存在时,当前set操作才执行
23 #     xx,如果设置为True,则只有name存在时,当前set操作才执行
24 
25 #mset批量设置值
26 mset(k1 = 'v1' ,k2 = 'v2')
27 mget({'k1':'v1','k2':'v2'})
28 
29 #get(name)获取值
30 get('k1')
31 
32 #mget(keys,args)批量获取
33 mget('k1','k2')
34 
35 #getset设置新值并获取原来的值
36 #getrange(key,start,end)获取子序列
37 set('k1','liguangxu')
38 getrange('k1',1,2)#ig
39 #setrange(name,offset,value)修改字符串内容,从指定位置开始替换
40 #append(key,value)在redis name对应的值后面追加内容
41 append('k1','aaa')#'liguangxuaaa'
 
原文地址:https://www.cnblogs.com/liguangxu/p/5697597.html