memcached
memcache开源的,高性能,高并发分布式内存缓存系统,天生支持集群
memcached下载地址:
http://memcached.org/downloads
python实现memcached缓存
pip3 install python-memcached
import memcache aa=memcache.Client(["10.0.0.20:11211"],debug=True) aa.set("k1","v1") print(aa.get("k1"))
memcached方法使用
import memcache aa=memcache.Client([("10.0.0.20:11211",1),("10.0.0.20:11212",2),("10.0.0.20:11213",1)],debug=True) #会存到11212中 aa.set("k1","v1") aa.replace("k1","hahaha") aa.set('k2', '1') aa.incr('k2',100) print(aa.get("k2")) aa.decr('k2',50) print(aa.get("k2"))
import memcache aa=memcache.Client([("10.0.0.20:11211",1),("10.0.0.20:11212",2),("10.0.0.20:11213",1)],debug=True,cache_cas=True) print(aa.gets("product_count")) #aa.set("product_count","111") #在gets和最后的cas之间,如果修改值,就会抛出异常 aa.cas("product_count","899")
redis
redis持久化存储系统,全称remote directory server,是基于key-value的持久化数据库存储系统。redis和memcached很相似,redis的数据类型更丰富:string,list,set,hash,sorted set,redis,支持主从同步,把更新的数据写到磁盘
下载地址: http://download.redis.io/releases/redis-2.8.9.tar.gz
python实现redis缓存
服务器要开启redis,python安装redis模块:pip3 install redis
基本操作:
import redis aa=redis.Redis(host="10.0.0.20",port=7777) aa.set("k1","v1",ex=2) print(aa.get("k1"))
管理连接的连接池:
import redis pool=redis.ConnectionPool(host="10.0.0.20",port=7777) aa=redis.Redis(connection_pool=pool)
redis构造方法:
def __init__(self, host='localhost', port=6379, db=0, password=None, socket_timeout=None, socket_connect_timeout=None, socket_keepalive=None, socket_keepalive_options=None, connection_pool=None, unix_socket_path=None, encoding='utf-8', encoding_errors='strict', charset=None, errors=None, decode_responses=False, retry_on_timeout=False, ssl=False, ssl_keyfile=None, ssl_certfile=None, ssl_cert_reqs=None, ssl_ca_certs=None, max_connections=None): db:数据库号 password:输入redis设置的密码
redis数据类型:
1,string类型
2,list
3,hash
4,set
5,sorted set
string | |
set(name, value, ex=None, px=None, nx=False, xx=False) | ex:设置此数据的超时时间 nx:如果设置为True,只有当name不存在时,set执行 xx:如果设置为True,只有当name存在时,set执行 |
setnx(name, value) | 只有当name不存在时,set执行 |
setex(name, value, time) | 设置数据有效期 |
mset(*args, **kwargs) | 设置多个数据 |
get(name) |
|
strlen(name) | 获取name的值的字节长度 |
incr(name, amount=1) | 整数自增 |
incrbyfloat(name, amount=1.0) | 以小数自增 |
decr(name, amount=1) | 整数自减 |
aa.flushdb() aa.set("k1","v1") aa.mset({"aa":22,"vv":"22"}) print(aa.get("k1")) print(aa.mget("k1","aa")) #[b'v1', b'11'] print(aa.strlen("k1")) aa.append("こ","じ") print(aa.keys()[0].decode()) #こ print(aa.incr("aa")) #23 print(aa.decr("aa",amount="10")) #13 exit()
hash | |
hset(name, key, value) | name:redis的key key:name下的一个key value:key的value |
hmset(name, mapping) | 一次性创建hash |
hget(name, key) | 获取name的key的value |
hkeys(name) | 获取name下的所有的key |
hvals(name) | 取name下的所有value |
hexists(name, key) | 是否存在此hash |
hlen(name) | 查看name下的hash数 |
hdel(name, *keys) | 删除name下的hash,可删除多个 |
aa.flushdb() aa.hset("rdi1","k1","v1") aa.hset("rdi1","k2","v2") #rdi1={"k1":"v1","k2":"v2"} aa.hmset("rdi2",{"k1":"v1","k2":"v2"}) aa.hmset("rdi3",{"k1":"v1","k2":"v2"}) print(aa.hmget("rdi2","k2","k1")) print(aa.hkeys("rdi2")) print(aa.hvals("rdi2")) print(aa.keys()) print(aa.hdel("rdi2","k1","k2")) print(aa.hkeys("rdi2"))
list | |
lpush(name, *values) | 在左边压入一个或多个值 |
lpop(name) | 从左边弹出一个值,并从列表中删除 |
lset(name, index, value) | 设置已有索引的值,若指定从左边开始的索引无值,则报错 |
lrange(name, start, end) | 从左边开始,切片 |
lrem(name, value, num=0) | 从左边开始取指定值删除,num指定删除几个,0表示所有删除 |
rpoplpush(src, dst) | 从一个列表的最右边取出数放到另一个的最左边 |
aa.flushdb() aa.lpush("k1",11,22) #k1=[22,11] aa.lpush("k1",33) #k1.lappend(33) aa.rpush("k1",11) #k1.rappend(33) aa.lrem("k1",11,num=1) print(aa.type("k1")) print(aa.llen("k1")) aa.lset("k1",2,"hello") aa.rpoplpush("k1","k2") print(aa.lpop("k2")) print(aa.lrange("k1",0,aa.llen("k1"))) print(aa.lpop("k1")) print(aa.lpop("k1"))
Set | |
sadd(name, *values) | 添加name下value,可以一次添加多个 |
scard(name) | 查看name下有多少元素 |
sdiff(keys, *args) | 取keys和*args的差集,keys - *args |
sdiffstore(dest, keys, *args) | 把上面得出的差集存到dest里 |
sinter(keys, *args) | 取keys和*args的交集,keys & *args |
sinterstore(dest, keys, *args) | 把上面得出的并集存到dest里 |
sunion(keys, *args) | 取keys和*args的并集,keys | *args |
smembers(name) | 打印name下的所有元素 |
spop(name) | 从尾部删除一个成员 |
smove(src, dst, value) | 移动src下的value值到dst |
aa.flushdb() aa.sadd("rdi1","v1","v2","v3") #rdi1={"v1","v2","v3"} aa.sadd("rdi2","v2","v5") #rdi2={"v2","v5"} print(aa.type("rdi1")) print(aa.scard("rdi1")) print(aa.sdiff("rdi1","rdi2")) #rdi1 - rdi2 aa.sdiffstore("rdi3","rdi1","rdi2") #rdi3 = rdi1 - rdi2 print(aa.sinter("rdi1","rdi2")) #rdi1 & rdi2 aa.sinterstore("rdi3","rdi1","rdi2") print(aa.sunion("rdi1","rdi2")) #rdi1 | rdi2 print(aa.smembers("rdi1")) #print(rdi1)
Other | |
keys(self, pattern='*') | 列出所有键 |
type(name) | 查看值的类型 |
flushdb() | 清空当前db |
flushall() | 清空所有数据 |
dbsize() | 查看此db下有多少个name |
move(name, db)) | 将redis的某个值移动到指定的db下 |
randomkey() | 随机获取一个redis的name(不删除) |
expire(name ,time) | 为某个redis的某个name设置超时时间 |
delete(*names) | 根据删除redis中的任意数据类型 |