redis和memcached缓存

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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, 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中的任意数据类型

以上是关于redis和memcached缓存的主要内容,如果未能解决你的问题,请参考以下文章

缓存击穿(内存 or Memcached or Redis.....)

redis和memcached缓存

对比Memcached和Redis,谁才是适合你的缓存知网的阈值

对比Memcached和Redis,谁才是适合你的缓存知网的阈值

对比Memcached和Redis,谁才是适合你的缓存?

memcached和redis缓存