天天看點

mongodb和redis的差別

show dbs

切換資料庫

如果資料庫不存在,則指向資料庫,但不建立,直到插入資料或建立集合時資料庫才被建立

use 資料庫名稱

預設的資料庫為test,如果你沒有建立新的資料庫,集合将存放在test資料庫中

資料庫删除

删除目前指向的資料庫

如果資料庫不存在,則什麼也不做

db.dropDatabase()

集合操作

集合建立

文法

db.createCollection(name, options)

name是要建立的集合的名稱

options是一個文檔,用于指定集合的配置

選項參數是可選的,是以隻需要到指定的集合名稱。以下是可以使用的選項清單:

例1:不限制集合大小

db.createCollection("stu")

例2:限制集合大小,後面學會插入語句後可以檢視效果

參數capped:預設值為false表示不設定上限,值為true表示設定上限

參數size:當capped值為true時,需要指定此參數,表示上限大小,當文檔達到上限時,會将之前的資料覆寫,機關為位元組

db.createCollection("sub", { capped : true, size : 10 } )

檢視目前資料庫的集合

文法

show collections

删除

文法

db.集合名稱.drop()

資料操作

資料類型

下表為MongoDB中常用的幾種資料類型:

Object ID:文檔ID

String:字元串,最常用,必須是有效的UTF-8

Boolean:存儲一個布爾值,true或false

Integer:整數可以是32位或64位,這取決于伺服器

Double:存儲浮點值

Arrays:數組或清單,多個值存儲到一個鍵

Object:用于嵌入式的文檔,即一個值為一個文檔

Null:存儲Null值

Timestamp:時間戳

Date:存儲目前日期或時間的UNIX時間格式

object id

每個文檔都有一個屬性,為_id,保證每個文檔的唯一性

可以自己去設定_id插入文檔

如果沒有提供,那麼MongoDB為每個文檔提供了一個獨特的_id,類型為objectID

objectID是一個12位元組的十六進制數

前4個位元組為目前時間戳

接下來3個位元組的機器ID

接下來的2個位元組中MongoDB的服務程序id

最後3個位元組是簡單的增量值

插入

文法

db.集合名稱.insert(document)

插入文檔時,如果不指定_id參數,MongoDB會為文檔配置設定一個唯一的ObjectId

db.stu.insert({name:'gj',gender:1})

s1={_id:'20160101',name:'hr'}

s1.gender=0

db.stu.insert(s1)

查詢文法

db.集合名稱.find()

更新文法db.集合名稱.update(<query>,<update>, {multi: <boolean>})參數query:查詢條件,類似sql語句update中where部分參數update:更新操作符,類似sql語句update中set部分參數multi:可選,預設是false,表示隻更新找到的第一條記錄,值為true表示把滿足條件的文檔全部更新db.stu.update({name:'hr'},{name:'mnc'})指定屬性更新,通過操作符

儲存文法

db.集合名稱.save(document)

如果文檔的_id已經存在則修改,如果文檔的_id不存在則添加

db.stu.save({_id:'20160102','name':'yk',gender:1})

db.stu.save({_id:'20160102','name':'wyk'})

删除文法

db.集合名稱.remove(<query>, { justOne: <boolean> })

參數query:可選,删除的文檔的條件

參數justOne:可選,如果設為true或1,則隻删除一條,預設false,表示删除多條

db.stu.remove({gender:0},{justOne:true})

全部删除

db.stu.remove({})

備份與恢複

備份

文法

mongodump -h dbhost -d dbname -o dbdirectory

-h:伺服器位址,也可以指定端口号

-d:需要備份的資料庫名稱

-o:備份的資料存放位置,此目錄中存放着備份出來的資料

例1

sudo mkdir test1bak

sudo mongodump -h 192.168.196.128:27017 -d test1 -o ~/Desktop/test1bak

恢複

文法

mongorestore -h dbhost -d dbname --dir dbdirectory

-h:伺服器位址

-d:需要恢複的資料庫執行個體

--dir:備份資料所在位置

例2

mongorestore -h 192.168.196.128:27017 -d test2 --dir ~/Desktop/test1bak/test1

授權

建立超級管理者賬戶
use admin
db.createUser({
user:'root',
pwd:'123456',
roles:[{
role:'root',
db:'admin'
}]
})           

複制

配置檔案開啟權限驗證

security:

authorization: enabled

mongodb查詢

資料查詢

基本查詢

方法find():查詢

db.集合名稱.find({條件文檔})

方法findOne():查詢,隻傳回第一個

db.集合名稱.findOne({條件文檔})

方法pretty():将結果格式化

db.集合名稱.find({條件文檔}).pretty()

比較運算符

等于,預設是等于判斷,沒有運算符

小于$lt

小于或等于$lte

大于$gt

大于或等于$gte

不等于$ne

例1:查詢名稱等于'gj'的學生

db.stu.find({name:'gj'})

例2:查詢年齡大于或等于18的學生

db.stu.find({age:{$gte:18}})

邏輯運算符

查詢時可以有多個條件,多個條件之間需要通過邏輯運算符連接配接

邏輯與:預設是邏輯與的關系

例3:查詢年齡大于或等于18,并且性别為1的學生

db.stu.find({age:{$gte:18},gender:1})

邏輯或:使用$or

例4:查詢年齡大于18,或性别為0的學生

db.stu.find({$or:[{age:{$gt:18}},{gender:1}]})

and和or一起使用

例5:查詢年齡大于18或性别為0的學生,并且學生的姓名為gj

db.stu.find({$or:[{age:{$gte:18}},{gender:1}],name:'gj'})

範圍運算符

使用"$in","$nin" 判斷是否在某個範圍内

例6:查詢年齡為18、28的學生

db.stu.find({age:{$in:[18,28]}})

支援正規表達式

使用//或$regex編寫正規表達式

例7:查詢姓黃的學生

db.stu.find({name:/^黃/})

自定義查詢

使用$where後面寫一個函數,傳回滿足條件的資料

例7:查詢年齡大于30的學生

db.stu.find({$where:function(){return this.age>20}})

投影

在查詢到的傳回結果中,隻選擇必要的字段,而不是選擇一個文檔的整個字段

如:一個文檔有5個字段,需要顯示隻有3個,投影其中3個字段即可

文法:

參數為字段與值,值為1表示顯示,值為0不顯示

db.集合名稱.find({},{字段名稱:1,...})

對于需要顯示的字段,設定為1即可,不設定即為不顯示

特殊:對于_id列預設是顯示的,如果不顯示需要明确設定為0

db.stu.find({},{name:1,gender:1})

db.stu.find({},{_id:0,name:1,gender:1})

排序

方法sort(),用于對結果集進行排序

文法

db.集合名稱.find().sort({字段:1,...})

參數1為升序排列

參數-1為降序排列

根據性别降序,再根據年齡升序

db.stu.find().sort({gender:-1,age:1})

分頁

Limit

方法limit():用于讀取指定數量的文檔

文法:

db.集合名稱.find().limit(NUMBER)

參數NUMBER表示要擷取文檔的條數

如果沒有指定參數則顯示集合中的所有文檔

例1:查詢2條學生資訊

db.stu.find().limit(2)

skip

方法skip():用于跳過指定數量的文檔

文法:

db.集合名稱.find().skip(NUMBER)

參數NUMBER表示跳過的記錄條數,預設值為0

例2:查詢從第3條開始的學生資訊

db.stu.find().skip(2)

一起使用

方法limit()和skip()可以一起使用,不分先後順序

建立資料集

for(i=0;i<15;i++){db.t1.insert({_id:i})}

查詢第5至8條資料

db.stu.find().limit(4).skip(5)

db.stu.find().skip(5).limit(4)

統計

統計個數

方法count()用于統計結果集中文檔條數

文法

db.集合名稱.find({條件}).count()

也可以與為

db.集合名稱.count({條件})

例1:統計男生人數

db.stu.find({gender:1}).count()

例2:統計年齡大于20的男生人數

db.stu.count({age:{$gt:20},gender:1})

去重

方法distinct()對資料進行去重

文法

db.集合名稱.distinct('去重字段',{條件})

例1:查找年齡大于18的性别(去重)

db.stu.distinct('gender',{age:{$gt:18}})

python操作mongodb

安裝python包

pip install pymongo

引入包pymongo

import pymongo

連接配接,建立用戶端

client=pymongo.MongoClient("localhost", 27017)

獲得資料庫test1

db=client[test1]

獲得集合stu

stu = db[stu]

添加文檔

s1={name:'gj',age:18}

s1_id = stu.insert_one(s1).inserted_id

查找一個文檔

s2=stu.find_one()

查找多個文檔1

for cur in stu.find():

print cur

查找多個文檔2

cur=stu.find()

cur.next()

cur.next()

cur.next()

擷取文檔個數

print stu.count()

redis基礎

Redis簡介

Remote DIctionary Server(Redis) 是一個key-value存儲系統。

Redis 是完全開源免費的,遵守BSD協定,是一個高性能的key-value資料庫。

Redis 與其他 key - value 緩存産品有以下三個特點:

Redis支援資料的持久化,可以将記憶體中的資料儲存在磁盤中,重新開機的時候可以再次加載進行使用。

Redis不僅僅支援簡單的key-value類型的資料,同時還提供list,set,zset,hash等資料結構的存儲。

Redis支援資料的備份,即master-slave模式的資料備份

Ubuntu安裝Redis

sudo apt-get install redis-server

停止服務

service redis stop

啟動服務

service redis start

啟動服務端

redis-server

啟動用戶端

redis-cli

Redis配置

以指定配置檔案啟動服務端

redis-server "C:\Program Files\Redis\redis.conf"

擷取所有配置資訊

config get *

擷取單項配置資訊

config get loglevel

config get dbfilename

...

設定單項配置資訊

config set loglevel warning

config set ...

設定資料庫的數量,預設資料庫為0,可以使用SELECT <dbid>指令在連接配接上指定資料庫id

databases 16

綁定的主機位址

bind 127.0.0.1

綁定的主機端口

port 6379

指定在多長時間内,有多少次更新操作,就将資料同步到資料檔案,可以多個條件配合

save <seconds><changes>

Redis預設配置檔案中提供了三個條件:

save 900 1

save 300 10

save 60 10000

分别表示900秒(15分鐘)内有1個更改,300秒(5分鐘)内有10個更改以及60秒内有10000個更改。

指定本地資料庫檔案名,預設值為dump.rdb

dbfilename dump.rdb

指定本地資料庫存放目錄

dir ./

設定Redis連接配接密碼,如果配置了連接配接密碼,用戶端在連接配接Redis時需要通過AUTH <password>指令提供密碼,預設關閉

requirepass foobared

設定當本機為slav服務時,設定master服務的IP位址及端口,在Redis啟動時,它會自動從master進行資料同步

slaveof <masterip><masterport>

當master服務設定了密碼保護時,slav服務連接配接master的密碼

masterauth <master-password>

Redis預設不是以守護程序的方式運作,可以通過該配置項修改,使用yes啟用守護程序

daemonize no

當 用戶端閑置多長時間後關閉連接配接,如果指定為0,表示關閉該功能

timeout 300

redis資料操作

資料類型

redis是key-value的資料,是以每個資料都是一個鍵值對

鍵的類型是字元串

值的類型分為五種:

字元串string

哈希hash

清單list

集合set

有序集合zset

String類型

設定

設定鍵值

set key value

設定鍵值及過期時間,以秒為機關

SETEX key seconds value

redis> setex 1001 50 'zhouzhiruo'

設定多個鍵值

MSET key value [key value ...]

根據鍵擷取值,如果不存在此鍵則傳回nil

GET key

根據多個鍵擷取多個值

MGET key [key ...]

redis> MSET date "2012.3.30" time "11:00 a.m." weather "sunny"

OK

redis> MGET date time weather

1) "2012.3.30"

2) "11:00 a.m."

3) "sunny"

要求:值是數字

将key對應的value加1

INCR key

将key對應的value加整數

INCRBY key increment

将key對應的value減1

redis> SET page_view 20

OK

redis> INCR page_view

(integer) 21

redis> GET page_view # 數字值在 Redis 中以字元串的形式儲存

"21"

鍵存在,并且值為數字:

redis> SET rank 50

OK

redis> INCRBY rank 20

(integer) 70

redis> GET rank

"70"

鍵不存在:

redis> EXISTS counter

(integer) 0

redis> INCRBY counter 30

(integer) 30

redis> GET counter

"30"

鍵存在,但值無法被解釋為數字:

redis> SET book "long long ago..."

OK

redis> INCRBY book 200

(error) ERR value is not an integer or out of range

DECR key

将key對應的value減整數

DECRBY key decrement

對儲存數字值的鍵 key 執行 DECR 指令:

redis> SET failure_times 10

OK

redis> DECR failure_times

(integer) 9

對不存在的鍵執行 DECR 指令:

redis> EXISTS count

(integer) 0

redis> DECR count

(integer) -1

其它

追加值

APPEND key value

對不存在的 key 執行 APPEND :

redis> EXISTS myphone # 確定 myphone 不存在

(integer) 0

redis> APPEND myphone "nokia" # 對不存在的 key 進行 APPEND ,等同于 SET myphone "nokia"

(integer) 5 # 字元長度

對已存在的字元串進行 APPEND :

redis> APPEND myphone " - 1110" # 長度從 5 個字元增加到 12 個字元

(integer) 12

redis> GET myphone

"nokia - 1110"

擷取值長度

STRLEN key

擷取字元串值的長度:

redis> SET mykey "Hello world"

OK

redis> STRLEN mykey

(integer) 11

不存在的鍵的長度為 0 :

redis> STRLEN nonexisting

(integer) 0

鍵操作

查找鍵,參數支援正則

KEYS pattern

redis> MSET one 1 two 2 three 3 four 4 # 一次設定 4 個 key

OK

redis> KEYS *o*

1) "four"

2) "two"

3) "one"

redis> KEYS t??

1) "two"

redis> KEYS t[w]*

1) "two"

redis> KEYS * # 比對資料庫内所有 key

1) "four"

2) "three"

3) "two"

4) "one"

KEYS 的速度非常快,但在一個大的資料庫中使用它仍然可能造成性能問題,如果你需要從一個資料集中查找特定的 key ,你最好還是用 Redis 的集合結構(set)來代替。

判斷鍵是否存在,如果存在傳回1,不存在傳回0

EXISTS key [key ...]

redis> SET db "redis"

OK

redis> EXISTS db

(integer) 1

redis> DEL db

(integer) 1

redis> EXISTS db

(integer) 0

檢視鍵對應的value的類型

TYPE key

# 字元串

redis> SET weather "sunny"

OK

redis> TYPE weather

string

# 清單

redis> LPUSH book_list "programming in scala"

(integer) 1

redis> TYPE book_list

list

# 集合

redis> SADD pat "dog"

(integer) 1

redis> TYPE pat

set

删除鍵及對應的值

DEL key [key ...]

# 删除單個 key

redis> SET name huangz

OK

redis> DEL name

(integer) 1

# 删除一個不存在的 key

redis> EXISTS phone

(integer) 0

redis> DEL phone # 失敗,沒有 key 被删除

(integer) 0

# 同時删除多個 key

redis> SET name "redis"

OK

redis> SET type "key-value store"

OK

redis> SET website "redis.com"

OK

redis> DEL name type website

(integer) 3

設定過期時間,以秒為機關

建立時沒有設定過期時間則一直存在,直到使用使用DEL移除

EXPIRE key seconds

redis> SET cache_page "www.google.com"

OK

redis> EXPIRE cache_page 30 # 設定過期時間為 30 秒

(integer) 1

redis> TTL cache_page # 檢視剩餘生存時間

(integer) 23

redis> EXPIRE cache_page 30000 # 更新過期時間

(integer) 1

redis> TTL cache_page

(integer) 29996

檢視有效時間,以秒為機關

TTL key

# 不存在的 key

redis> FLUSHDB

OK

redis> TTL key

(integer) -2

# key 存在,但沒有設定剩餘生存時間

redis> SET key value

OK

redis> TTL key

(integer) -1

# 有剩餘生存時間的 key

redis> EXPIRE key 10086

(integer) 1

redis> TTL key

(integer) 10084

hash

hash用于存儲對象,對象的格式為鍵值對

設定

設定單個屬性

HSET key field value

設定一個新域:

redis> HSET website google "www.g.cn"

(integer) 1

redis> HGET website google

"www.g.cn"

對一個已存在的域進行更新:

redis> HSET website google "www.google.com"

(integer) 0

redis> HGET website google

"www.google.com"

設定多個屬性

HMSET key field value [field value ...]

redis> HMSET website google www.google.com yahoo www.yahoo.com

OK

redis> HGET website google

"www.google.com"

redis> HGET website yahoo

"www.yahoo.com"

擷取

擷取一個屬性的值

HGET key field

域存在的情況:

redis> HSET homepage redis redis.com

(integer) 1

redis> HGET homepage redis

"redis.com"

域不存在的情況:

redis> HGET site mysql

(nil)

擷取多個屬性的值

HMGET key field [field ...]

redis> HMSET pet dog "doudou" cat "nounou" # 一次設定多個域

OK

redis> HMGET pet dog cat fake_pet # 傳回值的順序和傳入參數的順序一樣

1) "doudou"

2) "nounou"

3) (nil) # 不存在的域傳回nil值

擷取所有屬性和值

HGETALL key

redis> HSET people jack "Jack Sparrow"

(integer) 1

redis> HSET people gump "Forrest Gump"

(integer) 1

redis> HGETALL people

1) "jack" # 域

2) "Jack Sparrow" # 值

3) "gump"

4) "Forrest Gump"

擷取所有的屬性

HKEYS key

# 哈希表非空

redis> HMSET website google www.google.com yahoo www.yahoo.com

OK

redis> HKEYS website

1) "google"

2) "yahoo"

# 空哈希表/key不存在

redis> EXISTS fake_key

(integer) 0

redis> HKEYS fake_key

(empty list or set)

傳回包含屬性的個數

HLEN key

redis> HSET db redis redis.com

(integer) 1

redis> HSET db mysql mysql.com

(integer) 1

redis> HLEN db

(integer) 2

redis> HSET db mongodb mongodb.org

(integer) 1

redis> HLEN db

(integer) 3

擷取所有值

HVALS key

# 非空哈希表

redis> HMSET website google www.google.com yahoo www.yahoo.com

OK

redis> HVALS website

1) "www.google.com"

2) "www.yahoo.com"

# 空哈希表/不存在的key

redis> EXISTS not_exists

(integer) 0

redis> HVALS not_exists

(empty list or set)

其它

判斷屬性是否存在

HEXISTS key field

給定域不存在:

redis> HEXISTS phone myphone

(integer) 0

給定域存在:

redis> HSET phone myphone nokia-1110

(integer) 1

redis> HEXISTS phone myphone

(integer) 1

删除屬性及值

HDEL key field [field ...]

# 測試資料

redis> HGETALL abbr

1) "a"

2) "apple"

3) "b"

4) "banana"

5) "c"

6) "cat"

7) "d"

8) "dog"

# 删除單個域

redis> HDEL abbr a

(integer) 1

# 删除不存在的域

redis> HDEL abbr not-exists-field

(integer) 0

# 删除多個域

redis> HDEL abbr b c

(integer) 2

redis> HGETALL abbr

1) "d"

2) "dog"

傳回值的字元串長度

HSTRLEN key field

redis> HMSET myhash f1 "HelloWorld" f2 "99" f3 "-256"

OK

redis> HSTRLEN myhash f1

(integer) 10

redis> HSTRLEN myhash f2

(integer) 2

redis> HSTRLEN myhash f3

(integer) 4

list

清單的元素類型為string

按照插入順序排序

在清單的頭部或者尾部添加元素

設定

在頭部插入資料

LPUSH key value [value ...]

# 加入單個元素

redis> LPUSH languages python

(integer) 1

# 加入重複元素

redis> LPUSH languages python

(integer) 2

redis> LRANGE languages 0 -1 # 清單允許重複元素

1) "python"

2) "python"

# 加入多個元素

redis> LPUSH mylist a b c

(integer) 3

redis> LRANGE mylist 0 -1

1) "c"

2) "b"

3) "a"

在尾部插入資料

RPUSH key value [value ...]

# 添加單個元素

redis> RPUSH languages c

(integer) 1

# 添加重複元素

redis> RPUSH languages c

(integer) 2

redis> LRANGE languages 0 -1 # 清單允許重複元素

1) "c"

2) "c"

# 添加多個元素

redis> RPUSH mylist a b c

(integer) 3

redis> LRANGE mylist 0 -1

1) "a"

2) "b"

3) "c"

在一個元素的前|後插入新元素

LINSERT key BEFORE|AFTER pivot value

redis> RPUSH mylist "Hello"

(integer) 1

redis> RPUSH mylist "World"

(integer) 2

redis> LINSERT mylist BEFORE "World" "There"

(integer) 3

redis> LRANGE mylist 0 -1

1) "Hello"

2) "There"

3) "World"

# 對一個非空清單插入,查找一個不存在的 pivot

redis> LINSERT mylist BEFORE "go" "let's"

(integer) -1 # 失敗

# 對一個空清單執行 LINSERT 指令

redis> EXISTS fake_list

(integer) 0

redis> LINSERT fake_list BEFORE "nono" "gogogog"

(integer) 0 # 失敗

設定指定索引的元素值

索引是基于0的下标

索引可以是負數,表示偏移量是從list尾部開始計數,如-1表示清單的最後一個元素

LSET key index value

# 對空清單(key 不存在)進行 LSET

redis> EXISTS list

(integer) 0

redis> LSET list 0 item

(error) ERR no such key

# 對非空清單進行 LSET

redis> LPUSH job "cook food"

(integer) 1

redis> LRANGE job 0 0

1) "cook food"

redis> LSET job 0 "play game"

OK

redis> LRANGE job 0 0

1) "play game"

# index 超出範圍

redis> LLEN list # 清單長度為 1

(integer) 1

redis> LSET list 3 'out of range'

(error) ERR index out of range

移除并且傳回 key 對應的 list 的第一個元素

LPOP key

redis> LLEN course

(integer) 0

redis> RPUSH course algorithm001

(integer) 1

redis> RPUSH course c++101

(integer) 2

redis> LPOP course # 移除頭元素

"algorithm001"

移除并傳回存于 key 的 list 的最後一個元素

RPOP key

redis> RPUSH mylist "one"

(integer) 1

redis> RPUSH mylist "two"

(integer) 2

redis> RPUSH mylist "three"

(integer) 3

redis> RPOP mylist # 傳回被彈出的元素

"three"

redis> LRANGE mylist 0 -1 # 清單剩下的元素

1) "one"

2) "two"

傳回存儲在 key 的清單裡指定範圍内的元素

start 和 end 偏移量都是基于0的下标

偏移量也可以是負數,表示偏移量是從list尾部開始計數,如-1表示清單的最後一個元素

LRANGE key start stop

redis> RPUSH fp-language lisp

(integer) 1

redis> LRANGE fp-language 0 0

1) "lisp"

redis> RPUSH fp-language scheme

(integer) 2

redis> LRANGE fp-language 0 1

1) "lisp"

2) "scheme"

裁剪清單,改為原集合的一個子集

start 和 end 偏移量都是基于0的下标

偏移量也可以是負數,表示偏移量是從list尾部開始計數,如-1表示清單的最後一個元素

LTRIM key start stop

# 情況 1: 常見情況, start 和 stop 都在清單的索引範圍之内

redis> LRANGE alpha 0 -1 # alpha 是一個包含 5 個字元串的清單

1) "h"

2) "e"

3) "l"

4) "l"

5) "o"

redis> LTRIM alpha 1 -1 # 删除 alpha 清單索引為 0 的元素

OK

redis> LRANGE alpha 0 -1 # "h" 被删除了

1) "e"

2) "l"

3) "l"

4) "o"

# 情況 2: stop 比清單的最大下标還要大

redis> LTRIM alpha 1 10086 # 保留 alpha 清單索引 1 至索引 10086 上的元素

OK

redis> LRANGE alpha 0 -1 # 隻有索引 0 上的元素 "e" 被删除了,其他元素還在

1) "l"

2) "l"

3) "o"

# 情況 3: start 和 stop 都比清單的最大下标要大,并且 start < stop

redis> LTRIM alpha 10086 123321

OK

redis> LRANGE alpha 0 -1 # 清單被清空

(empty list or set)

# 情況 4: start 和 stop 都比清單的最大下标要大,并且 start > stop

redis> RPUSH new-alpha "h" "e" "l" "l" "o" # 重建立立一個新清單

(integer) 5

redis> LRANGE new-alpha 0 -1

1) "h"

2) "e"

3) "l"

4) "l"

5) "o"

redis> LTRIM new-alpha 123321 10086 # 執行 LTRIM

OK

redis> LRANGE new-alpha 0 -1 # 同樣被清空

(empty list or set)

傳回存儲在 key 裡的list的長度

LLEN key

# 空清單

redis> LLEN job

(integer) 0

# 非空清單

redis> LPUSH job "cook food"

(integer) 1

redis> LPUSH job "have lunch"

(integer) 2

redis> LLEN job

(integer) 2

傳回清單裡索引對應的元素

LINDEX key index

redis> LPUSH mylist "World"

(integer) 1

redis> LPUSH mylist "Hello"

(integer) 2

redis> LINDEX mylist 0

"Hello"

redis> LINDEX mylist -1

"World"

redis> LINDEX mylist 3 # index不在 mylist 的區間範圍内

(nil)

set

無序集合

元素為string類型

元素具有唯一性,不重複

添加元素

SADD key member [member ...]

# 添加單個元素

redis> SADD bbs "discuz.net"

(integer) 1

# 添加重複元素

redis> SADD bbs "discuz.net"

(integer) 0

# 添加多個元素

redis> SADD bbs "tianya.cn" "groups.google.com"

(integer) 2

redis> SMEMBERS bbs

1) "discuz.net"

2) "groups.google.com"

3) "tianya.cn"

傳回key集合所有的元素

SMEMBERS key

# key 不存在或集合為空

redis> EXISTS not_exists_key

(integer) 0

redis> SMEMBERS not_exists_key

(empty list or set)

# 非空集合

redis> SADD language Ruby Python Clojure

(integer) 3

redis> SMEMBERS language

1) "Python"

2) "Ruby"

3) "Clojure"

傳回集合元素個數

SCARD key

redis> SADD tool pc printer phone

(integer) 3

redis> SCARD tool # 非空集合

(integer) 3

redis> DEL tool

(integer) 1

redis> SCARD tool # 空集合

(integer) 0

求多個集合的交集

SINTER key [key ...]

redis> SMEMBERS group_1

1) "LI LEI"

2) "TOM"

3) "JACK"

redis> SMEMBERS group_2

1) "HAN MEIMEI"

2) "JACK"

redis> SINTER group_1 group_2

1) "JACK"

求某集合與其它集合的差集

SDIFF key [key ...]

redis> SMEMBERS peter's_movies

1) "bet man"

2) "start war"

3) "2012"

redis> SMEMBERS joe's_movies

1) "hi, lady"

2) "Fast Five"

3) "2012"

redis> SDIFF peter's_movies joe's_movies

1) "bet man"

2) "start war"

求多個集合的合集

SUNION key [key ...]

redis> SMEMBERS songs

1) "Billie Jean"

redis> SMEMBERS my_songs

1) "Believe Me"

redis> SUNION songs my_songs

1) "Billie Jean"

2) "Believe Me"

判斷元素是否在集合中

SISMEMBER key member

redis> SMEMBERS joe's_movies

1) "hi, lady"

2) "Fast Five"

3) "2012"

redis> SISMEMBER joe's_movies "bet man"

(integer) 0

redis> SISMEMBER joe's_movies "Fast Five"

(integer) 1

zset

sorted set,有序集合

元素為string類型

元素具有唯一性,不重複

每個元素都會關聯一個double類型的score,表示權重,通過權重将元素從小到大排序

元素的score可以相同

添加

ZADD key score member [score member ...]

# 添加單個元素

redis> ZADD page_rank 10 google.com

(integer) 1

# 添加多個元素

redis> ZADD page_rank 9 baidu.com 8 bing.com

(integer) 2

redis> ZRANGE page_rank 0 -1 WITHSCORES

1) "bing.com"

2) "8"

3) "baidu.com"

4) "9"

5) "google.com"

6) "10"

# 添加已存在元素,且 score 值不變

redis> ZADD page_rank 10 google.com

(integer) 0

redis> ZRANGE page_rank 0 -1 WITHSCORES # 沒有改變

1) "bing.com"

2) "8"

3) "baidu.com"

4) "9"

5) "google.com"

6) "10"

# 添加已存在元素,但是改變 score 值

redis> ZADD page_rank 6 bing.com

(integer) 0

redis> ZRANGE page_rank 0 -1 WITHSCORES # bing.com 元素的 score 值被改變

1) "bing.com"

2) "6"

3) "baidu.com"

4) "9"

5) "google.com"

6) "10"

傳回指定範圍内的元素

ZRANGE key start stop

redis > ZRANGE salary 0 -1 WITHSCORES # 顯示整個有序內建員

1) "jack"

2) "3500"

3) "tom"

4) "5000"

5) "boss"

6) "10086"

redis > ZRANGE salary 1 2 WITHSCORES # 顯示有序集下标區間 1 至 2 的成員

1) "tom"

2) "5000"

3) "boss"

4) "10086"

redis > ZRANGE salary 0 200000 WITHSCORES # 測試 end 下标超出最大下标時的情況

1) "jack"

2) "3500"

3) "tom"

4) "5000"

5) "boss"

6) "10086"

redis > ZRANGE salary 200000 3000000 WITHSCORES # 測試當給定區間不存在于有序集時的情況

(empty list or set)

傳回元素個數

ZCARD key

redis > ZADD salary 2000 tom # 添加一個成員

(integer) 1

redis > ZCARD salary

(integer) 1

redis > ZADD salary 5000 jack # 再添加一個成員

(integer) 1

redis > ZCARD salary

(integer) 2

redis > EXISTS non_exists_key # 對不存在的 key 進行 ZCARD 操作

(integer) 0

redis > ZCARD non_exists_key

(integer) 0

傳回有序集key中,score值在min和max之間的成員

ZCOUNT key min max

redis> ZRANGE salary 0 -1 WITHSCORES # 測試資料

1) "jack"

2) "2000"

3) "peter"

4) "3500"

5) "tom"

6) "5000"

redis> ZCOUNT salary 2000 5000 # 計算薪水在 2000-5000 之間的人數

(integer) 3

redis> ZCOUNT salary 3000 5000 # 計算薪水在 3000-5000 之間的人數

(integer) 2

傳回有序集key中,成員member的score值

ZSCORE key member

redis> ZRANGE salary 0 -1 WITHSCORES # 測試資料

1) "tom"

2) "2000"

3) "peter"

4) "3500"

5) "jack"

6) "5000"

redis> ZSCORE salary peter # 注意傳回值是字元串

"3500"

redis進階

釋出訂閱

釋出者不是計劃發送消息給特定的接收者(訂閱者),而是釋出的消息分到不同的頻道,不需要知道什麼樣的訂閱者訂閱。

訂閱者對一個或多個頻道感興趣,隻需接收感興趣的消息,不需要知道什麼樣的釋出者釋出的釋出者和訂閱者的解耦合可以帶來更大的擴充性和更加動态的網絡拓撲用戶端發到頻道的消息,将會被推送到所有訂閱此頻道的用戶端。

用戶端不需要主動去擷取消息,隻需要訂閱頻道,這個頻道的内容就會被推送過來消息的格式。

推送消息的格式包含三部分

part1:消息類型,包含三種類型

subscribe,表示訂閱成功

unsubscribe,表示取消訂閱成功

message,表示其它終端釋出消息

如果第一部分的值為subscribe,則第二部分是頻道,第三部分是現在訂閱的頻道的數量

如果第一部分的值為unsubscribe,則第二部分是頻道,第三部分是現在訂閱的頻道的數量,如果為0則表示目前沒有

訂閱任何頻道,當在Pub/Sub以外狀态,用戶端可以發出任何redis指令

如果第一部分的值為message,則第二部分是來源頻道的名稱,第三部分是消息的内容

指令

訂閱

SUBSCRIBE 頻道名稱 [頻道名稱 ...]

取消訂閱

如果不寫參數,表示取消所有訂閱

UNSUBSCRIBE 頻道名稱 [頻道名稱 ...]

釋出

PUBLISH 頻道 消息

主從配置

一個master可以擁有多個slave,一個slave又可以擁有多個slave,如此下去,形成了強大的多級伺服器叢集架構

比如,将ip為192.168.1.10的機器作為主伺服器,将ip為192.168.1.11的機器作為從伺服器

設定主伺服器的配置

bind 192.168.1.10

設定從伺服器的配置

注意:在slaveof後面寫主機ip,再寫端口,而且端口必須寫

bind 192.168.1.11

slaveof 192.168.1.10 6379

在master和slave分别執行info指令,檢視輸出資訊

在master上寫資料

set hello world

在slave上讀資料

get hello

安全配置

Redis 安全

配置密碼

檢視密碼

CONFIG get requirepass

設定密碼

CONFIG set requirepass 123456

遠端連接配接

redis-cli -h 127.0.0.1 -p 6379 -a 123456

登入之後授權

auth 123456

python操作redis

redis子產品使用

安裝

pip install redis

引入子產品

import redis

連接配接

try:

r=redis.StrictRedis(host='localhost',port=6379)

except Exception,e:

print e.message

方式一:根據資料類型的不同,調用相應的方法,完成讀寫

更多方法同前面學的指令

r.set('name','hello')

r.get('name')

方式二:pipline

緩沖多條指令,然後一次性執行,減少伺服器-用戶端之間TCP資料庫包,進而提高效率

pipe = r.pipeline()

pipe.set('name', 'world')

pipe.get('name')

pipe.execute()

封裝

連接配接redis伺服器部分是一緻的

這裡将string類型的讀寫進行封裝

import redis

class RedisHelper():

def __init__(self,host='localhost',port=6379):

self.__redis = redis.StrictRedis(host, port)

def get(self,key):

if self.__redis.exists(key):

return self.__redis.get(key)

else:

return ""

def set(self,key,value):

self.__redis.set(key,value)

示例:使用者登入

業務過程如下:

輸入使用者名、密碼

密碼加密

判斷redis中是否記錄了使用者名,如果有則成功

如果redis中沒有使用者名,則到mysql中查詢

從mysql中查詢成功後,将使用者名記錄到redis中

from t2 import RedisHelper

from t3 import MysqlHelper

import hashlib

name=raw_input("請輸入使用者名:")

pwd=raw_input("請輸入密碼:")

sha1=hashlib.sha1()

sha1.update(pwd)

pwd1=sha1.hexdigest()

try:

redis=RedisHelper()

if redis.get('uname')==name:

print 'ok'

else:

mysql=MysqlHelper('localhost',3306,'test1','root','mysql')

upwd=mysql.get_one('select upwd from userinfos where uname=%s',[name])

if upwd==None:

print '使用者名錯誤'

elif upwd[0]==pwd1:

redis.set('uname', name)

print '登入成功'

else:

print "密碼錯誤"

except Exception,e:

print e.message