redis是一个key-value存储系统,与memcached类似,它支持存储到value类型相对更多,包括string(字符串),list(列表),set(集合),zset(sorted set --有序集合)和hash(哈希类型),这些数据类型都支持push/pop,add/remove及取交集和并集和差集及更丰富的操作,而且这些操作都是原子性的,在此基础上,redis支持各种不同方式的排序,与memcached一样,为了保证效率,数据都是缓存在内存中,区别是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的纪录文件,并且在此基础上,实现了master-slave主从同步
1.启动客户端
redis默认端口6379
通过shell命令redis-cli
1 127.0.0.1:6379> set name hello 2 OK 3 127.0.0.1:6379> get name 4 "hello"
通过python操作
pip install redis
1 import redis 2 3 r = redis.Redis(host="127.0.0.1", port=6379) 4 r.set("user", "zengchunyun") 5 user = r.get("user") # 获取KEY为user的值 6 print(user) # python3获取的是bytes类型数据,使用时需要准换成UTF8类型
上面这种方式每次操作redis都需要进行一次连接操作,资源浪费严重,所以一般操作时都采取连接池方式
redis-py使用connection pool来管理对一个redis server的所有连接,避免每次建立释放连接的开销,默认,每个redis实例都会维护一个自己的连接池,可以直接建立一个连接池,然后作为参数redis,这样可以实现多个redis实例共享一个连接池
1 pool = redis.ConnectionPool(host="127.0.0.1", port=6379) 2 r = redis.Redis(connection_pool=pool) 3 r.set("user", "python") 4 user = r.get("user") 5 print(user) 6 7 # b‘python‘
2.操作
string操作,redis中的string在内存中按照一个name对应一个value来存储
1 SET key value [EX seconds] [PX milliseconds] [NX|XX] 2 summary: Set the string value of a key 3 since: 1.0.0 4 group: string
1 r.set(name="user", value="zengchunyun", ex=100, px=None, nx=True, xx=False) 2 user = r.get("user") 3 print(user) 4 # 当nx为True时,则只有不存在name时,set操作才会执行 5 r.set(name="user", value="zengchunyun", ex=100, px=None, nx=False, xx=True) 6 user = r.get("user") 7 print(user) 8 9 # 当 xx为True时,只有name存在时,set操作才会执行 10 r.set(name="pwd", value="zengchunyun", ex=100, px=None, nx=True, xx=True) 11 user = r.get("pwd") 12 print(user) 13 # 当nx,xx同时为True时,结果为None
setnx
1 r.setnx(name="age", value=10) 2 age = r.get("age") 3 print(age) # 打印10 4 r.setnx(name="age", value=100) 5 age = r.get("age") 6 print(age) # 打印10 7 # setnx只有name不存在时,才执行操作
setex
1 import datetime 2 3 date = datetime.timedelta(seconds=100) 4 print(date) 5 r.setex(name="user", value=111, time=date) 6 print(r.get("user"))
psetex
1 date = datetime.timedelta(milliseconds=100) 2 r.psetex(name="user", time_ms=date, value=121) 3 print(r.get("user"))
mset
1 r.mset(k1=110, k2=119) # 设置多个值 2 r.mset({"k1": 120, "k2": 121}) 3 print(r.mget("k2")) # 取单个值 4 print(r.mget("k1", "k2")) # 取多个值,返回的都是列表类型 5 print(r.mget(["k1", "k2"]))
getset
1 r.set(name="user", value="zcy") 2 print(r.get("user")) # 获取键值 3 print(r.getset(name="user", value="newzcy")) # 设置新值,并获取原来的值,不存在则为none 4 print(r.get("user")) # 打印新值 5 # b‘zcy‘ 6 # b‘zcy‘ 7 # b‘newzcy‘
getrange
1 user = r.getrange(key="user", start=0, end=-1) 2 print(user) 3 user = r.getrange(key="user", start=0, end=-2) 4 print(user) 5 user = r.getrange(key="user", start=1, end=-1) 6 print(user) # 从第1位,也就是下标为1的元素,结束为最后一位 7 user = r.getrange(key="user", start=0, end=1) 8 print(user) # 包括开始位置,以及结束位置 9 # b‘newzcy‘ 10 # b‘newzc‘ 11 # b‘ewzcy‘ 12 # b‘ne‘
原文:http://www.cnblogs.com/zengchunyun/p/5301321.html