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('登录成功') else: print('密码错误') 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('其他类型不支持!')