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('其他类型不支持!')

 

posted @ 2019-07-03 15:21  4jd121de2gf4e2sa5d  阅读(483)  评论(0编辑  收藏  举报