Python与Redis交互
5. 实践: python 与 Redis
其他教程1
其他教程2
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, 端口 6379
r = redis.Redis
r = 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,这样出来的直接是中文,不需要decode
r = 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 = False
pipe = 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]: 1 r.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
将数据库信息导出
转载于:https://www.cnblogs.com/huangrenfeng/p/10546920.html
Python与Redis交互相关推荐
- 〖Python 数据库开发实战 - Python与Redis交互篇⑯〗- 综合案例 - 新闻管理系统第二阶段完结 - “app.py“ 模块收尾及案例演示
订阅 Python全栈白宝书-零基础入门篇 可报销!白嫖入口-请点击我.推荐他人订阅,可获取扣除平台费用后的35%收益,文末名片加V! 说明:该文属于 Python全栈白宝书专栏,免费阶段订阅数量43 ...
- 〖Python 数据库开发实战 - Python与Redis交互篇⑮〗- 综合案例 - 新闻管理系统 - 更新所编辑新闻状态(根据输入内容进行保存操作)
订阅 Python全栈白宝书-零基础入门篇 可报销!白嫖入口-请点击我.推荐他人订阅,可获取扣除平台费用后的35%收益,文末名片加V! 说明:该文属于 Python全栈白宝书专栏,免费阶段订阅数量43 ...
- 〖Python 数据库开发实战 - Python与Redis交互篇①〗- redis-py的安装与使用
订阅 Python全栈白宝书-零基础入门篇 可报销!白嫖入口-请点击我.推荐他人订阅,可获取扣除平台费用后的35%收益,文末名片加V! 说明:该文属于 Python全栈白宝书专栏,免费阶段订阅数量43 ...
- 〖Python 数据库开发实战 - Python与Redis交互篇⑦〗- 利用 redis-py 实现缓存学生考试信息
订阅 Python全栈白宝书-零基础入门篇 可报销!白嫖入口-请点击我.推荐他人订阅,可获取扣除平台费用后的35%收益,文末名片加V! 说明:该文属于 Python全栈白宝书专栏,免费阶段订阅数量43 ...
- 【第3期赠书活动】〖Python 数据库开发实战 - Python与Redis交互篇⑬〗- 综合案例 - 新闻管理系统 - 编辑新闻(编辑角色权限)
前言: ✌ 作者简介:渴望力量的哈士奇 ✌,大家可以叫我
- 〖Python 数据库开发实战 - Python与Redis交互篇⑫〗- 综合案例 - 新闻管理系统 - 删除新闻(含redis缓存)
前言: ✌ 作者简介:渴望力量的哈士奇 ✌,大家可以叫我
- 〖Python 数据库开发实战 - Python与Redis交互篇⑩〗- 综合案例 - 新闻管理系统 - 发表新闻
前言: ✌ 作者简介:渴望力量的哈士奇 ✌,大家可以叫我
- 〖Python 数据库开发实战 - Python与Redis交互篇⑪〗- 综合案例 - 新闻管理系统 - 缓存新闻数据至redis
前言: ✌ 作者简介:渴望力量的哈士奇 ✌,大家可以叫我
- 〖Python 数据库开发实战 - Python与Redis交互篇⑭〗- 综合案例 - 新闻管理系统 - 更新所编辑新闻状态(编辑角色权限)
前言: ✌ 作者简介:渴望力量的哈士奇 ✌,大家可以叫我
最新文章
- POJ1328贪心放雷达
- android 加载更多,如何在android中实现加载更多的recyclerview
- boost::hana::make_lazy用法的测试程序
- 利用IDA Pro反汇编程序
- RTree算法及介绍
- nginx 配置 http/2(h2) 和 http 在同一端口的问题
- VPX单板计算机xPower 6110
- 机器学习第九章聚类Kmeans练习(西瓜数据集4.0)
- Kubernetes operators
- 拥抱变化,面向Java17,Java8-18全系列特性详解
- 无法识别的USB设备:跟这台计算机连接的一个USB设备运行不正常,WINDOWS无法识别...
- linux内核配置cpu相关,Linux内核配置
- ntohs和htons区别?
- TS 对象可能为“未定义”,不能将类型“ XXXX | undefined “分配给类型{ xxxx }
- Android Fragmnet-Fragment数据交换以及ListFragment的使用
- php判断页面访问是移动端还是pc端
- Linux扩展文件分区
- 麒麟V10 root登录系统
- 我的期末网页设计HTML作品——咖啡文化网页制作
- 2000-2020年中国省份、282个地级市Dagum基尼系数及分解