• python -第七节课之redis操作


    数据库分为两种类型,一种是关系型数据库 mysql oracle sqlserver sqlite   这种数据库需要建表 有校验 速度比较慢 现在大数据时代  mysql 数据放到硬盘里 

    一种是非关系型数据库  nosql  没有sql语句只有key value   没有表没有sql 语句速度比较快,有数据往里面塞就行拉 

    redis 就是个非关系型数据库 数据存在内存里,一般用来做缓存,每秒支持十万个数据

    自动化时候有些数据需要去缓存里面去取 

    redis默认有十六个数据库

     

    连接成功redis就要进行redis的操作了 

     当redis获取数据显示有b的类型时候就是bytes字节类型,需要转化成字符串类型

    转换有两种方法

    第一种方法 

    r.set('你好','{"nihao":"shuaige"}')#插数据
    data = r.get('你好').decode()#获取数据
    第二种方法
    r = redis.Redis(host='118.24.3.40',
    password='Hxxxx*',
    port=6379,
    db=14,
    decode_responses=True  
    )

    第二种方法在连接时候加decode_responses=True   ,这时候就会将bytes类型转化成字符串类型

     反转将字符串转成bytes类型也可以这样操作

    s='ces你好'
    print(s.encode())

    redis 也支持设置一个key他的有效期也就是过期时间是多少时间 这是为了设置session用的
    redis里面ttl是-1代表永久生效
    time=60*60*24
    r.set('session','xxxxassdaasd',time)#传一个sessoin 和内容,后面加一个过期时间的操作
    时间一到key就会从内存里面消失不在了,以上讲的是redis string类型的操作
    r.set('session','xxxxassdaasd',time,5)#传一个sessoin 和内容,后面加一个参数代表过期时间的操作,如果再传一个参数就是过期时间
    #到了时间之后key就会在内存里消失
    总结string方法的增删改查

    r.set('矿泉水','{"price":111,"count":11}') 增加
    r.delete('矿泉水') 删除
    r.set('矿泉水','xxxx')修改
    data = r.get('你好').decode()#查
    r.set('session','xxxxassdaasd',time,5)设置过期时间
    #传一个sessoin 和内容,后面加一个过期时间的操作,如果再传一个参数就是过期时间
    下面讲哈希类型的增删改查
    r.hset('stude','fd','{"ces":"dsass"}')#哈希类型的增加
    r.hdel('stude')删除操作
    r.delete('stude')#删除操作
    r.hset()修改操作
    r.expire('stude',10)#指定某个key的过期时间
    r.hget('stude')获取数据

    set 是k/v 格式
    hset是 name k v格式
    set和hset不能改k改key 需要rename 修改 都能改value字典形式的key和value

    print(r.hget('stude','fd'))#获取大key里面的单个key
    print(r.hgetall('stude'))#获取大key里面的所有内容
    获取后的也是bytes类型
    实际场景
    如果金融产品需要分红,需要把每天的数据推送过来,放到redis里面,但是redis这个机子要被回收了,回收了要把这些数据存起来,要解析redis存到mysql里面
    这个时候要怎么把数据处理放到表里呢

    第一步redis里面是一个字典,是bytes类型,key和value都是bytes类型要先转成字典
    print(r.hget('stude','fd'))#获取大key里面的单个key
    print(r.hgetall('stude'))#获取大key里面的所有内容
    d=r.hgetall('stude')
    new={}#将返回的内容转换成字典
    for k,v in d.items():
    new[k.decode()]=v.decode()
    print(new)

    第二种方法

    r = redis.Redis(host='118.24.3.40',
    password='HK139bc&*',
    port=6379,
    db=14,
    decode_responses=True
    )
    默认就是转换了,返回的数据就不是bytes类型了就自动转换成字符串类型了
     
    #获取数据库当前多少key
    print(r.keys())
    print(r.keys('s*'))#获取s开头相关的key
    print(r.type('stude'))#获取key的类型
    # print(r.flushdb())#清空当前数据库里面的所有Key


    redis的数据迁移之管道操作
    #建立管道意思把这些操作记录下来,会把你的操作统一执行,内存只交互一次,不用管道每次都会交互一次
    # p=r.pipeline()#建立管道
    # p.exists('stude')#检查key是否存在
    # p.hgetall('stude')
    # s=p.execute()#执行管道,返回每一个命令的结果,返回一个List这个list是每个命令执行的结果
    # print(s)
    # print(r.exists('stude'))#检查有几个key
    #建立管道意思把这些操作记录下来,会把你的操作统一执行,内存只交互一次,不用管道每次都会交互一次
    start=time.time()#使用set的时间
    for i in range(1000):
    r.set('key%s'%i,'%s'%i)
    print(time.time()-start)

    start=time.time() #使用管道的时间
    p=r.pipeline()
    for i in range(1000):
    p.set('key%s'%i,'%s'%i)
    p.execute()#执行管道,返回每一个命令的结果,返回一个List这个list是每个命令执行的结果
    print(time.time()-start)
    结果是管道的时候比平时set的时间快
    r.set('ces:ceses','nihao')#如果加多层文件
    r.hset('cess:cesesss','zxx','121')#哈希必须是三个类型,字符串可以是两个类型

    如果你a服务器装了一个redis,这时候a服务器的机子要迁移要将a服务器的数据迁移到b服务器如何操作呢?

    #从a里判断所有key判断是哈希还是字符串类型
    p=r1.pipeline()#创建管道
    for k in r.keys():#循环a里面的所有key
    key_type=r.type(k)#判断类型
    if key_type=='string':#字符串类型的操作,写进去通过管道
    value=r.get(k)
    p.set(k,value)
    elif key_type=='hash':
    hash_data=r.hgetall(k)#获取哈希类型的key key value
    for filed,data in hash_data.items(): #循环哈希的小字典
    p.hset(k,filed,data)#写进去p2
    p.execute()#执行管道,一起往里塞


  • 相关阅读:
    Django学习:博客分类统计(14)
    Django学习:上下篇博客和按日期分类(13)
    Django学习:分页优化(12)
    Django学习:shell命令行模式以及分页(11)
    Django学习:博客页面的响应式布局(10)
    Django学习:响应式导航条(9)
    八、Django学习:使用css美化页面
    七、Django学习:模板嵌套
    js日期使用总结
    Vue 的数据劫持 + 发布订阅
  • 原文地址:https://www.cnblogs.com/weilemeizi/p/13683340.html
Copyright © 2020-2023  润新知