python nosql

一.nosql介绍

对于NoSQL并没有一个明确的范围和定义,但是他们都普遍存在下面一些共同特征:

1.不需要预定义模式:不需要事先定义数据模式,预定义表结构。数据中的每条记录都可能有不同的属性和格式。当插入数据时,并不需要预先定义它们的模式。
2.无共享架构:相对于将所有数据存储的存储区域网络中的全共享架构。NoSQL往往将数据划分后存储在各个本地服务器上。因为从本地磁盘读取数据的性能往往好于通过网络传输读取数据的性能,从而提高了系统的性能。
3.弹性可扩展:可以在系统运行的时候,动态增加或者删除结点。不需要停机维护,数据可以自动迁移。
4.分区:相对于将数据存放于同一个节点,NoSQL数据库需要将数据进行分区,将记录分散在多个节点上面。并且通常分区的同时还要做复制。这样既提高了并行性能,又能保证没有单点失效的问题。
5.异步复制:和RAID存储系统不同的是,NoSQL中的复制,往往是基于日志的异步复制。这样,数据就可以尽快地写入一个节点,而不会被网络传输引起迟延。缺点是并不总是能保证一致性,这样的方式在出现故障的时候,可能会丢失少量的数据。
6.BASE:相对于事务严格的ACID特性,NoSQL数据库保证的是BASE特性。BASE是最终一致性和软事务。

NoSQL数据库并没有一个统一的架构,两种NoSQL数据库之间的不同,甚至远远超过两种关系型数据库的不同。可以说,NoSQL各有所长,成功的NoSQL必然特别适用于某些场合或者某些应用,在这些场合中会远远胜过关系型数据库和其他的NoSQL。

二.常用的nosql数据库


三.python连接redis

Redis的概念:
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

Redis提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。

(1)安装redis

Redis一般都是安装在linux系统中,具体安装步骤如下:
#cd /usr/local/src
#wget http://download.redis.io/releases/redis-3.0.1.tar.gz 
#tar xzf redis-3.0.1.tar.gz 
#cd redis-3.0.1 
#make
#src/redis-server &

检查redis是否启动成功
ps –ef |grep redis
netstat –lnp |grep 6379

(2)python连接redis

安装python语言的客户端
pip install redis
连接redis服务器
连接redis服务器,必须知道redis服务器的ip地址和redis的端口,默认端口为6379。如:

import redis
r = redis.Redis(host="192.168.48.128", port=6379)
r.set("shang", "I love you!")
print(r.get("shang"))

结果为:b'I love you!'

显示的二进制类型,以字符串类型显示可以这样写:print(r.get("shang").decode())  结果就为字符串类型了。

(3)redis连接池

redis-py使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。默认,每个Redis实例都会维护一个自己的连接。可以直接建立一个连接池,然后作为Redis参数,这样就可以实现多个Redis实例共享一个连接池。

import redis
pool = redis.ConnectionPool(host="192.168.48.128")

r = redis.Redis(connection_pool=pool)

r.set("name", "1")
print(r.get("name"))

结果为:b'1'

四.python操作redis

1.String操作

(1)set 、mset 设置值

set(name, value, ex=None, px=None, nx=False, xx=False) 设置单个值

     ex,过期时间(秒)
     px,过期时间(毫秒)
     nx,如果设置为True,则只有name不存在时,当前set操作才执行,同setnx(name, value)

     xx,如果设置为True,则只有name存在时,当前set操作才执行'''

mset(key1=“values1”,key2=“values2”) 批量设置值,()为dict类型

#导入模块import redis#建立连接池
pool = redis.ConnectionPool(host="47.93.205.208")
r = redis.Redis(connection_pool=pool)
#设置单个值
r.set("name","aa")
#批量设置值r.mset(n="a",b="aa")

(2)get(name)  、mget("name1","name2") 获取值

#导入模块
import redis
#建立连接池
pool = redis.ConnectionPool(host="47.93.205.208")
r = redis.Redis(connection_pool=pool)
#获取单个值
print(r.get("name"))
#批量获取值print(r.mget("n","b"))
(3)append(name, value)  为指定的key追加值

如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。

如果 key 不存在, APPEND 就简单地将给定 key 设为 value ,就像执行 SET key value 一样。

2.list操作

Redis中存储list类型的数据是在内存中,一个name对应一个list

(1)lpush(name, value)

 Lpush 命令将一个或多个值插入到列表头部,也就是向左添加。 如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。 当 key 存在但不是列表类型时,返回一个错误。
注意:在Redis 2.4版本以前的 LPUSH 命令,都只接受单个 value 值。

r.lpush("list_name",2)     
r.lpush("list_name",3,4,5) #保存在列表中的顺序为5,4,3,2
(2)rpush(name, value) 插入列表尾部,向右添加。
r.lpush("list_name",2)     
r.lpush("list_name",3,4,5) #保存在列表中的顺序为2,3,4,5
(3)llen(name)  # name对应的list元素的个数

(4)lrange(name,开始值,结束值) 在name所对应的列表中分片获取数据

print(r.lrange("list_name",0,3))  #0位开始的索引位置,3位结束的索引位置

结果为:[b'5', b'4', b'3', b'2']

(3) linsert(name,where,refvalue,value)  向列表中插入元素

lindex(name,index):在name对应的列表中根据索引取列表元素

# name   代表的是list对应的key值
# where     AFTER  后   BEFORE 前 :表示你要插入到某个元素的前面还是后面
# refvalue    list中的某个元素
# value      你要增加的值是什么
r.linsert("list_name","AFTER",4,"a") #将字符a插入到list_name所对应的列表中“4”这个元素的后面
print(r.lrange("list_name",0,4))     #打印列表中索引位置为0-4的元素
print(r.lindex("list_name",0))       #打印列表中索引为0的元素

结果为:[b'5', b'4', b'a', b'3', b'2']

              b'5'

(4)r.lset(name,index,value):对key对应的list中的某一个索引位置重新赋值。
#参数:
    # name,redis的name
    # index,list的索引位置

    # value,要设置的值

r.lset("list_name",0,"b")  #将索引0位置的元素改为b
print(r.lrange("list_name",0,2))
结果为:[b'b', b'4', b'a'](5)r.lrem(name,value,num):在name对应的list中删除指定的值
# 参数:
    # name,redis的name
    # value,要删除的值
    # num,  num=0,删除列表中所有的指定值;
           # num=2,从前到后,删除2个;
           # num=-2,从后向前,删除2个

r.lrem("list_name","a",1)  #删除list_name相对应列表中的“a”元素1个,从前向后删除。
(6) lpop(name) 在name对应的列表的左侧获取第一个元素并在列表中移除,返回删除那个元素的值
rpop(name)表示从右向左操作
3.Set操作

set为不重复的list

(1)sadd(name, values) 

Sadd 命令将一个或多个成员元素加入到集合中,已经存在于集合的成员元素将被忽略。

假如集合 key 不存在,则创建一个只包含添加的元素作成员的集合。

r.sadd("set_name",1,2,3,4)
(2)smembers(name)  获取name对应的集合的所有成员

print(r.smembers("set_name"))
结果为:{b'1', b'3', b'2', b'4'}

(3)scard(name)  获取name对应的集合中的元素个数

print(r.scard("set_name"))

结果为:4

(4)sismember(name, value)  检查value是否是name对应的集合内的元素

print(r.sismember("set_name",5))
结果为:False

(5)spop(name) 从集合的右侧移除一个元素,并将其返回

r.spop("set_name")
(6)srem(name, value)  删除集合中的某个元素
r.srem("set_name",4)
print(r.smembers("set_name"))
结果为:{b'1', b'2', b'3'}
(7)sunion(keys, *args) 获取多个name对应的集合的并集
r.sadd("set_name",1,2,3,4)
r.sadd("set_name1",3,4,5,6)
print(r.sunion("set_name","set_name1"))
结果为:{b'3', b'1', b'6', b'2', b'5', b'4'}
(8)r.sinter(“set_name1”, “set_name2”)  交集
r.sadd("set_name",1,2,3,4)
r.sadd("set_name1",3,4,5,6)
print(r.sinter("set_name","set_name1"))

结果为:{b'3', b'4'}

阅读更多
个人分类: python
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭