緩存數據庫介紹
NoSQL(NoSQL = Not Only SQL ),意即“不僅僅是SQL”,泛指非關系型的數據庫,隨着互聯網web2.0網站的興起,傳統的關系數據庫在應付web2.0網站,特別是超大規模和高並發的SNS類型的web2.0純動態網站已經顯得力不從心,暴露了很多難以克服的問題,而非關系型的數據庫則由於其本身的特點得到了非常迅速的發展。NoSQL數據庫的產生就是為了解決大規模數據集合多重數據種類帶來的挑戰,尤其是大數據應用難題。
NoSQL數據庫的四大分類
鍵值(Key-Value)存儲數據庫
NoSQL數據庫的四大分類表格分析
redis
介紹
redis是業界主流的key-value nosql 數據庫之一。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在內存中。區別的是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。
Redis優點
-
異常快速 : Redis是非常快的,每秒可以執行大約110000設置操作,81000個/每秒的讀取操作。
-
支持豐富的數據類型 : Redis支持最大多數開發人員已經知道如列表,集合,可排序集合,哈希等數據類型。
這使得在應用中很容易解決的各種問題,因為我們知道哪些問題處理使用哪種數據類型更好解決。 -
操作都是原子的 : 所有 Redis 的操作都是原子,從而確保當兩個客戶同時訪問 Redis 服務器得到的是更新后的值(最新值)。
-
MultiUtility工具:Redis是一個多功能實用工具,可以在很多如:緩存,消息傳遞隊列中使用(Redis原生支持發布/訂閱),在應用程序中,如:Web應用程序會話,網站頁面點擊數等任何短暫的數據;
安裝Redis環境
$sudo apt-get update $sudo apt-get install redis-server
啟動 Redis
$redis-server
查看 redis 是否還在運行
$redis-cli
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> ping PONG
Python操作Redis
sudo pip install redis or sudo easy_install redis or 源碼安裝 詳見:https://github.com/WoLpH/redis-py
在Ubuntu上安裝Redis桌面管理器
要在Ubuntu 上安裝 Redis桌面管理,可以從 http://redisdesktop.com/download 下載包並安裝它。
Redis API使用
redis-py 的API的使用可以分類為:
- 連接方式
- 連接池
- 操作
- String 操作
- Hash 操作
- List 操作
- Set 操作
- Sort Set 操作
- 管道
- 發布訂閱
連接方式
1、操作模式
redis-py提供兩個類Redis和StrictRedis用於實現Redis的命令,StrictRedis用於實現大部分官方的命令,並使用官方的語法和命令,Redis是StrictRedis的子類,用於向后兼容舊版本的redis-py。
import redis
r = redis.Redis(host='10.211.55.4', port=6379)
r.set('foo', 'Bar')
print r.get('foo')
2、連接池
redis-py使用connection pool來管理對一個redis server的所有連接,避免每次建立、釋放連接的開銷。默認,每個Redis實例都會維護一個自己的連接池。可以直接建立一個連接池,然后作為參數Redis,這樣就可以實現多個Redis實例共享一個連接池。
操作
1. String操作
redis中的String在在內存中按照一個name對應一個value來存儲。如圖:

set(name, value, ex=None, px=None, nx=False, xx=False)
在Redis中設置值,默認,不存在則創建,存在則修改
參數:
ex,過期時間(秒)
px,過期時間(毫秒)
nx,如果設置為True,則只有name不存在時,當前set操作才執行
xx,如果設置為True,則只有name存在時,崗前set操作才執行
setnx(name, value)
設置值,只有name不存在時,執行設置操作(添加)
setex(name, value, time)
設置值
參數:
time,過期時間(數字秒 或 timedelta對象)
mget(keys, *args)
psetex(name, time_ms, value)
設置值
參數:
time_ms,過期時間(數字毫秒 或 timedelta對象)
mset(*args, **kwargs)
批量設置值
如:
mset(k1=
'v1'
, k2=
'v2'
)
或
mget({
'k1'
:
'v1'
,
'k2'
:
'v2'
})
get(name)
獲取值
mget(keys, *args)
批量獲取
如:
mget(
'ylr'
,
'wupeiqi'
)
或
r.mget([
'ylr'
,
'wupeiqi'
])
getset(name, value)
設置新值並獲取原來的值
getrange(key, start, end)
獲取子序列(根據字節獲取,非字符)
參數:
# name,Redis 的 name
# start,起始位置(字節)
# end,結束位置(字節)
setrange(name, offset, value)
修改字符串內容,從指定字符串索引開始向后替換(新值太長時,則向后添加)
參數:
offset,字符串的索引,字節(一個漢字三個字節)
value,要設置的值
setbit(name, offset, value)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
# 對name對應值的二進制表示的位進行操作
# 參數:
# name,redis的name
# offset,位的索引(將值變換成二進制后再進行索引)
# value,值只能是 1 或 0
# 注:如果在Redis中有一個對應: n1 = "foo",
那么字符串foo的二進制表示為:
01100110
01101111
01101111
所以,如果執行 setbit(
'n1'
,
7
,
1
),則就會將第
7
位設置為
1
,
那么最終二進制則變成
01100111
01101111
01101111
,即:
"goo"
# 擴展,轉換二進制表示:
# source = "武沛齊"
source
=
"foo"
for
i
in
source:
num
=
ord
(i)
print
bin
(num).replace(
'b'
,'')
特別的,如果source是漢字
"武沛齊"
怎么辦?
答:對於utf
-
8
,每一個漢字占
3
個字節,那么
"武沛齊"
則有
9
個字節
對於漢字,
for
循環時候會按照 字節 迭代,那么在迭代時,將每一個字節轉換 十進制數,然后再將十進制數轉換成二進制
11100110
10101101
10100110
11100110
10110010
10011011
11101001
10111101
10010000
|
*用途舉例,用最省空間的方式,存儲在線用戶數及分別是哪些用戶在線
getbit(name, offset)
|
1
|
# 獲取name對應的值的二進制表示中的某位的值 (0或1)
|
bitcount(key, start=None, end=None)
|
1
2
3
4
5
|
# 獲取name對應的值的二進制表示中 1 的個數
# 參數:
# key,Redis的name
# start,位起始位置
# end,位結束位置
|
strlen(name)
|
1
|
# 返回name對應值的字節長度(一個漢字3個字節)
|
incr(self, name, amount=1)
|
1
2
3
4
5
6
7
|
# 自增 name對應的值,當name不存在時,則創建name=amount,否則,則自增。
# 參數:
# name,Redis的name
# amount,自增數(必須是整數)
# 注:同incrby
|
incrbyfloat(self, name, amount=1.0)
|
1
2
3
4
5
|
# 自增 name對應的值,當name不存在時,則創建name=amount,否則,則自增。
# 參數:
# name,Redis的name
# amount,自增數(浮點型)
|
decr(self, name, amount=1)
|
1
2
3
4
5
|
# 自減 name對應的值,當name不存在時,則創建name=amount,否則,則自減。
# 參數:
# name,Redis的name
# amount,自減數(整數)
|
append(key, value)
# 在redis name對應的值后面追加內容
# 參數:
key, redis的name
value, 要追加的字符串
