5. 实践: python 与 Redis
Redis 官方推荐的 Python客户端是 redis-py.
5.1 安装
pip3 install redis
cookies
补充内容: Ubuntu下redis开启远程连接
打开redis配置:sudo vi /etc/redis/redis.conf
注释掉"bind 127.0.0.1",或者修改为"bind 0.0.0.0"
重启redis服务:sudo /etc/init.d/redis-server restart
5.2 连接数据库
导入模块
# 导入 redis-py:import redis # 默认创建连接地址 127,0,0,1, 端口 6379r = redis.Redisr = redis.StrictRedis()# 也可以显式指定需要连接的地址r = redis.Redis(host='127.0.0.1', port=6379, db=0)r = redis.StrictRedis(host='127.0.0.1', port=6379, db=0)r.set('fo', 'hello world')print(r.get('fo')) # b'hello world'
import redis# 连接redis加个decode_responses=True,这样出来的直接是中文,不需要decoder = redis.Redis(decode_responses=True)r = redis.Redis('127.0.0.1', 6379, 0,decode_responses=True)r.set('fooo', '早上好')print(r.get('fooo')) # 早上好
事务和管道
事务
pipe = r.pipeline()pipe.set('foo','far')pipe.get('foo')result = pipe.execute()print(result) # [True, b'far']
管道
# transation = Falsepipe = r.pipeline().set('foa','foo').get('foo').execute()print(pipe) # [True, b'far']
5.3 简单操作
在python3下, 首先导入redis
>>> from redis import Redis,StrictRedis>>> r = Redis(decode_responses=True)
5.3.1 String字符串操作
语法 | 作用 | 示例 |
---|---|---|
r.set(key, value) | 给key赋值为value | r.set('key','value')Out[22]: True |
r.get(key) | 返回数据库中key的value | r.get('key')Out[23]: 'value' |
r.getset(key, value) | 给key赋值为value, 并返回上次的value; 若无值, 则不返回 | r.getset('key','vakue')Out[24]: 'value' |
r.mget(keys, *args) | 返回多个key对应的value | r.mget('name','key')Out[25]: [None, 'vakue'] |
r.setnx(key,value) | 当key不存在才设置value, 设置成功返回True, 当key存在返回False,不更改value | r.setnx('foo','bar')Out[26]: True |
r.setex(key,time,value) | 设置key的value, 指定有效期为time | r.setex('fo',1,'jane')Out[28]: True |
r.setrange(key, offset, value) | 设置key的value值的子字符串 | r.setrange('name',6,'world')Out[31]: 11 |
r.mset(**kargs) | 批量赋值 | r.mset({'n1':'john','n2':'kang'})Out[33]: True |
r.msetnx(**kargs) | key不存在才批量赋值 | r.msetnx({'n3':'n33','n4':'n44'})Out[34]: True |
r.incr(key, amount=1) | 设置key的value增值操作, 默认1, key不存在则被创建并设为 amount, amount 可以为负数,表示减值 | r.incr('age',1)Out[36]: 1r.incr('age',3)Out[37]: 4 |
r.decr(key,amount=1) | 设置key的value减值操作, 默认1, key不存在则被创建并设置为-mount, amount可以为负值, 表示增值 | r.decr('score',2)Out[38]: -2 |
r.append(key,value) | 为key的值附加value | r.append('nick','popo')Out[40]: 6 |
r.substr(key,start,end=-1) | 返回key的value子串, end默认为-1,包含end | r.substr('nick',0)Out[42]: 'OKpopo' |
r.getrange(key,start,end) | 返回key的value值从start到end子串,包含end | r.getrange('nick',1,4)Out[43]: 'Kpop' |
5.3.2 Key操作
语法 | 作用 | 示例 |
---|---|---|
r.exists(key) | 判断一个key是否存在, 存在返回True, 解码为1,不存在返回False, 解码为0 | r.exists('score')Out[8]: 1 |
r.delete(key) | 删除一个key, | r.delete('nick')Out[9]: 1 |
r.type(key) | 判断一个key的类型 | r.type('age')Out[10]: 'string' |
r.keys(pattern) | 获取所有符合规则的key | r.keys('a*')Out[10]: ['age', 'ag'] |
r.randomkey() | 获取随机的一个key | r.randomkey()Out[10]: 'key' |
r.rename(key,newkey) | 将key重命名 | r.rename('age','height')Out[10]: True |
r.dbsize() | 获取当前数据库中key的数目 | r.dbsize()Out[5]: 5 |
r.expire(key,time) | 设定key的过期时间, 单位秒 | r.expire('scor',2)Out[12]: True |
r.ttl(key) | 获取key的过期时间, 单位秒, -1为永久不过期 | r.ttl('score')Out[14]: -1 |
r.move(key,db) | 将key移动其他数据库 | r.move('score',2)Out[15]: True |
r.flushdb() | 删除当前选择数据库中的所有key | r.flushdb()Out[20]: True |
r.flushall() | 删除所有数据库中的所有key | r.flushall()Out[21]: True |
5.3.3 List操作
语法 | 作用 | 示例 |
---|---|---|
r.rpush(key,*values) | 在key尾部(右边)添加值为value的元素, key传多个, 返回list元素个数 | r.rpush('list',1,2,3)Out[48]: 3 |
r.lpush(key,*values) | 在key头部添加值为value的元素, 可以传多个,返回list元素个数 | r.lpush('list',0)Out[49]: 4 |
r.llist(key) | 返回key的长度 | r.llen('list')Out[50]: 4 |
r.lrange(key,start,end) | 返回key中start~end之间的元素, 包含end | r.lrange('list',0,-1)Out[52]: ['0', '1', '2', '3'] |
r.ltrim(key,start,end) | 截取key, 保留索引为start至end的内容 | r.ltrim('list',1,3)Out[54]: True |
r.lindex(key,index) | 返回key的index位置的元素, 越界则没有返回值 | r.lindex('list',2)Out[58]: '3' |
r.lset(key,index,value) | 给key的index位置赋值, 越界则报错 | r.lset('list',2,6)Out[61]: True |
r.lrem(key,count,value) | 删除key中 count 个值为 value 的元素, 返回删除个数 | r.lrem('list',2,6)Out[64]: 1 |
r.lpop(key) | 删除并返回key的首元素(左边) | r.lpop('list')Out[66]: '1' |
r.rpop(key) | 删除并返回key的尾元素(右边) | r.rpop('list')Out[68]: '2' |
r.blpop(key,timeout=0) | 删除并返回key的首元素, 如果key为空, 则会一直阻塞等待, 返回元组,(key,value) | r.blpop('list')Out[69]: ('list', '123') |
r.brpop(key,timeout=0) | 删除并返回key的尾元素, 如果key为空, 则会一直阻塞等待, 返回元组,(key,value) | r.brpop('list')Out[71]: ('list', '1') |
r.rpoplpush(key,newkey) | 删除并返回key的尾元素, 并将元素添加到, newkey的头部 | r.rpoplpush('list','list1')Out[73]: '2' |
5.3.4 Set操作
语法 | 作用 | 示例 |
---|---|---|
r.sadd(key,*values) | 向key中添加元素, 可以添加多个, 返回插入元素个数 | r.sadd('tags','Book','Tea')Out[77]: 2 |
r.srem(key,*values) | 从key中删除元素, 可以删除多个, 返回成功删除的个数 | r.srem('tags','Book','Tea')Out[78]: 2 |
r.spop(key) | 随机删除并返回key中的一个元素 | r.spop('tags')Out[79]: 'Coffee' |
r.smove(key,newkey,value) | 从key中移除元素并添加到newkey中 | r.smove('tags','news','Book')Out[81]: True |
r.scard(key) | 返回key中的元素个数 | r.scard('tags')Out[82]: 2 |
r.sismember(key,value) | 测试value是否在key中, 在返回True, 不在返回False | r.sismember('tags','Tea')Out[84]: True |
r.sinter(keys, *args) | 返回交集, 没有交集返回空集 | r.sinter('tags','news')Out[85]: {'Tea'} |
r.sinterstore(dset,keys,*args) | 求交集, 并将交集保存到dset集合中, 返回dset元素个数 | r.sinterstore('dset','tags','news')Out[93]: 1 |
r.sunion(keys.*args) | 返回并集 | r.sunion('tags','tag2','tag3')Out[97]: {'Coffee', 'Tea'} |
r.sunionstore(dset,keys,*args) | 求并集, 并将并集保存到dset中, 返回并集的元素个数 | r.sunionstore('log','tags','news')Out[99]: 3 |
r.sdiff(key,*args) | 求差集, 并返回在key中, 但不在*args中的元素集合 | r.sdiff('tags','news')Out[100]: {'Coffee'} |
r.sdiffstore(dset,key,*args) | 求差集, 并将差集保存在dset中, 返回差集个数 | r.sdiffstore('dset','tags','news')Out[105]: 1 |
r.smembers(key) | 返回key中所有元素 | r.smembers('tags')Out[107]: {'Coffee', 'Tea'} |
r.srandmember(key) | 随机返回key中的一个元素, 但不删除元素 | r.srandmember('tags')Out[108]: 'Coffee' |
5.3.5 Sorted Set操作
语法 | 作用 | 示例 |
---|---|---|
r.zadd(key,**kargs) | 向key中添加元素, 如果元素已存在, 则更新其score | r.zadd('grade',{'Bob':80,'Mike':61})Out[7]: 2 |
r.zrem(key,*values) | 删除key中的元素 | r.zrem('grade','Mike','Bob')Out[11]: 2 |
r.zincrby(key, amount=1,value,) | 如果在key中已经存在元素value,则该元素的score增加amount,否则向该集合中添加该元素,其score的值为amount | r.zincrby('grade',-2, 'Bob')Out[13]: -2.0 |
r.zrank(key,value) | 返回key中元素的排名下标 (按score从小到大) | r.zrank('grade','Bob')Out[18]: 1 |
r.zrevrank(key,value) | 返回key中元素的倒数排名下标 (按score从大到小) | r.zrevrank('grade','Bob')Out[20]: 0 |
r.zrevrange(key,start,end, withscores=False) | 返回key中的index从start到end的所有元素 (按score从大到小排序) | r.zrevrange('grade',0,-1)Out[21]: ['Bob', 'Mike'] |
r.zrangebyscore( key,min,max, start=None,num=None, withscores=False) | 返回key中score在min到max之间的元素 | r.zrangebyscore('grade',60,90)Out[27]: ['Kang', 'Mike', 'Bob'] |
r.zcount(key,min,max) | 返回key中score在min到max之间的数量 | r.zcount('grade',60,90)Out[31]: 3 |
r.zcard(key) | 返回key中元素个数 | r.zcard('grade')Out[34]: 4 |
r.zremrangebyrank( key,min,max) | 删除并返回key中排名在min到max之间的元素个数 | r.zremrangebyrank('grade',0,1)Out[35]: 2 |
r.zremrangebyscore( key,min,max) | 删除并返回key中score在给定区间的元素个数 | r.zremrangebyscore('grade',60,90)Out[36]: 1 |
5.3.5 Hash操作
语法 | 作用 | 示例 |
---|---|---|
r.hset(key,field,value) | 向key中添加映射, 如果已存在, 则更新, | r.hset('price','cake',5)Out[41]: 1 |
r.hsetnx(key,field,value) | 向key中添加映射, 如果field不存在, 如果存在不更新 | r.hsetnx('price','apple',5)Out[45]: 1 |
r.hget(key, field) | 返回key中映射对象的value | r.hget('price','cake')Out[48]: '6' |
r.hmget(key,fields,*args) | 返回key中各个映射对应的value | r.hmget('price','cake','apple')Out[53]: ['6', '5'] |
r.hmset(key,mapping) | 向key中批量添加映射 | r.hmset('price',{'orange':3,'banana':2})Out[54]: True |
r.hincrby(key,field, amount=1) | 向key中映射的value增加amount | r.hincrby('price','orange',2)Out[56]: 5 |
r.hexists(key,field) | 判断key中是否存在键名为field的映射 | r.hexists('price','orange')Out[57]: True |
r.hdel(key,*fields) | 删除key中field的映射 | r.hdel('price','orange')Out[60]: 1 |
r.hlen(key) | 从key中获取映射个数 | r.hlen('price')Out[61]: 3 |
r.hkeys(key) | 从key中获取所有映射键名 | r.hkeys('price')Out[62]: ['cake', 'apple', 'banana'] |
r.hvals(key) | 从key中获取所有映射键值 | r.hvals('price')Out[63]: ['8', '5', '2'] |
r.hgetall(key) | 从key中获取所有映射键值对 | r.hgetall('price')Out[64]: {'cake': '8', 'apple': '5', 'banana': '2'} |
RedisDump
- redis-load
将数据导入到数据库中
- redis-dump
将数据库信息导出