標籤:二進位 value 磁碟 取值 val memcach 參數 相容 port
一、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 API使用
redis-py 的API的使用可以分類為:
- 串連方式
- 串連池
- 操作
- String 操作
- Hash 操作
- List 操作
- Set 操作
- Sort Set 操作
- 管道
- 發布訂閱
3.1 串連方式
1. 操作模式
redis-py提供兩個類Redis和StrictRedis用於實現Redis的命令,StrictRedis用於實現大部分官方的命令,並使用官方的文法和命令,Redis是StrictRedis的子類,用於向後相容舊版本的redis-py。
import redishost = ‘172.16.200.49‘port = 6379r = redis.Redis(host=host, port=port)r.set(‘foo‘, ‘bar‘)print(r.get(‘foo‘))
2. 串連池
redis-py使用connection pool來管理對一個redis server的所有串連,避免每次建立、釋放串連的開銷。預設,每個Redis執行個體都會維護一個自己的串連池。可以直接建立一個串連池,然後作為參數Redis,這樣就可以實現多個Redis執行個體共用一個串連池。
import redishost = ‘172.16.200.49‘port = 6379pool = redis.ConnectionPool(host=host, port=port)r = redis.Redis(connection_pool=pool)r.set(‘foo‘, ‘bar‘)print(r.get(‘foo‘))
3.1 string操作
redis中的String在在記憶體中按照一個name對應一個value來儲存。
1.set(name, value, ex=None, px=None, nx=False, xx=False)
在Redis中設定值,預設,不存在則建立,存在則修改參數: ex,到期時間(秒) px,到期時間(毫秒) nx,如果設定為True,則只有name不存在時,當前set操作才執行 xx,如果設定為True,則只有name存在時,崗前set操作才執行
操作命令
# 設定一個k-vr.set(‘name‘, ‘bigberg‘)print(r.get(‘name‘))#設定到期時間為2秒# 2 秒後擷取該值為Noner.set(‘name‘, ‘bigberg‘, ex=2)print(r.get(‘name‘))time.sleep(2)print(r.get(‘name‘))
2. setnx(name, value)
設定值,只有name不存在時,執行設定作業(添加)如果是r.setnx(‘name‘, ‘Tom‘) 則name的值還是‘bigberg‘r.setnx(‘age‘, 22)print(r.get(‘age‘))
3. setex(name, value, time)
# 設定值# 參數: # time,到期時間(數字秒 或 timedelta對象)
4. psetex(name, time_ms, value)
# 設定值# 參數: # time_ms,到期時間(數字毫秒 或 timedelta對象)
5. mset(*args, **kwargs)
大量設定值如: mset({‘k1‘: ‘v1‘, ‘k2‘: ‘v2‘})r.mset({‘a‘: 1, ‘b‘: 2})print(r.get(‘a‘))print(r.get(‘b‘))
6. get(name)
擷取值
7. mget(keys, *args)
批量擷取如: mget(‘ylr‘, ‘wupeiqi‘) 或 r.mget([‘ylr‘, ‘wupeiqi‘])r.mset({‘a‘: 1, ‘b‘: 2})print(r.mget(‘a‘, ‘b‘))
8. getset(name, value)
設定新值並擷取原來的值# 會將原先的值先返回print(r.getset(‘name‘, ‘Tom‘))print(r.get(‘name‘))
9. getrange(key, start, end)
如果是中文字元,在utf-8編碼下,一個中文字元佔3個位元組r.set(‘address‘, ‘杭州‘)res = r.getrange(‘address‘, 0, 2)print(res.decode())
10. setrange(name, offset, value)
# 修改字串內容,從指定字串索引開始向後替換(新值太長時,則向後添加)# 參數: # offset,字串的索引,位元組(一個漢字三個位元組) # value,要設定的值r.setrange(‘address‘, 0, ‘蘇‘)print(r.get(‘address‘).decode())# 輸出蘇州r.setrange(‘name‘, 2, ‘ol‘)print(r.get(‘name‘).decode())# 輸出Tool # Tom 變成了 Tool
11. 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"#我們將Tool 改變為 Pool#則需要將T的ascii值 改為 P 的ASCII值print(r.get(‘name‘))r.setbit(‘name‘, 5, 0)print(r.get(‘name‘))# 輸出b‘Tool‘b‘Pool‘
12. getbit(name, offset)
# 擷取name對應的值的二進位表示中的某位的值 (0或1)print(r.getbit(‘name‘, 3))# 輸出1
13. bitcount(key, start=None, end=None)
# 擷取name對應的值的二進位表示中 1 的個數# 參數: # key,Redis的name # start,位起始位置 # end,位結束位置print(r.bitcount(‘name‘, 0, 20))# 輸出18
14. strlen(name)
# 返回name對應值的位元組長度(一個漢字3個位元組)print(r.strlen(‘address‘))# 輸出6
15. incr(self, name, amount=1)
# 自增 name對應的值,當name不存在時,則建立name=amount,否則,則自增。 # 參數: # name,Redis的name # amount,自增數(必須是整數)for i in range(5): print(r.incr(‘login_user‘))#輸出12345
16. incrbyfloat(self, name, amount=1.0)
# 自增 name對應的值,當name不存在時,則建立name=amount,否則,則自增。 # 參數: # name,Redis的name # amount,自增數(浮點型)for i in range(5): print(r.incrbyfloat(‘num‘, 1.2))# 輸出1.22.43.64.86.0
17. decr(self, name, amount=1)
# 自減 name對應的值,當name不存在時,則建立name=amount,否則,則自減。 # 參數: # name,Redis的name # amount,自減數(整數)for i in range(5): print(r.decr(‘login_user‘))# 輸出43210
18. append(key, value)
# 在redis name對應的值後面追加內容 # 參數: key, redis的name value, 要追加的字串print(r.get(‘address‘).decode())print(r.append(‘address‘, ‘西湖區‘))print(r.get(‘address‘).decode())# 輸出杭州15杭州西湖區
Python使用redis介紹