redis和memcached缓存

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', '')
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","")

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":""})
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")) #
print(aa.decr("aa",amount="")) #
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中的任意数据类型

上一篇:Java获取本地IP地址和主机名


下一篇:应对Memcached缓存失效,导致高并发查询DB的四种思路(l转)