zoukankan      html  css  js  c++  java
  • python:redis操作、redis 迁移

    一、数据库:

    数据库分为关系型、非关系型(No sql)

    关系型:mysql、Oracal

      1.要用sql查询、各个表之间有联系

      2.速度相较于非关系型的数据库较慢

    非关系型:例如mangoDB、redis、memcache

      1.不适用sql查询

      2.存值方式是  key=value的格式,且不限制数据类型

      3.速度快

    redis:数据存在内存中,支持每秒10万次读写,容量取决于服务器内存大小

    缺点:服务器挂了或者重启,就没有了

    适用频繁的数据库可以放在redis中,由于重启就没有了,一般作为缓存数据库

    二、redis数据库操作:

    1.连接redis:                     

    import redis
    r=redis.Redis(host='128.14.3.40',password='HK1bc&*',db=1,decode_responses=True)#db默认是0  ,写的数据库如果不存在,会自动创建。但是不能大于配置文件中设置的库的总数
    # 默认获取的数据类型是bytes,加了decode_responses=True ,获取到的数据就不是二进制了,是字符串
    redis中string类型操作:
    # TTL:代表失效时间,失效时间到了,就在redis中消失了  ttl=-1时 ,就是永久有效,除非redis重启

    string类型操作

    2、插入数据

    #1、插入数据:set()
    r.set('xiaoming','11') #插入、修改数据,key,value
    r.set('baibai','haha',30)#第三个单位为指定的是失效时间,单位是S
    r.set('hm:hmin','12346')#有冒号,显示的时候会有一个文件夹。同个文件夹开头的都会放在一个文件夹下。但是在get的时候也要写'hm:hmin'
    r.set('hm:xiaobai','345678')
    r.set('hm:xiaohei:xiao','345678')   #多个冒号有多个文件夹

    3、获取数据:

    print(r.get('nick')) #传key名,获取value.返回的的是bytes类型
    print(r.get('nick').decode())#转成字符串
    print(r.keys())#索取当前库中所有的key,key什么都不传就是获取所有的
    print(r.keys('xx*'))  #获取以XX开头的  *xx*:包含,xx*:以xx开头, ,*xx以xx结尾
    print(r.exists('jjjj'))   #判断key 是否存在,返回1,或0 ,1存在,0不存在

    4.删除数据

    r.delete('key')  #传key名,删除对应的key
    r.flushdb()   #清除当前库中的所有key
    r.flushall() #清空所有数据库中的所有key

    5.注册、登录练习:

    (1)注册用户,输入用户名、密码。密码要求密文。注册后存在redis中。

    (2)登录,账号密码存在且正确才能登录。

    import hashlib  #引入加密模块
    def reg():
        #注册
        username=inpurt("输入用户名").strip()
        password=inpurt("输入密码 ").strip()
        if r.get(username):    #如果用户已经存在
            print('用户已存在')
        else:
            m=hashlib.md5(password.encode())
            new_password=m.hexdigest()
            r.set(username,new_password)
            print('注册成功!')
    
    def login():
        #登录
        username = input('username:').strip()
        password = input('password:').strip()
        p=r.get(username)            #获取密码
        if p:
           m=hashlib.md5(p.encode()) 
           new_password=m.hexdigest()
           if p ==new_password:
               print('登录成功')
          elseprint('密码错误')
       else:
           print('用户不存在')           

    hash类型操作

    1.hash类型的结构:

    数据结构:Key:key:value cnz={'cnz':{'hm':'12345','hh':'3456'}},同一类型的key 可以放在一个大key里面

    2.插入数据:

    r.hset('cnzUser','hanm','123456')#hset()插入数据:(外边的key,里面的key,value)。不能在后边直接加过期时间
    r.hset('cnzUser','hn','123456')    #存在就修改,不存在就增加
    print(r.hmset('cnzUser',{'guoya':'12345','hn':'4567890'}))     #批量往大key中加 Key,value
    #设置过期时间:
    r.expire('cnzUser',60)   #传key名,和失效时间。对string类型也有效
    #获取或插入数据时看清数据类型。

    3、删除数据

    r.hdel('cnzUser','hn')   #删除cnzUser中hn小key
    r.delete('cnzUser')             #删除外边的大key

    4.获取数据

    print(r.hget('cnzUser','hn'))  #获取数据:(大key,小key)
    print(r.hgetall('cnzUser'))    #获取大Key所有的Key,value。字典类型

    5.查看类型

    print(r.type('cnzUser'))    #type()查看类型
    print(r.type('xx_:1:xiaohei'))

    #redis当内存满了,会自动删除不常用的数据

     三、redis迁移

    # a redis ---> b redis
    #1.链接a,b redis
    #从a中获取所有key
    #从a中取到key的values
    #set到b redis中

    import redis
    
    a = redis.Redis(host='128.14.3.220',password='HK449bc&*',
                    db=15,decode_responses=True) #0-16
    b = redis.Redis(host='128.14.3.220',password='HK449bc&*',
                    db=10,decode_responses=True) #0-16
    
    for k in a.keys():   #循环取每条数据,并判断类型
        if a.type(k)=='string':
            value=a.get(k)
            b.set(k,value)
        elif b.type(k)=='hash':
            all_data=a.hgetall(k)   #获取大Key下的所有数据
            b.hmset(k,all_data) #  批量插入
        else:
            print('其他类型不支持!')
  • 相关阅读:
    Glide只播放一次Gif以及监听播放完成的实现方案
    Android 插件化开发(四):插件化实现方案
    Android 插件化开发(三):资源插件化
    Android 插件化开发(二):加载外部Dex文件
    Android 插件化开发(一):Java 反射技术介绍
    Android框架式编程之架构方案
    Android 项目优化(六):项目开发时优化技巧总结
    Android 项目优化(五):应用启动优化
    Android 项目优化(四):内存优化
    Android 项目优化(三):MultiDex 优化
  • 原文地址:https://www.cnblogs.com/hancece/p/11126662.html
Copyright © 2011-2022 走看看