python使用redis缓存数据库

Redis

 

Windows下直接解压可用,连接:https://pan.baidu.com/s/1rD4ujoN7h96TtHSu3sN_hA 密码:t02credis

1、简介

  • redis是一种高速高性能的内存数据库,存储的是键值对数据;
  • 因为极高的存储和访问速度,redis常被用来做为数据缓存服务器;
  • 另外redis是支持数据持久化的(即redis会自动将数据写入磁盘)——这是redis大杀四方的重要缘由;
  • redis支持多个slave端同时向master端进行写入,这常常被用在分布式爬虫等场景中;
  • 2010年之后redis开始大面积流行,关系型数据库(核心数据)+redis(缓存)是常规的、常见的数据解决方案;

1 Redis的数据类型

  • 字符串string
    • 单个值最大512M
  • 哈希hash
    • 用于存储对象
  • 列表list
  • 集合set
  • 有序集合zset

2、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 // 测试服务端链接状态

3、Redis数据基本操做

一、 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)

二、 字符串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 //获取值长度

三、 哈希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的长度

四、 列表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的元素

五、 集合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中的元素

六、 有序集合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中的权重

4、图形界面客户端

连接:https://pan.baidu.com/s/1Ndt61mEK2IFIugUkfdlzuw 密码:q8i5数据库

这里写图片描述

5、与Python的交互

方法一:
模块引入参考
中的安装第三方模块windows

方法二:缓存

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!

6、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>>>
事务已提交

 

公众号

相关文章
相关标签/搜索