對於NoSQL並無一個明確的範圍和定義,可是他們都廣泛存在下面一些共同特徵:python
1. 不須要預約義模式:不須要事先定義數據模式,預約義表結構。數據中的每條記錄均可能有不一樣的屬性和格式。當插入數據時,並不須要預先定義它們的模式。linux
2. 無共享架構:相對於將全部數據存儲的存儲區域網絡中的全共享架構。NoSQL每每將數據劃分後存儲在各個本地服務器上。由於從本地磁盤讀取數據的性能每每好於經過網絡傳輸讀取數據的性能,從而提升了系統的性能。redis
3. 彈性可擴展:能夠在系統運行的時候,動態增長或者刪除結點。不須要停機維護,數據能夠自動遷移。數據庫
4. 分區:相對於將數據存放於同一個節點,NoSQL數據庫須要將數據進行分區,將記錄分散在多個節點上面。而且一般分區的同時還要作複製。這樣既提升了並行性能,又能保證沒有單點失效的問題。緩存
5. 異步複製:和RAID存儲系統不一樣的是,NoSQL中的複製,每每是基於日誌的異步複製。這樣,數據就能夠儘快地寫入一個節點,而不會被網絡傳輸引發遲延。缺點是並不老是能保證一致性,這樣的方式在出現故障的時候,可能會丟失少許的數據。bash
6. BASE:相對於事務嚴格的ACID特性,NoSQL數據庫保證的是BASE特性。BASE是最終一致性和軟事務。服務器
NoSQL數據庫並無一個統一的架構,兩種NoSQL數據庫之間的不一樣,甚至遠遠超過兩種關係型數據庫的不一樣。能夠說,NoSQL各有所長,成功的NoSQL必然特別適用於某些場合或者某些應用,在這些場合中會遠遠賽過關係型數據庫和其餘的NoSQL網絡
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等客戶端,使用很方便。app
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 &
或者在他的配置文件中把demon 改爲yes
檢查redis是否啓動成功
ps –ef |grep redis netstat –lnp |grep 6379
安裝python語言的客戶端
pip install redis
鏈接redis服務器
鏈接redis服務器,必須知道redis服務器的ip地址和redis的端口,默認端口爲6379
#!/usr/bin/env python # -*- coding:utf-8 -*- # @Time : 2018/5/15 16:16 # @Author :fengxiaoqing import redis r = redis.Redis(host="192.168.100.101", port=6379) r.set("beijing", "Very Good!") print(r.get("beijing"))
redis-py使用connection pool來管理對一個redis server的全部鏈接,避免每次創建、釋放鏈接的開銷。默認,每一個Redis實例都會維護一個本身的鏈接。能夠直接創建一個鏈接池,而後做爲Redis參數,這樣就能夠實現多個Redis實例共享一個鏈接池
#!/usr/bin/env python # -*- coding:utf-8 -*- import redis pool = redis.ConnectionPool(host="192.168.100.101") r = redis.Redis(connection_pool=pool) r.set("name", "fengxiaoqing") print(r.get("name"))
set(name, value, ex=None, px=None, nx=False, xx=False)
ex,過時時間(秒)
px,過時時間(毫秒)
nx,若是設置爲True,則只有name不存在時,當前set操做才執行,同setnx(name, value)
xx,若是設置爲True,則只有name存在時,當前set操做才執行'''
get(name) #獲取值 mset(name1=「ling」) # 批量設置值,()爲dict類型 mget(‘name1’, ‘name2’) #批量獲取key的值,()爲tuple類型 append(name, value)
Redis中存儲list類型的數據是在內存中,一個name對應一個list
lpush(name, value) r.lpush("list_name",2) r.lpush("list_name",3,4,5) #保存在列表中的順序爲5,4,3,2 rpush(name, value) llen(name)
# name對應的list元素的個數
# linsert(name,where,refvalue,value)
# name 表明的是list對應的key值
# where AFTER BEFORE
# refvalue list中的某個元素
# value 你要增長的值是什麼
r.linsert("list1", "AFTER", "test2", "hello")
r.lset(name,index,value):對name對應的list中的某一個索引位置從新賦值。
# 參數:
# name,redis的name
# index,list的索引位置
# value,要設置的值
r.lrem(name,value,num):在name對應的list中刪除指定的值
# 參數:
# name,redis的name
# value,要刪除的值
# num, num=0,刪除列表中全部的指定值;
# num=2,從前到後,刪除2個;
# num=-2,從後向前,刪除2個
lpop(name)
在name對應的列表的左側獲取第一個元素並在列表中移除,返回值刪除那個元素的值
擴展: rpop(name)表示從右向左操做
lindex(name,index):在name對應的列表中根據索引取列表元素
lrange(name,start,end):在name對應的列表分片獲取數據
Set 不重複的list
sadd(name, values)
r.sadd("set_name","aa","bb")
smembers(name)
#獲取name對應的集合的全部成員
scard(name)
#獲取name對應的集合中的元素個數
sismember(name, value)
#檢查value是不是name對應的集合內的元素
spop(name)
#從集合的右側移除一個元素,並將其返回
srem(name, value) 刪除集合中的某個元素
r.srem("set_name", "aa")
sunion(keys, *args)
#獲取多個name對應的集合的並集
r.sunion("set_name","set_name1","set_name2")
r.sinter(「set_name1」, 「set_name2」) 交集
Redis在內存中存儲hash類型是以name對應一個字典形式存儲的
hset(name,key,value)
#name對應的hash中設置一個鍵值對(不存在,則建立;不然,修改)
#參數:
#name:redis的name
#key:key1對應的hash中的key
#value:value1對應的hash中的value
hget(name,key)
#在name對應的hash中獲取根據key獲取value
hmset(name,mapping)
#在name對應的hash中批量設置鍵值對
#參數:
#name:redis的name
#mapping:字典,如{'k1':'v1','k2','v2'}
hmget(name,keys,*args)
#在name對應的hash中獲取多個key的值
#參數:
#name:redis對應的name
#keys:要獲取key的集合,如:['k1','k2','k3']
#*args:要獲取的key,如:k1,k2,k3
print(r.hmget('test','k1','k2')) #獲取多個值
hgetall(name):獲取name對應hash的全部鍵值
hlen(name):獲取name對應的hash中鍵值的個數
hkeys(name):獲取name對應的hash中全部的key的值
hvals(name):獲取name對應的hash中全部的value的值
hexists(name,key):檢查name對應的hash是否存在當前傳入的key
hdel(name,*keys):將name對應的hash中指定key的鍵值對刪除
delete(*names)
#根據name刪除redis中的任意數據類型
exists(name)
#檢測redis的name是否存在
keys(pattern='*')
#根據* ?等通配符匹配獲取redis的name
expire(name ,time)
# 爲某個name設置過時時間
rename(src, dst)
# 重命名
move(name, db))
# 將redis的某個值移動到指定的db下
type(name)
# 獲取name對應值的類型
flushall 刪除全部的key