1、Redis API

1.操作模式

redis-py提供两个类RedisStrictRedis用于实现Redis的命令StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令,Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py

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")

2.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来存储。如图:

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在内存中的存储格式如下图:

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来存储。如图: 

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数据类型操作的更多相关文章

  1. python对缓存(memcached,redis)的操作

    1.Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的 ...

  2. python笔记二:常用数据类型操作

    1.切片:常用于取list或tuple的部分元素的操作 1)l=[1,2,3,4,5,6] l[:3]表示取前3个值,l[1:5]表示1到5个值, L[-3:]从列表最后往前数即最后3个数.... 2 ...

  3. c#实例化继承类,必须对被继承类的程序集做引用 .net core Redis分布式缓存客户端实现逻辑分析及示例demo 数据库笔记之索引和事务 centos 7下安装python 3.6笔记 你大波哥~ C#开源框架(转载) JSON C# Class Generator ---由json字符串生成C#实体类的工具

    c#实例化继承类,必须对被继承类的程序集做引用   0x00 问题 类型“Model.NewModel”在未被引用的程序集中定义.必须添加对程序集“Model, Version=1.0.0.0, Cu ...

  4. Redis-基本概念、java操作redis、springboot整合redis,分布式缓存,分布式session管理等

    NoSQL的引言 Redis数据库相关指令 Redis持久化相关机制 SpringBoot操作Redis Redis分布式缓存实现 Resis中主从复制架构和哨兵机制 Redis集群搭建 Redis实 ...

  5. 缓存数据库-redis数据类型和操作(list)

    转: 狼来的日子里! 奋发博取 缓存数据库-redis数据类型和操作(list) 一:Redis 列表(List) Redis列表是简单的字符串列表,按照插入顺序排序.你可以添加一个元素导列表的头部( ...

  6. 第三百六十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)基本的索引和文档CRUD操作、增、删、改、查

    第三百六十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)基本的索引和文档CRUD操作.增.删.改.查 elasticsearch(搜索引擎)基本的索引 ...

  7. 第三百五十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—将selenium操作谷歌浏览器集成到scrapy中

    第三百五十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—将selenium操作谷歌浏览器集成到scrapy中 1.爬虫文件 dispatcher.connect()信号分发器,第一个参数信 ...

  8. 第三百五十节,Python分布式爬虫打造搜索引擎Scrapy精讲—selenium模块是一个python操作浏览器软件的一个模块,可以实现js动态网页请求

    第三百五十节,Python分布式爬虫打造搜索引擎Scrapy精讲—selenium模块是一个python操作浏览器软件的一个模块,可以实现js动态网页请求 selenium模块 selenium模块为 ...

  9. 四十一 Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)基本的索引和文档CRUD操作、增、删、改、查

    elasticsearch(搜索引擎)基本的索引和文档CRUD操作 也就是基本的索引和文档.增.删.改.查.操作 注意:以下操作都是在kibana里操作的 elasticsearch(搜索引擎)都是基 ...

随机推荐

  1. 电子邮件协议及GO发送QQ邮件

    目录 一.电子邮件的工作机制 1.1 SMTP 1.2 POP3 1.3 IMAP 二.邮件地址 三.MIME信息 四.使用golang发送qq邮件 一.电子邮件的工作机制 提供电子邮件服务的协议叫做 ...

  2. zabbix通过IPMI监控服务器传感器参数

    一.需求:机房dell服务器和IBM服务器皆有主板管理接口iDRAC和iMM,上周已为服务器管理接口配置了ip地址,考虑通过zabbix实现对服务器传感器参数的实时监控.使用DELL-DL1300服务 ...

  3. 【积累】如何优雅关闭SpringBoot Web服务进程

    1.使用ps ef查出进程对应的pid. 2.使用kill -15 pid结束进程. 为什么不使用kill -9 pid,个人理解kill -15 pid更优雅,能在结束进程前执行spring容器清理 ...

  4. Java实现 蓝桥杯VIP 基础练习 分解质因数

    题目介绍 问题描述 求出区间[a,b]中所有整数的质因数分解. 输入格式 输入两个整数a,b. 输出格式 每行输出一个数的分解,形如k=a1a2a3-(a1<=a2<=a3-,k也是从小到 ...

  5. Java实现 蓝桥杯VIP 算法训练 摆动序列

    问题描述 如果一个序列满足下面的性质,我们就将它称为摆动序列: 1. 序列中的所有数都是不大于k的正整数: 2. 序列中至少有两个数. 3. 序列中的数两两不相等: 4. 如果第i – 1个数比第i ...

  6. Java实现 蓝桥杯VIP 算法提高 欧拉函数

    算法提高 欧拉函数 时间限制:1.0s 内存限制:512.0MB 说明 2016.4.5 已更新试题,请重新提交自己的程序. 问题描述 给定一个大于1,不超过2000000的正整数n,输出欧拉函数,p ...

  7. java实现第三届蓝桥杯数据压缩

    数据压缩 某工业监控设备不断发回采样数据.每个数据是一个整数(0到1000之间).各个数据间用空白字符(空格,TAB或回车换行)分隔.这些数据以文本形式被存储在文件中. 因为大多数时候,相邻的采样间隔 ...

  8. java实现第五届蓝桥杯格子放鸡蛋

    格子放鸡蛋 X星球的母鸡很聪明.它们把蛋直接下在一个 N * N 的格子中,每个格子只能容纳一枚鸡蛋.它们有个习惯,要求:每行,每列,以及每个斜线上都不能有超过2个鸡蛋.如果要满足这些要求,母鸡最多能 ...

  9. java实现第七届蓝桥杯压缩变换

    压缩变换 压缩变换 小明最近在研究压缩算法. 他知道,压缩的时候如果能够使得数值很小,就能通过熵编码得到较高的压缩比. 然而,要使数值很小是一个挑战. 最近,小明需要压缩一些正整数的序列,这些序列的特 ...

  10. 体验SpringBoot(2.3)应用制作Docker镜像(官方方案)

    关于<SpringBoot-2.3容器化技术>系列 <SpringBoot-2.3容器化技术>系列,旨在和大家一起学习实践2.3版本带来的最新容器化技术,让咱们的Java应用更 ...