python操作redis方法总结


Posted in Python onJune 06, 2018

连接 Redis

import redisc

连接方式:redis提供了2个方法

1:StrictRedis:实现大部分官方的命令

2:Redis:是StrictRedis的子类,用于向后兼容旧版的redis。

官方推荐使用StrictRedis方法。

举例(普通连接):

import redis

#decode_responses=True 自动解码

r = redis.Redis(host='127.0.0.1',port=6379,password='123456',db=0,decode_responses=True) #默认数据库为0

r = redis.StrictRedis(host='10.10.2.14',port=6379,password='123456',decode_responses=True)

连接池:connection pool

管理对一个redis server的所有连接,避免每次建立,释放连接的开销。默认,每个redis实例都会维护一个自己的连接池,可以直接建立一个连接池,作为参数传给redis,这样可以实现多个redis实例共享一个连接池。

举例(连接池):

pool = redis.ConnectionPool(host='127.0.0.1',port=6379,password='123456',decode_responses=True)
r = redis.Redis(connection_pool=pool)

一 STRING 字符串的操作

1. r.set 设置值

#在Redis中设置值,默认不存在则创建,存在则修改
r.set('name', 'zhangsan')
'''参数:
  set(name, value, ex=None, px=None, nx=False, xx=False)
  ex,过期时间(秒)
  px,过期时间(毫秒)
  nx,如果设置为True,则只有name不存在时,当前set操作才执行,同setnx(name, value)
  xx,如果设置为True,则只有name存在时,当前set操作才执行'''
r.get('name')

3. mset 批量设置值

#批量设置值
r.mset(name1='zhangsan', name2='lisi')
#或
r.mget({"name1":'zhangsan', "name2":'lisi'})

4. mget(keys, *args) 批量获取

#批量获取
print(r.mget("name1","name2"))
#或
li=["name1","name2"]
print(r.mget(li))

5. getset 设置新值,打印原值

#设置新值,打印原值
getset(name, value) 

print(r.getset("name1","wangwu")) #输出:zhangsan
print(r.get("name1")) #输出:wangwu

6. getrange 根据字节获取子序列

#根据字节获取子序列
getrange(key, start, end) 

r.set("name","zhangsan")
print(r.getrange("name",0,3))#输出:zhan

7. setrange 修改字符串内容,从指定字符串索引开始向后替换,如果新值太长时,则向后添加

#修改字符串内容,从指定字符串索引开始向后替换,如果新值太长时,则向后添加
setrange(name, offset, value) 

r.set("name","zhangsan")
r.setrange("name",1,"z")
print(r.get("name")) #输出:zzangsan
r.setrange("name",6,"zzzzzzz")
print(r.get("name")) #输出:zzangszzzzzzz

8. strlen(name) 返回name对应值的字节长度

#返回name对应值的字节长度(一个汉字3个字节)
r.set("name","zhangsan")
print(r.strlen("name")) #输出:8

9. incr 值的累加 amount为累加的值

#自增mount对应的值,当mount不存在时,则创建mount=amount,否则,则自增,amount为自增数(整数)
incr(self, name, amount=1) 

print(r.incr("mount",amount=2))#输出:2
print(r.incr("mount"))#输出:3
print(r.incr("mount",amount=3))#输出:6
print(r.incr("mount",amount=6))#输出:12
print(r.get("mount")) #输出:12

10. append 在name对应的值后面追加内容

#在name对应的值后面追加内容
append(name, value)

r.set("name","zhangsan")
print(r.get("name"))  #输出:'zhangsan
r.append("name","lisi")
print(r.get("name"))  #输出:zhangsanlisi

11.type 查看类型

r.type(name)

二 Hash 操作

redis中的Hash 在内存中类似于一个name对应一个dic来存储

1. hset name对应的hash中设置一个键值对(不存在,则创建,否则,修改)

#name对应的hash中设置一个键值对(不存在,则创建,否则,修改)
hset(name, key, value)
r.hset("dic_name","a1","aa")

2. hget 在name对应的hash中根据key获取value

r.hset("dic_name","a1","aa")
#在name对应的hash中根据key获取value
hget(name,key) 

print(r.hget("dic_name","a1"))#输出:aa

3. hgetall 获取name对应hash的所有键值

#获取name对应hash的所有键值
hgetall(name)

print(r.hgetall("dic_name"))

4. hmset 在name对应的hash中批量设置键值对,mapping:字典

#在name对应的hash中批量设置键值对,mapping:字典
hmset(name, mapping) 

dic={"a1":"aa","b1":"bb"}
r.hmset("dic_name",dic)
print(r.hget("dic_name","b1"))#输出:bb

5. hmget 在name对应的hash中获取多个key的值

# 在name对应的hash中获取多个key的值
hmget(name, keys, *args) 

li=["a1","b1"]
print(r.hmget("dic_name",li))
print(r.hmget("dic_name","a1","b1"))

6.

hlen 获取hash中键值对的个数

hkeys 获取hash中所有的key的值

hvals 获取hash中所有的value的值

dic={"a1":"aa","b1":"bb"}
r.hmset("dic_name",dic)

#hlen(name) 获取hash中键值对的个数
print(r.hlen("dic_name"))

#hkeys(name) 获取hash中所有的key的值
print(r.hkeys("dic_name"))

#hvals(name) 获取hash中所有的value的值
print(r.hvals("dic_name"))

7. hexists 检查name对应的hash是否存在当前传入的key

#检查name对应的hash是否存在当前传入的key
hexists(name, key)

print(r.hexists("dic_name","a1"))#输出:True

8. hdel 删除指定name对应的key所在的键值对

#删除指定name对应的key所在的键值对
hdel(name,*keys)  

r.hdel("dic_name","a1")

9. hincrby 自增hash中key对应的值,不存在则创建key=amount(amount为整数)

#自增hash中key对应的值,不存在则创建key=amount(amount为整数)
hincrby(name, key, amount=1)

print(r.hincrby("demo","a",amount=2))

10.hincrbyfloat 自增hash中key对应的值,不存在则创建key=amount(amount为浮点数)

自增hash中key对应的值,不存在则创建key=amount(amount为浮点数)

hincrbyfloat(name, key, amount=1.0)

三 List 操作

redis中的List在内存中按照一个name对应一个List来存储

1. lpush 在name对应的list中添加元素,每个新的元素都添加到列表的最左边

# 在name对应的list中添加元素,每个新的元素都添加到列表的最左边
lpush(name,values)

r.lpush("list_name",2)
r.lpush("list_name",3,4,5)#保存在列表中的顺序为5,4,3,2

2.rpush 同lpush,但每个新的元素都添加到列表的最右边

#同lpush,但每个新的元素都添加到列表的最右边
rpush(name,values)

3. lpushx 在name对应的list中添加元素,只有name已经存在时,值添加到列表的最左边

#在name对应的list中添加元素,只有name已经存在时,值添加到列表的最左边
 lpushx(name,value)

4. rpushx 在name对应的list中添加元素,只有name已经存在时,值添加到列表的最右边

#在name对应的list中添加元素,只有name已经存在时,值添加到列表的最右边
 rpushx(name,value)

5. llen name对应的list元素的个数

# name对应的list元素的个数
llen(name)

print(r.llen("list_name"))

6. linsert 在name对应的列表的某一个值前或后插入一个新值

# 在name对应的列表的某一个值前或后插入一个新值
 linsert(name, where, refvalue, value))
r.linsert("list_name","BEFORE","2","SS")#在列表内找到第一个元素2,在它前面插入SS

'''参数:
   name: redis的name
   where: BEFORE(前)或AFTER(后)
   refvalue: 列表内的值
   value: 要插入的数据'''

7. r.lset 对list中的某一个索引位置重新赋值

#对list中的某一个索引位置重新赋值
r.lset(name, index, varlue)

r.lset("list_name",0,"bbb")

8. r.lrem 删除name对应的list中的指定值

#删除name对应的list中的指定值
r.lrem(name, count, value) 
r.lrem("list_name",3,'ssss')

''' 参数:
  name: redis的name
  value: 要删除的值
  num:  num=0 删除列表中所有的指定值;
      num=2 从前到后,删除2个;
      num=-2 从后向前,删除2个'''

9. lpop 移除列表的左侧第一个元素,返回值则是第一个元素

#移除列表的左侧第一个元素,返回值则是第一个元素
lpop(name) 

print(r.lpop("list_name"))

10. lindex 根据索引获取列表内元素

#根据索引获取列表内元素
lindex(name, index)

print(r.lindex("list_name",1))

11. lrange 分片获取元素

#分片获取元素
lrange(name, start, end)

print(r.lrange("list_name",0,-1))

12. ltrim 移除列表内没有在该索引之内的值(裁剪)

#移除列表内没有在该索引之内的值
ltrim(name, start, end)

r.ltrim("list_name",0,2)

13. rpoplpush(src, dst) 从一个列表取出最右边的元素,同时将其添加至另一个列表的最左边

# 从一个列表取出最右边的元素,同时将其添加至另一个列表的最左边
#src 要取数据的列表
#dst 要添加数据的列表

四 Set 操作

Set集合就是不允许重复的列表

1. sadd(name,values) 给name对应的集合中添加元素

#给name对应的集合中添加元素
r.sadd("set_name","aa")
r.sadd("set_name","aa","bb")

2. smembers(name) 获取name对应的集合的所有成员

#获取name对应的集合的所有成员

3. scard(name) 获取name对应的集合中的元素个数

#获取name对应的集合中的元素个数
r.scard("set_name")

4. sdiff(keys, *args) 在第一个name对应的集合中且不在其他name对应的集合的元素集合

#在第一个name对应的集合中且不在其他name对应的集合的元素集合
r.sadd("set_name","aa","bb")
r.sadd("set_name1","bb","cc")
r.sadd("set_name2","bb","cc","dd")

print(r.sdiff("set_name","set_name1","set_name2"))#输出:{aa}

6. sinter(keys, *args) 获取多个name对应集合的并集

# 获取多个name对应集合的并集
r.sadd("set_name","aa","bb")
r.sadd("set_name1","bb","cc")
r.sadd("set_name2","bb","cc","dd")

print(r.sinter("set_name","set_name1","set_name2"))#输出:{bb}

8.sismember 检查value是否是name对应的集合内的元素

#检查value是否是name对应的集合内的元素
sismember(name, value)

9. smove(src, dst, value) 将某个元素从一个集合中移动到另外一个集合

#将某个元素从一个集合中移动到另外一个集合

10. spop(name) 从集合的右侧移除一个元素,并将其返回

#从集合的右侧移除一个元素,并将其返回

11. srandmember(name, numbers) 从name对应的集合中随机获取numbers个元素

# 从name对应的集合中随机获取numbers个元素
print(r.srandmember("set_name2",2))

12. srem(name, values) 删除name对应的集合中的某些值

#删除name对应的集合中的某些值
print(r.srem("set_name2","bb","dd"))

13. sunion(keys, *args) 获取多个name对应的集合的并集

#获取多个name对应的集合的并集
r.sunion("set_name","set_name1","set_name2")

14. sunionstore(dest,keys, *args) 获取多个name对应的集合的并集,并将结果保存到dest对应的集合中

#获取多个name对应的集合的并集,并将结果保存到dest对应的集合中

五 有序集合 zset

有序集合:

在集合的基础上,为每元素排序,元素的排序需要根据另外一个值来进行比较,所以,对于有序集合,每一个元素有两个值,即:值和分数,分数专门用来做排序。

1. zadd(name, args, *kwargs)

# 在name对应的有序集合中添加元素
r.zadd("zset_name", 6,"a1", 2, "a2", 5,"a3")
#或
r.zadd('zset_name1', b1=10, b2=5)

2. zcard(name) 获取有序集合内元素的数量

#获取有序集合内元素的数量

3. zcount(name, min, max) 获取有序集合中分数在[min,max]之间的个数

#获取有序集合中分数在[min,max]之间的个数
print(r.zcount("zset_name",1,5))

4. zincrby(name, value, amount) 自增有序集合内value对应的分数

#自增有序集合内value对应的分数
r.zincrby("zset_name","a1",amount=2)#自增zset_name对应的有序集合里a1对应的分数

5. zrange( name, start, end, desc=False, withscores=False, score_cast_func=float)

# 按照索引范围获取name对应的有序集合的元素
aa=r.zrange("zset_name",0,1,desc=False,withscores=True,score_cast_func=int)
print(aa)
'''参数:
  name  redis的name
  start  有序集合索引起始位置
  end   有序集合索引结束位置
  desc  排序规则,默认按照分数从小到大排序
  withscores 是否获取元素的分数,默认只获取元素的值
  score_cast_func 对分数进行数据转换的函数'''

6. zrevrange(name, start, end, withscores=False, score_cast_func=float)

#同zrange,集合是从大到小排序的

7. zrank(name, value)、zrevrank(name, value)

#获取value值在name对应的有序集合中的排行位置(从0开始)
print(r.zrank("zset_name", "a2"))

print(r.zrevrank("zset_name", "a2"))#从大到小排序

 

8. zscore(name, value) 获取name对应有序集合中 value 对应的分数

#获取name对应有序集合中 value 对应的分数
print(r.zscore("zset_name","a1"))

 

9. zrem(name, values) 删除name对应的有序集合中值是values的成员

#删除name对应的有序集合中值是values的成员
r.zrem("zset_name","a1","a2")

10. zremrangebyrank(name, min, max) 根据排行范围删除

#根据排行范围删除

11. zremrangebyscore(name, min, max) 根据分数范围删除

#根据分数范围删除

12. zinterstore(dest, keys, aggregate=None)

r.zadd("zset_name", "a1", 6, "a2", 2,"a3",5)
r.zadd('zset_name1', a1=7,b1=10, b2=5)

# 获取两个有序集合的交集并放入dest集合,如果遇到相同值不同分数,则按照aggregate进行操作
# aggregate的值为: SUM MIN MAX
r.zinterstore("zset_name2",("zset_name1","zset_name"),aggregate="MAX")
print(r.zscan("zset_name2"))

13. zunionstore(dest, keys, aggregate=None)

#获取两个有序集合的并集并放入dest集合,其他同zinterstore,

其他常用操作

1. delete(*names) 根据name删除redis中的任意数据类型

#根据name删除redis中的任意数据类型

2. exists(name) 检测redis的name是否存在

#检测redis的name是否存在

3. keys(pattern='*') 根据* ?等通配符匹配获取redis的name

#根据* ?等通配符匹配获取redis的name

4. expire(name ,time) 为某个name设置超时时间

# 为某个name设置超时时间

5. rename(src, dst) 重命名

# 重命名

6. move(name, db)) 将redis的某个值移动到指定的db下

# 将redis的某个值移动到指定的db下

7. randomkey() 随机获取一个redis的name(不删除)

#随机获取一个redis的name(不删除)

8. type(name) 获取name对应值的类型

# 获取name对应值的类型

Python 相关文章推荐
Python中集合类型(set)学习小结
Jan 28 Python
Python正则表达式匹配HTML页面编码
Apr 08 Python
python读写json文件的简单实现
Apr 11 Python
解决tensorflow1.x版本加载saver.restore目录报错的问题
Jul 26 Python
python2和python3的输入和输出区别介绍
Nov 20 Python
Python 最大概率法进行汉语切分的方法
Dec 14 Python
详解Python字典的操作
Mar 04 Python
详解【python】str与json类型转换
Apr 29 Python
Python 绘制酷炫的三维图步骤详解
Jul 12 Python
使用python 的matplotlib 画轨道实例
Jan 19 Python
python 读取二进制 显示图片案例
Apr 24 Python
Django与pyecharts结合的实例代码
May 13 Python
目前最全的python的就业方向
Jun 05 #Python
python多进程提取处理大量文本的关键词方法
Jun 05 #Python
使用python进行文本预处理和提取特征的实例
Jun 05 #Python
python 用正则表达式筛选文本信息的实例
Jun 05 #Python
python和shell获取文本内容的方法
Jun 05 #Python
python 查找文件名包含指定字符串的方法
Jun 05 #Python
Python使用爬虫爬取静态网页图片的方法详解
Jun 05 #Python
You might like
PHP5多态性与动态绑定介绍
2015/04/03 PHP
php正则替换处理HTML页面的方法
2015/06/17 PHP
启用Csrf后POST数据时出现的400错误
2015/07/05 PHP
javascript语句中的CDATA标签的意义
2007/05/09 Javascript
javascript控制Div层透明属性由浅变深由深变浅逐渐显示
2013/11/12 Javascript
qq悬浮代码(兼容各个浏览器)
2014/01/29 Javascript
js对图片base64编码字符串进行解码并输出图像示例
2014/03/17 Javascript
实例讲解jQuery EasyUI tree中state属性慎用
2016/04/01 Javascript
jqGrid 学习笔记整理——进阶篇(一 )
2016/04/17 Javascript
jQuery Mobile框架中的表单组件基础使用教程
2016/05/17 Javascript
微信小程序 icon组件详细及实例代码
2016/10/25 Javascript
JS扩展类,克隆对象与混合类实例分析
2016/11/26 Javascript
简单实现jQuery上传图片显示预览功能
2020/06/29 jQuery
JQuery 又谈ajax局部刷新
2017/11/27 jQuery
vue使用axios上传文件(FormData)的方法
2019/04/14 Javascript
js实现窗口全屏示例详解
2019/09/17 Javascript
vue路由守卫,限制前端页面访问权限的例子
2019/11/11 Javascript
使用PreloadJS加载图片资源的基础方法详解
2020/02/03 Javascript
JavaScript适配器模式原理与用法实例详解
2020/03/09 Javascript
bootstrap-table后端分页功能完整实例
2020/06/01 Javascript
[33:28]完美世界DOTA2联赛PWL S3 PXG vs GXR 第三场 12.19
2020/12/24 DOTA
Python2.x中文乱码问题解决方法
2015/06/02 Python
python Django框架实现自定义表单提交
2016/03/25 Python
Python如何import文件夹下的文件(实现方法)
2017/01/24 Python
Python不使用int()函数把字符串转换为数字的方法
2018/07/09 Python
解决Django删除migrations文件夹中的文件后出现的异常问题
2019/08/31 Python
python 三元运算符使用解析
2019/09/16 Python
python tkinter图形界面代码统计工具
2019/09/18 Python
使用CSS Grid布局实现网格的流动
2014/12/30 HTML / CSS
绢花、人造花和人造花卉:BLOOM
2019/08/07 全球购物
大学生水文观测实习自我鉴定
2013/09/29 职场文书
求职自我评价范文100字
2014/09/23 职场文书
高二学年自我鉴定范文(2篇)
2014/09/26 职场文书
邀请函的格式
2015/01/30 职场文书
闪闪红星观后感
2015/06/08 职场文书
python 网络编程要点总结
2021/06/18 Python