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被其它事务并发修改,则本次事务提交无效
  • Python中执行事务
    • API
      • pipe = client.pipiline()
        • 创建事务管道
      • pipe.watch(‘a’, ‘b’, ‘c’)
        • 监控要保障【并发安全】的数据
      • pipe.multi()
        • 开启事务
      • CRUD…
      • except WatchError as we:…
        • 被监控的数据被其它事务所修改时执行
      • pipe.reset()
        • 清空管道内容
      • pipe.execute()
        • 提交事务
'''
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】,拉你进群,大家一起交流学习。
如果文章对您有帮助,请我喝杯咖啡吧!

公众号

公众号

关注我,我们一起成长~~

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东木月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值