python使用redis缓存数据库
Redis
关注公众号“轻松学编程”了解更多。
Windows下直接解压可用,链接:https://pan.baidu.com/s/1rD4ujoN7h96TtHSu3sN_hA 密码:t02c
一、简介
- redis是一种高速高性能的内存数据库,存储的是键值对数据;
- 由于极高的存储和访问速度,redis常被用来作为数据缓存服务器;
- 另外redis是支持数据持久化的(即redis会自动将数据写入磁盘)——这是redis大杀四方的重要原因;
- redis支持多个slave端同时向master端进行写入,这经常被用在分布式爬虫等场景中;
- 2010年以后redis开始大面积流行,关系型数据库(核心数据)+redis(缓存)是常规的、常见的数据解决方案;
1 Redis的数据类型
- 字符串string
- 单个值最大512M
- 哈希hash
- 用于存储对象
- 列表list
- 集合set
- 有序集合zset
二、Redis管理基本操作
- redis-server.exe redis.windows.conf // 使用配置启动redis服务
- redis-cli.exe // 打开客户端
- redis-cli --help // 查看客户端帮助
- redis-cli -h 127.0.0.1 -p 6379 -a 123456 // 使用密码访问远程redis
- redis-cli --stat -a 123456 // 查看服务状态
- help @xxx // 分类帮助信息
- help @connection
- select 15 // 选择最后一个数据库(共提供16个数据库)
- quit // 退出客户端
- help @server
- flushdb //清空当前库数据,谨慎使用
- flushall // 清空所有数据库,谨慎使用
- monitor // 监视服务端收到的信息
- auth 123456 // 使用密码登录
- ping // 测试服务端连接状态
三、Redis数据基本操作
1、 key
- keys * //显示所有键,慎用,数据量大时导致卡死
- keys a* // 显示所有以a开头的键
- exists name age //判断name和age这两个键存在几个
- type name //查看值的类型
- del name age //删除键
- expire name 30 //name键值30秒过期
- ttl name //查看键值的过期时间
- persist name // 取消键的过期时间
- rename name nickname // 重命名键(这样做不安全,容易覆盖已有数据)
- renamenx name nickname // 确保不会覆盖其它键才重命名(nx=not exists,x后缀=exists)
2、 字符串string
- 设置
- set name bill //设置键值
- setex name 20 bill //键值20秒后过期
- mset age 60 gender male //一次性存储多个键值
- 获取
- get name //不存在则返回null
- mget name age //一次性拿取多个键值
- 运算
- incr/decr age //将age加减1
- incrby/decrby age 20 //将age加减20
- 其它
- append name gates //向原有value拼接字符串,不存在时等同于set
- strlen key //获取值长度
3、 哈希hash
- hset p1 name bill // 设置p1对象的name为bill
- hset p1 age 18 // 设置p1对象的age为18
- hmset p2 name jobs age -1 //设置p2对象的name为jobs,age为-1
- hget p1 name // 获取p1的name属性值
- hmget p1 name age // 同时获取p1的name和age
- hgetall p1 // 获取p1的全部键值
- hkeys p1 // 获取p1的全部键
- hvals p1 // 获取p1的全部值
- hlen p1 // 获取p1中所有字段的数量
- hexists p1 name // 判断p1中是否有name字段
- hdel p1 name // 删除p1中的name字段
- hdel p2 name age // 删除p2中的name和age字段
- hstrlen p1 age // p1中的age的长度
4、 列表list
- lpush mlist 2 // 从左侧向列表mlist追加元素2
- rpush mlist 3 // 从右侧向列表mlist追加元素3
- linsert mlist after 3 4 // 在列表mlist中3的后边追加元素4
- lset mlist 1 200 // 设置列表mlist中的第1个元素为200(下标从0开始)
- lrange mlist 0 3 // 查看列表mlist中下标[0到3]的元素
- lrange mlist 0 -1 //从头看到尾
- lpop mlist // 从列表左侧弹出一个值
- rpop mlist // 从列表右侧弹出一个值
- ltrim mlist 0 1 // 修剪掉mlist下标[0,1]以外的元素
- llen mlist // 列表元素个数
- lindex mlist 0 // 获取mlist中下标0的元素
5、 集合set
- sadd mset 1 2 3 4 // 向集合mset中添加元素1,2,3,4
- smembers mset // 查看集合mset中的元素
- scard mset // 查询集合元素个数
- sinter mset mset2 //求mset和mset2的交集
- sunion mset mset2 // 求mset和mset2的并集
- sdiff mset mset2 //求mset相比mset2的差集(mset有而mset2无的部分)
- sismember mset 3 //判断3是否是mset中的元素
6、 有序集合zset
- zadd mzset 10 bill 9 jobs 6 jackma // 添加多个值及相应权重
- zrange mzset 0 -1 // 返回第一个到最后一个之间所有的元素,按权重升序排列
- zcard mzset // 元素个数
- zcount mzset 6 10 // 下标6-10之间的元素个数
- zscore mzset jackma // 返回 jackma在mzset中的权重
四、图形界面客户端
链接:https://pan.baidu.com/s/1Ndt61mEK2IFIugUkfdlzuw 密码:q8i5
五、与Python的交互
方法一:
模块引入参考
中的安装第三方模块
方法二:
pip install redis
模块名称:redis。
- rClient = redis.Redis(…)
- host,port
- db
- password
- …
- rClient.set(‘name’,‘bill’)
import redis
client = redis.Redis(
host='localhost',
port=6379,
db=5,
password='123456'
)
ret = client.set("name", "bill")
print(client.get('name'))#b'bill'
print(ret, type(ret))#True <class 'bool'>
client.mset({'age': 60, 'gender': 'male'})
print(client.mget('name', 'age', 'gender'))#[b'bill', b'60', b'male']
client.hmset("p1", {'name': 'jobs', 'age': -1, 'gender': 'male'})
print(client.hgetall('p1'))#{b'name': b'jobs',
b'age': b'-1',
b'gender': b'male'}
client.lpush('mlist', 2, 3, 4)
print(client.lrange('mlist', 0, -1))#[b'4', b'3', b'2']
client.sadd('mset', 'bill', 'steve', '被KO的艺龙')
print(client.smembers('mset'))#{b'steve',
b'\xe8\xa2\xabKO\xe7\x9a\x84\xe8\x89\xba\xe9\xbe\x99',
b'bill'}
client.zadd('mzset', 'bill', 10, 'steve', 11, jack=8)
print(client.zrange('mzset',0,-1))#[b'jack', b'bill', b'steve']
print('GAME OVER!')
输出:
Connected to pydev debugger (build 173.4674.54)
b'bill'
True <class 'bool'>
[b'bill', b'60', b'male']
{b'name': b'jobs', b'age': b'-1', b'gender': b'male'}
[b'4', b'3', b'2']
{b'bill', b'\xe8\xa2\xabKO\xe7\x9a\x84\xe8\x89\xba\xe9\xbe\x99', b'steve'}
[b'jack', b'bill', b'steve']
GAME OVER!
六、redis事务
- redis支持事务的方式
- 将批量数据操作逐个加入队列
- 如果批量操作过程中发生异常,不提交事务即可
- 提交事务,执行队列中的所有操作,并保证其原子性
- 注意事项
- 数据操作在加入队列时不会进行语法检查
- 如果数据操作存在语法错误,会造成只有部分数据提交的BUG
- 此时redis也并不支持事务回滚
- 处处拍摄快照会导致效率的下降
- 所以语法错误必须在上线前自行完成检查和修正
- 主要事务操作
- 监控要保障【并发安全】的数据
- 开启事务
- 提交事务
- 如果被监控的数据发生了并发修改,则提交不成功
- 命令行执行事务
- WATCH key1 key2 key3
- 观察本次事务要修改的key,如果该key在事务执行过程中被其它事务修改,则当前事务提交不能成功
- 目的:保证并发安全
- multi
- 开启事务
- 执行具体事务操作(增删改查)
- 这些操作会被加入队列
- exec
- 提交事务,如果观察的key被其它事务并发修改,则本次事务提交无效
- WATCH key1 key2 key3
- Python中执行事务
- API
- pipe = client.pipiline()
- 创建事务管道
- pipe.watch(‘a’, ‘b’, ‘c’)
- 监控要保障【并发安全】的数据
- pipe.multi()
- 开启事务
- CRUD…
- except WatchError as we:…
- 被监控的数据被其它事务所修改时执行
- pipe.reset()
- 清空管道内容
- pipe.execute()
- 提交事务
- pipe = client.pipiline()
- API
'''
redis事务
·redis事务机制保证【正确事务代码】的原子性(全部执行或全部放弃)
·对于语法错误的代码,redis不支持异常和回滚
·redis的态度:语法错误应该在上线之前自行发现并修正
'''
import redis
txClient = redis.Redis(
host='localhost',
port=6379,
db=7,
password='123456' )
pipe = txClient.pipeline(transaction=True)
try:
pipe.watch('who', 'a', 'b', 'c')
pipe.multi()
pipe.set('who', 'leijun', ex=60 * 5)
print(pipe.get('who'))
pipe.hmset('p1', {'who': 'leijun', 'age': 50, 'word': 'are you ok'})
print(pipe.hgetall('p1')) # print(5 / 0)
# 普通业务异常,被try所捕获,事务不会提交
# pipe.incr("p1")
# redis语法错误,只有提交时才会发生异常且无法回滚,必须在上线前予以修正
pipe.incr('a')
pipe.incr('b')
pipe.incr('c')
except WatchError as we:
pipe.reset()#清空管道
print('监控数据被外界污染,事务已取消!we=',we)
except Exception as e:
print("bad luck:e=", e)
print('事务未提交')
else:
try:
pipe.execute()
print('事务已提交')
except Exception as e:
print('事务提交异常,请检查代码语法!e=',e)
输出:
Connected to pydev debugger (build 173.4674.54)
Pipeline<ConnectionPool<Connection<host=localhost,port=6379,db=7>>>
Pipeline<ConnectionPool<Connection<host=localhost,port=6379,db=7>>>
事务已提交
后记
【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。
也可加我微信【1257309054】,拉你进群,大家一起交流学习。
如果文章对您有帮助,请我喝杯咖啡吧!
公众号
关注我,我们一起成长~~
python使用redis缓存数据库的更多相关文章
- 第三百节,python操作redis缓存-其他常用操作,用于操作redis里的数据name,不论什么数据类型
python操作redis缓存-其他常用操作,用于操作redis里的数据name,不论什么数据类型 delete(*names)根据删除redis中的任意数据类型 #!/usr/bin/env pyt ...
- 快速搭建Redis缓存数据库
之前一篇随笔——Redis安装及主从配置已经详细的介绍过Redis的安装于配置.本文要讲的是如何在已经安装过Redis的机器上快速的创建出一个新的Redis缓存数据库. 一.环境介绍 1) Linux ...
- 第三百零一节,python操作redis缓存-管道、发布订阅
python操作redis缓存-管道.发布订阅 一.管道 redis-py默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作,如果想要在一次请求中指定多个命令,则可以使用pi ...
- 第二百九十九节,python操作redis缓存-SortSet有序集合类型,可以理解为有序列表
python操作redis缓存-SortSet有序集合类型,可以理解为有序列表 有序集合,在集合的基础上,为每元素排序:元素的排序需要根据另外一个值来进行比较,所以,对于有序集合,每一个元素有两个值, ...
- 第二百九十八节,python操作redis缓存-Set集合类型,可以理解为不能有重复元素的列表
python操作redis缓存-Set集合类型,可以理解为不能有重复元素的列表 sadd(name,values)name对应的集合中添加元素 #!/usr/bin/env python # -*- ...
- 第二百九十七节,python操作redis缓存-List类型,可以理解为列表
python操作redis缓存-List类型,可以理解为列表,是可以有重复元素的列表 List操作,redis中的List在在内存中按照一个name对应一个List来存储.如图: lpush(name ...
- 第二百九十六节,python操作redis缓存-Hash哈希类型,可以理解为字典类型
第二百九十六节,python操作redis缓存-Hash哈希类型,可以理解为字典类型 Hash操作,redis中Hash在内存中的存储格式如下图: hset(name, key, value)name ...
- 第二百九十五节,python操作redis缓存-字符串类型
python操作redis缓存-字符串类型 首先要安装redis-py模块 python连接redis方式,有两种连接方式,一种是直接连接,一张是通过连接池连接 注意:以后我们都用的连接池方式连接,直 ...
- python操作Redis缓存
python操作Redis缓存 https://www.cnblogs.com/guotianbao/p/8683037.html 学习资料:电子书资源 联系邮箱:gmu1592618@gmail.c ...
随机推荐
- module(JS模块系统)
JS - module(模块系统) 重新学习ES6 倒数第一章 module 什么是module? 百度的解释 之前接触过AngularJS,现在看Dojo,都有对模块的使用.在dojo官网看到这段文 ...
- 《C++ primer plus》第5章练习题
1.输入两个整数,输出两个整数之间所有整数的和,包括两个整数. #include<iostream> using namespace std; int main() { int num1, ...
- devops-jenkins分布式构建
1. devops-jenkins分布式构建 1) 点击系统管理 进入节点管理 2) 点击新建节点 3) 进行节点配置在node节点服务器配置,进行java的安装 [root@nginx-backup ...
- MeteoInfoLab脚本示例:加载图片和透明图层
MeteoInfoLab的georead函数提供了读取shape文件.image文件(JPG.PNG等,需要有相应的地理定位文件)文件生成图层的功能(事实上shaperead也是同样的功能,不过函数名 ...
- 【C语言入门学习笔记】如何把C语言程序变成可执行文件!
环境 在ANSI的任何一种实现中,存在两种不同的环境. 翻译环境:在这个环境里,源代码被转换为可执行的机器指令. 执行环境:用于实际执行代码. 翻译环境 组成一个程序的每个源文件通过编译过程分别转成目 ...
- scrapy数据写入管道
1 setting里面启动管道 ITEM_PIPELINES = { 'ganji.pipelines.GanjiPipeline': 300,}2 拿到的数据通过yield返回给管道 # -*- c ...
- property和setter装饰器
# property装饰器 # 作用: 将一个get方法转换为对象的属性. 就是 调用方法改为调用对象 # 使用条件: 必须和属性名一样 # setter方法的装饰器: # 作用:将一个set方法转换 ...
- SQL报表语句;SQL获取今日、本周、本月数据
SQL报表语句 SQL获取今日.本周.本月数据 本日:select * from table where datediff(dd,C_CALLTIME,getdate())=0 --C ...
- 反射(Reflection)
Java学习笔记--反射(Reflection) 关于反射 能够分析类能力的程序称之为反射(Reflection) 反射机制可以用来: 在运行时分析类的能力 在运行时检查对象,例如:编写一个适合所有类 ...
- 为C量身定制的Matrix库
Matrix库的诞生让矩阵操作在C中也可以玩的很溜! 项目地址:https://github.com/SJ2050SJ/Matrix 文章目录 Matrix的设计框架 Matrix的上手简历 Matr ...