Python 分布式缓存之Reids数据类型操作详解


Posted in Python onJune 24, 2020

1、Redis API

1.安装redis模块

$ pip3.8 install redis

2.使用redis模块

import redis

# 连接redis的ip地址/主机名,port,password=None
r = redis.Redis(host="127.0.0.1",port=6379,password="gs123456")

3.redis连接池

redis-py使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。默认,每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数Redis,这样就可以实现多个Redis实例共享一个连接池

总之,当程序创建数据源实例时,系统会一次性创建多个数据库连接,并把这些数据库连接保存在连接池中,当程序需要进行数据库访问时,无需重新新建数据库连接,而是从连接池中取出一个空闲的数据库连接

import redis
# 创建连接池,将连接保存在连接池中
pool = redis.ConnectionPool(host="127.0.0.1",port=6379,password="gs123456",max_connections=10)

# 创建一个redis实例,并使用连接池"pool"
r = redis.Redis(connection_pool=pool)

2、String 操作

redis中的String在内存中按照一个name对应一个value来存储。如图:

Python 分布式缓存之Reids数据类型操作详解

1. set 为name设置值

# 在Redis中设置值,默认,不存在则创建,存在则修改
set(name, value, ex=None, px=None, nx=False, xx=False, keepttl=False)

name:设置键
value:设置值
ex:设置过期时间(秒级)
px:设置过期时间(毫秒)
nx:如果设置为True,则只有name不存在时,当前set操作才执行,同setnx(name, value)
xx:如果设置为True,则只有name存在时,当前set操作才执行

set用法:

r.set("name1","jack",ex=3600)
r.set("name2","xander",xx=36000)

setnx用法:

# 设置值,只有name不存在时,执行设置操作(添加)
setnx(name, value)

setex用法:

# 设置值,参数:time -->过期时间(数字秒 或 timedelta对象)
setex(name, value, time)

psetex用法:

# 设置值,参数:time_ms,过期时间(数字毫秒 或 timedelta对象)
psetex(name, time_ms, value)

2. get 获取name的值

# 根据key获取值
get(name)

r.get("foo")

3. mset 批量设置name的值:

mset(mapping)

data = {
  "k1":"v1",
  "k2":"v2",
}
r.mset(data)

4. Mget 批量获取name的值

# 批量获取值,根据多key获取多个值
mgets(mapping)

# 方法一
r.mget("k1","k2")

# 方法二
data = ["k1","k2"]
r.mget(data)

# 方法三
data = ("k1","k2")
r.mget(data)

5. getset 设置新值并获取原来的值

getset(name, value)

r.set("foo", "xoo")
ret = r.getset("foo", "yoo")
print(ret) # b'xoo'

6. append 为name原有值后追加内容

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

r.set("name","jack")
r.append("name","-m")
ret = r.get("name")
print(ret) # b'jack-m'

7. strlen 返回name的值字节长度:

# 返回字符串的长度,当name不存在时返回0
strlen(name)

r.set("name","jack-")
ret = r.strlen("name")
print(ret) # 5

8. incr 为name整数累加值

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

r.incr('mount')
r.incr('mount')
r.incr('mount', amount=3)
ret = r.get('mount')
print(ret)		# b'5'

3、Hash 操作

hash表现形式上有些像pyhton中的dict,可以存储一组关联性较强的数据 ,redis中Hash在内存中的存储格式如下图:

Python 分布式缓存之Reids数据类型操作详解

1. hset 为name设置单个键值对

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

name:设置name
key:name对应hash中的key(键)
value:name对应的hash中的value(值)

hset用法

# 一次只能设置一个键值对
r.hset("student-jack", "name", "Jack")

2 . hget 获取name单个键值对

# 根据name对应的hash中获取根据key获取value
hget(name,key)

ret = r.hget("student-jack", "name")
print(ret) // b'Jack'

3. hmset 为name设置多个键值对

# mapping中传入字典(不存在,则创建;否则,修改)
hmset(name, mapping):


data = {
  "name": "Jack",
  "age": 20,
  "gender": "M",
}
r.hmset("student-jack", mapping=data)

4. hmget 获取name多个键值对

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

name:指定name
keys:要获取key集合,如:['k1', 'k2', 'k3']
*args:要获取的key,如:k1,k2,k3


# 直接传入需要获取的键
ret = r.hmget("student-jack", "name", "age")
print(ret) # [b'Jack', b'20']

# 列表中指定需要获取的键
data = ["name", "age"]
ret = r.hmget("student-jack", data)
print(ret) # [b'Jack', b'20']

5. hgetall 获取name的键值对

# 根据name获取hash的所有值
hgetall(name)

ret = r.hgetall("student-jack")
print(ret)  # {b'name': b'Jack', b'age': b'20', b'gender': b'M'}

6、hlen 获取name中的键值对个数

# 根据name获取hash中键值对的总个数
hlen(name)

ret = r.hlen("student-jack")
print(ret) # 3 , 3个键值对

7. hkeys 获取name中键值对所有key

# 获取name里键值对的key
hkeys(name)

ret = r.hkeys('student-jack')
print(ret) # [b'name', b'age', b'gender']

8. hvals 获取name中键值对所有value

# 获取name里键值对的value
hvals(name)

ret = r.hvals('student-jack')
print(ret) # [b'Jack', b'20', b'M']

9. hkeys 检查name里的键值对是否有对应的key

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

# 返回布尔值
ret = r.hexists('student-jack', 'name')
print(ret)	# True

10. hincrby 从name里的键值对设置自增值

1.整数自增:

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

name:设置键
key:hash对应的key
amount:自增数(整数)


ret = r.hincrby('student-jack', 'age')
ret = r.hincrby('student-jack', 'age')
print(ret)		# 22

2.浮点自增

# 自增name对应的hash中的指定key的值,不存在则创建key=amount
hincrbyfloat(name, key, amount=1.0)

name:设置键
key:hash对应的key
amount:自增数(浮点数)

11. hdel 根据name从键值对中删除指定key

# 根据name将对应hash中指定的key键值对删除
hdel(name,*keys)


r.hdel("info",*("m-k1","m-k2"))

4、List 操作

List操作,redis中的List在内存中按照一个name对应一个List来存储。如图: 

Python 分布式缓存之Reids数据类型操作详解

1. lpush 为name添加元素,每个新的元素都添加到列表的最左边

# name对应的list中添加元素
lpush(name,values)


# 直接指定多个元素
r.lpush("names", "Jack", "Alex", "Eric")

# 将需要添加的元素添加到元组
data = ("Jack", "Alex", "Eric")
r.rpush("names", *data)

# 将需要添加的元素添加到列表
data = ["Jack", "Alex", "Eric"]
r.rpush("names", *data)

Note:列表类型中的值统称元素

2. rpush 为name添加元素,每个新的元素都添加到列表的最右边

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

3. lpushx 为name添加元素,只有当name已存在时,将元素添加至列表最左边

lpushx(name,value)

4. rpushx 同上,将元素添加至列表最右边

rpushx(name, values)

5. llen 统计name中list的元素个数

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

ret = r.llen('names')
print(ret) # 3, 该list中有3个元素

6. linsert 为name中list的某一个值或后 插入一个新的值

# 在name对应的列表的某一个值前或后插入一个新值
linsert(name, where, refvalue, value)

name:设置name
where:BEFORE或AFTER
refvalue:标杆值,即:在它前后插入数据
value:要插入的数据


// 在Alex值前插入一个值(BEFORE表示:在...之前)
r.linsert('names', 'BEFORE', 'Jack', 'Jason')

// 在Jack后插入一个值(AFTER表示:在...之后)
r.linsert('names', 'AFTER', 'Jack', 'Xander')

7. lset 为name中list的某一个索引位置的元素重新赋值

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

name:设置name
index:list的索引位置
value:要设置的值

// 将索引为1的元素修改为Gigi
r.lset('names', 1, 'Gigi')

8. lrem 移除name里对应list的元素

# 在name对应的list中删除指定的值
lrem(name, count, value)

name:设置name
value:要删除的值
count:count=0,删除列表中的指定值;
    count=2,从前到后,删除2个;
    count=-2,从后向前,删除2个

r.lrem('names', count=2, value='Xander')

9. lpop 从name里的list获取最左侧的第一个元素,并在列表中移除,返回值是则是第一个元素

lpop(name)

ret = r.lpop('names')
print(ret)		# b'Jason'

10. rpop 同上,从右侧获取第一个元素

rpop(name)

11. lindex 在name对应的列表 根据索引获取元素

# 在name对应的列表中根据索引获取列表元素
lindex(name, index)

ret = r.lindex('names', 0)
print(ret)	# b'Gigi'

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

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

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

13. lrange 在name对应的列表 根据索引获取数据

# 在name对应的列表分片获取数据
lrange(name, start, end)

name:设置name
start:索引的起始位置
end:索引结束位置

// 先添加点元素
data = ['Jack', 'Eric', 'Koko', 'Jason', 'Alie']
r.rpush('names', *data)

// 获取列表所有元素
ret = r.lrange('names', 0, -1)
print(ret) # [b'Gigi', b'Alex', b'Jack', b'Eric', b'Koko', b'Jason', b'Alie']

// 获取列表索引2-5的元素(包含2和5,即 2 3 4 5)
ret = r.lrange('names', 2, 5)
print(ret)	# [b'Jack', b'Eric', b'Koko', b'Jason']

// 获取列表的最后一个元素
ret = r.lrange('names', -1, -1)
print(ret)  # [b'Alie']

到此这篇关于Python 分布式缓存之Reids数据类型操作详解的文章就介绍到这了,更多相关Python Reids数据类型操作内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python实现的简单发送邮件脚本分享
Nov 07 Python
Python构造自定义方法来美化字典结构输出的示例
Jun 16 Python
Python正则表达式实现截取成对括号的方法
Jan 06 Python
python enumerate函数的使用方法总结
Nov 15 Python
tensorflow识别自己手写数字
Mar 14 Python
使用python装饰器计算函数运行时间的实例
Apr 21 Python
Python3实现的字典、列表和json对象互转功能示例
May 22 Python
python用fsolve、leastsq对非线性方程组求解
Dec 15 Python
python使用sklearn实现决策树的方法示例
Sep 12 Python
Python读取csv文件实例解析
Dec 30 Python
python实现梯度下降和逻辑回归
Mar 24 Python
Prometheus开发中间件Exporter过程详解
Nov 30 Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
Jun 24 #Python
Pytorch实现将模型的所有参数的梯度清0
Jun 24 #Python
你需要学会的8个Python列表技巧
Jun 24 #Python
pytorch实现查看当前学习率
Jun 24 #Python
在pytorch中动态调整优化器的学习率方式
Jun 24 #Python
CentOS 7如何实现定时执行python脚本
Jun 24 #Python
python tkiner实现 一个小小的图片翻页功能的示例代码
Jun 24 #Python
You might like
咖啡历史、消费和行业趋势
2021/03/03 咖啡文化
NOD32 v2.70.32 简体中文封装版 提供下载了
2007/02/27 PHP
PHP面向对象之事务脚本模式(详解)
2017/06/07 PHP
关于 Laravel Redis 多个进程同时取队列问题详解
2017/12/25 PHP
javascript十个最常用的自定义函数(中文版)
2009/09/07 Javascript
浅谈javascript中的作用域
2012/04/07 Javascript
jQuery向上遍历DOM树之parents(),parent(),closest()之间的区别
2013/12/02 Javascript
javascript中不等于的代码是什么怎么写
2013/12/29 Javascript
jquery实现右键菜单插件
2015/03/29 Javascript
JS实现页面载入时随机显示图片效果
2016/09/07 Javascript
Bootstrap轮播图的使用和理解4
2016/12/14 Javascript
node.js程序作为服务并在windows下开机自启动(用forever)
2017/03/29 Javascript
浅谈Vue父子组件和非父子组件传值问题
2017/08/22 Javascript
jQuery zTree搜索-关键字查询 递归无限层功能实现代码
2018/01/25 jQuery
JS深入学习之数组对象排序操作示例
2020/05/01 Javascript
vue项目打包后请求地址错误/打包后跨域操作
2020/11/04 Javascript
vue 判断两个时间插件结束时间必选大于开始时间的代码
2020/11/04 Javascript
[01:05:52]DOTA2-DPC中国联赛 正赛 Ehome vs Aster BO3 第一场 2月2日
2021/03/11 DOTA
Python天气预报采集器实现代码(网页爬虫)
2012/10/07 Python
python编码最佳实践之总结
2016/02/14 Python
Python实现基本数据结构中队列的操作方法示例
2017/12/04 Python
对Python3中列表乘以某一个数的示例详解
2019/07/20 Python
python实现的批量分析xml标签中各个类别个数功能示例
2019/12/30 Python
Python装饰器实现方法及应用场景详解
2020/03/26 Python
keras的ImageDataGenerator和flow()的用法说明
2020/07/03 Python
Python3安装模块报错Microsoft Visual C++ 14.0 is required的解决方法
2020/07/28 Python
CSS3中的clip-path使用攻略
2015/08/03 HTML / CSS
日本动漫周边服饰销售网站:Atsuko
2019/12/16 全球购物
航空大学应届生求职信
2013/11/10 职场文书
理工类毕业自我鉴定
2014/02/20 职场文书
战友聚会策划方案
2014/06/13 职场文书
市级三好学生事迹材料
2014/08/27 职场文书
2015年世界艾滋病日活动总结
2015/03/24 职场文书
2016读书月活动心得体会
2016/01/14 职场文书
Nginx代理同域名前后端分离项目的完整步骤
2021/03/31 Servers
Python 文字识别
2022/05/11 Python