Redis
介紹
redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在內存中。區別的是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。
特點:
- 以字典結構存儲數據
- 允許通過TCP協議讀取字典的內容
- 強大的緩存系統, 可以為每個鍵設置TTL, 以及按照一定規則自動淘汰不需要的鍵
- 支持使用列表的形式構造任務隊列
- 數據存儲在內存中也可以持久化到硬盤
一、Redis安裝和基本使用
1、安裝
wget http://download.redis.io/releases/redis-3.2.8.tar.gz tar xzf redis-3.2.8.tar.gz cd redis-3.2.8
make && make install
redis安裝在/usr/local/bin/
目錄
redis-benchmark: ==> 性能測試工具 redis-check-aof: ==> AOF文件修復工具 redis-check-dump: => RDB文件檢查工具 redis-cli: ==> 命令行客戶端 redis-sentinel: => 幫助管理redis實例的工具 redis-server: ==> redis服務器
啟動服務端
#三種啟動方式 redis-server 默認端口6379 redis-server --port 端口號 redis-server /path/to/redis.conf 啟動時的配置文件將覆蓋系統同名配置項
2、Redis的部署
先為了方便管理,將Redis文件中的conf配置文件和常用命令移動到統一文件中
修改redis.conf配置文件,我們使用redis安裝目錄中的redis.conf作為配置文件,將其拷貝到/usr/local/etc目錄,以后運行redis服務,就指定該配置文件。
后台啟動redis服務
a)首先編輯conf文件,將daemonize屬性改為yes(表明需要在后台運行)
cd etc/
Vi redis.conf
daemonize yes
b)再次啟動redis服務,並指定啟動服務配置文件
redis-server /usr/local/redis/etc/redis.conf
Redis 操作常用命令
Redis-server /usr..../redis.conf 啟動redis服務,並指定配置文件 Redis-cli 啟動redis 客戶端 Pkill redis-server 關閉redis服務 Redis-cli shutdown 關閉redis客戶端 Netstat -tunpl|grep 6379 查看redis 默認端口號6379占用情況
二、Python操作Redis
1、安裝redis-py
pip install redis
API使用
redis-py 的API的使用可以分類為:
- 連接方式
- 連接池
- 操作
- String 操作
- Hash 操作
- List 操作
- Set 操作
- Sort Set 操作
- 管道
- 發布訂閱
2、使用 redis-py
redis-py提供兩個類Redis和StrictRedis用於實現Redis的命令,StrictRedis用於實現大部分官方的命令,並使用官方的語法和命令,Redis是StrictRedis的子類,用於向后兼容舊版本的redis-py。
直接使用
import redis r = redis.Redis(host='192.168.49.130', port=6379) r.set('foo', 'Bar') print r.get('foo')
創建連接池:
redis-py使用connection pool來管理對一個redis server的所有連接,避免每次建立、釋放連接的開銷。默認,每個Redis實例都會維護一個自己的連接池。可以直接建立一個連接池,然后作為參數Redis,這樣就可以實現多個Redis實例共享一個連接池。
import redis pool = redis.ConnectionPool(host='192.168.49.130', port=6379) r = redis.Redis(connection_pool=pool) #r = redis.StrictRedis(connection_pool=pool) #StrictRedis也是支持的 r.set('foo', 'Bar') print r.get('foo')
三、操作
a、String操作
redis中的String在在內存中按照一個name對應一個value來存儲。如圖:
設值
1、set
set(name, value, ex=None, px=None, nx=False, xx=False) #設值
在Redis中設置值,默認,不存在則創建,存在則修改
參數: ex,過期時間(秒) px,過期時間(毫秒) nx,如果設置為True,則只有name不存在時,當前set操作才執行 xx,如果設置為True,則只有name存在時,崗前set操作才執行
2、setnx
setnx(name, value) #設值,只有name不存在時,執行設置操作(添加)
3、setex
setex(name, value, time) # 設值, 參數:time,過期時間(數字秒 或 timedelta對象)
4、psetex
psetex(name, time_ms, value) # 設值 參數:time_ms,過期時間(數字毫秒 或 timedelta對象)
5.mset
mset(*args, **kwargs) #批量設值 #如: mset(k1='v1', k2='v2') # 或 mget({'k1': 'v1', 'k2': 'v2'})
取值
1、get
get(name) #取值
2、mget
mget(keys, *args) #批量獲取 #如: mget('name', 'age') # 或 r.mget(['name', 'age'])
3、getset
getset(name, value) #設置新值並獲取原來的值
bit方式取值設值
1、getrange
getrange(key, start, end) # 獲取子序列(根據字節獲取,非字符) # 參數: # name,Redis 的 name # start,起始位置(字節) # end,結束位置(字節) # 如: "神一樣的人兒" ,0-3表示 "神"
2、setrange
setrange(name, offset, value) # 修改字符串內容,從指定字符串索引開始向后替換(新值太長時,則向后添加) # 參數: # offset,字符串的索引,字節(一個漢字三個字節) # value,要設置的值
3、setbit
setbit(name, offset, value) # 對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
4、getbit
getbit(name, offset) # 獲取name對應的值的二進制表示中的某位的值 (0或1)
5、bitcount
bitcount(key, start=None, end=None) # 獲取name對應的值的二進制表示中 1 的個數 # 參數: # key,Redis的name # start,位起始位置 # end,位結束位置
6、bitop
bitop(operation, dest, *keys) # 獲取多個值,並將值做位運算,將最后的結果保存至新的name對應的值 # 參數: # operation,AND(並) 、 OR(或) 、 NOT(非) 、 XOR(異或) # dest, 新的Redis的name # *keys,要查找的Redis的name # 如: bitop("AND", 'new_name', 'n1', 'n2', 'n3') # 獲取Redis中n1,n2,n3對應的值,然后講所有的值做位運算(求並集),然后將結果保存 new_name 對應的值中
獲取值的長度
strlen
strlen(name) # 返回name對應值的字節長度(一個漢字3個字節)
自增
1、incr
incr(self, name, amount=1) # 自增 name對應的值,當name不存在時,則創建name=amount,否則,則自增。 # 參數: # name,Redis的name # amount,自增數(必須是整數) # 注:同incrby
2、incrbyfloat
incrbyfloat(self, name, amount=1.0) # 自增 name對應的值,當name不存在時,則創建name=amount,否則,則自增。 # 參數: # name,Redis的name # amount,自增數(浮點型)
3、decr
decr(self, name, amount=1) # 自減 name對應的值,當name不存在時,則創建name=amount,否則,則自減。 # 參數: # name,Redis的name # amount,自減數(整數)
追加
append
append(key, value) # 在redis name對應的值后面追加內容 # 參數: key, redis的name value, 要追加的字符串
更多參見:https://github.com/andymccurdy/redis-py/
http://doc.redisfans.com/