show_you_my_codes 003
program 003
第 0003 题:将 0001 题生成的 200 个激活码(或者优惠券)保存到 Redis 非关系型数据库中。
code
# !/usr/bin/env python
# -*- coding:utf-8 -*-
# Created by Ww2Zero
# Blog: Ww2zero.github.io
########################
# Function description:
# 第 0003 题:将 0001 题生成的 200 个激活码(或者优惠券)保存到 Redis 非关系型数据库中。
########################
import string
import random
import redis
class ACRedis(object):
"""docstring for ACRedis"""
def __init__(self):
self.re = None
self.config = {
'host': 'localhost', 'port': '6379', 'db': '0'
}
``
def connectRedis(self):
self.re = redis.Redis(**self.config)
def InsertDatas(self, key_list):
count = 1
for key in key_list:
self.re.set(count, key)
count += 1
class ActivateCodes(object):
"""
生成激活码
"""
def __init__(self):
# 字典域 由数字和字母(包括大小写)组成
self.FIELD = string.digits + string.letters
self.GENERATE = None
def createCodes(self, codenumber=10, codesize=10):
"""
生成codenumber组随机码,每组生成的码的长度为codesize
"""
def getCode(codesize):
"""
得到codesize位激活码
"""
return "".join(random.sample(self.FIELD, codesize))
self.GENERATE = [getCode(codesize) for i in range(codenumber)]
return True
def saveinRedis(self):
re = ACRedis()
re.connectRedis()
re.InsertDatas(self.GENERATE)
if __name__ == "__main__":
ac = ActivateCodes()
ac.createCodes(200, 30)
ac.saveinRedis()
module
Redis
介绍
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
安装
pip install redia
连接
# -*- coding:utf-8 -*-
import redis
r = redis.Redis(host='192.168.0.1', port=6379,db=0) #普通连接
r.set('name', 'wwzero') #添加
print (r.get('name')) #获取
# -*- coding:utf-8 -*-
import redis
pool = redis.ConnectionPool(host='192.168.0.1', port=6379) # 连接池连接
r = redis.Redis(connection_pool=pool)
r.set('name', 'wwzero') #添加
print (r.get('name')) #获取
操作
#################
set()
#在Redis中设置值,默认不存在则创建,存在则修改
r.set('name', 'wwzero')
'''参数:
set(name, value, ex=None, px=None, nx=False, xx=False)
ex,过期时间(秒)
px,过期时间(毫秒)
nx,如果设置为True,则只有name不存在时,当前set操作才执行,同setnx(name, value)
xx,如果设置为True,则只有name存在时,当前set操作才执行'''
#设置过期时间(秒)
r.setex(name, value, time)
#################
get(name)
#################
mget(keys, *args)
#批量获取
print(r.mget("name1","name2"))
#或
li=["name1","name2"]
print(r.mget(li))
#################
getset(name, value)
#设置新值,打印原值
print(r.getset("name1","wwzero")) #输出:haha
print(r.get("name1")) #输出:wwzero
#################
getrange(key, start, end)
#根据字节获取子序列
r.set("name","wwzero")
print(r.getrange("name",0,1))#输出:ww
#################
setrange(name, offset, value)
#修改字符串内容,从指定字符串索引开始向后替换,如果新值太长时,则向后添加
r.set("name","wwzero")
r.setrange("name",3,"w")
print(r.get("name")) #输出:wwwero
r.setrange("name",6,"zzzzzzz")
print(r.get("name")) #输出:wwwerozzzzzzz
#################
setbit(name, offset, value)
#对二进制表示位进行操作
''' name:redis的name
offset,位的索引(将值对应的ASCII码变换成二进制后再进行索引)
value,值只能是 1 或 0 '''
str="345"
r.set("name",str)
for i in str:
print(i,ord(i),bin(ord(i)))#输出 值、ASCII码中对应的值、对应值转换的二进制
'''
输出:
51 0b110011
52 0b110100
53 0b110101'''
r.setbit("name",6,0)#把第7位改为0,也就是3对应的变成了0b110001
print(r.get("name"))#输出:145
#################
getbit(name, offset)
#获取name对应值的二进制中某位的值(0或1)
r.set("name","3") # 对应的二进制0b110011
print(r.getbit("name",5)) #输出:0
print(r.getbit("name",6)) #输出:1
#################
bitcount(key, start=None, end=None)
#获取对应二进制中1的个数
r.set("name","345")#0b110011 0b110100 0b110101
print(r.bitcount("name",start=0,end=1)) #输出:7
''' key:Redis的name
start:字节起始位置
end:字节结束位置'''
strlen(name)
#返回name对应值的字节长度(一个汉字3个字节)
r.set("name","wwzero")
print(r.strlen("name")) #输出:6
append(name, value)
#在name对应的值后面追加内容
r.set("name","wwzero")
print(r.get("name")) #输出:'wwzero
r.append("name","list")
print(r.get("name")) #输出:wwzerolist
管道
redis-py默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作,如果想要在一次请求中指定多个命令,则可以使用pipline实现一次请求指定多个命令,并且默认情况下一次pipline 是原子性操作。
# -*- coding:utf-8 -*-
import redis
pool = redis.ConnectionPool(host='192.168.0.110', port=6379)
r = redis.Redis(connection_pool=pool)
pipe = r.pipeline(transaction=True)
r.set('name', 'wwzero')
r.set('name', 'list')
pipe.execute()
发布和订阅
首先定义一个RedisHelper类,连接Redis,定义频道为monitor,定义发布(publish)及订阅(subscribe)方法。
#-*- coding:utf-8 -*-
import redis
class RedisHelper(object):
def __init__(self):
self.__conn = redis.Redis(host='192.168.0.1',port=6379)#连接Redis
self.channel = 'monitor' #定义名称
def publish(self,msg):#定义发布方法
self.__conn.publish(self.channel,msg)
return True
def subscribe(self):#定义订阅方法
pub = self.__conn.pubsub()
pub.subscribe(self.channel)
pub.parse_response()
return pub
发布者
# -*- coding:utf-8 -*-
#发布
from RedisHelper import RedisHelper
obj = RedisHelper()
obj.publish('hello')#发布
订阅者
# -*- coding:utf-8 -*-
#订阅
from RedisHelper import RedisHelper
obj = RedisHelper()
redis_sub = obj.subscribe()#调用订阅方法
while True:
msg= redis_sub.parse_response()
print (msg)
参考连接
http://blog.csdn.net/u013378306/article/details/69945578
Redis操作相关参考
http://www.cnblogs.com/melonjiang/p/5342505.html
Mongodb
安装
pip install pymongo
连接
import pymongo
con = pymongo.MongoClient(host = '127.0.0.1')
db = con.dbname
table = db.tablename
uu =dict(name = 'user1',age =23,sex= 'female')
table.insert(uu)
u2 = table.find_one({"name":'user1'})
print u2
con.close()

浙公网安备 33010602011771号