redis是一個key-value儲存系統。和Memcached類似,它支援儲存的value型別相對更多,包括string(字串)、list(連結串列)、set(集合)、zset(sorted set --有序集合)和hash(雜湊型別)。這些資料型別都支援push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支援各種不同方式的排序。與memcached一樣,為了保證效率,資料都是快取在記憶體中。區別的是redis會週期性的把更新的資料寫入磁碟或者把修改操作寫入追加的記錄檔案,並且在此基礎上實現了master-slave(主從)同步。
Redis 是一個高效能的key-value資料庫。 redis的出現,很大程度補償了memcached這類key/value儲存的不足,在部 分場合可以對關聯式資料庫起到很好的補充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等使用者端,使用很方便。
Redis支援主從同步。資料可以從主伺服器向任意數量的從伺服器上同步,從伺服器可以是關聯其他從伺服器的主伺服器。這使得Redis可執行單層樹複製。存檔可以有意無意的對資料進行寫操作。由於完全實現了釋出/訂閱機制,使得從資料庫在任何地方同步樹時,可訂閱一個頻道並接收主伺服器完整的訊息釋出記錄。同步對讀取操作的可延伸性和資料冗餘很有幫助。
redis的官網地址,非常好記,是redis.io。(域名字尾io屬於國家域名,是british Indian Ocean territory,即英屬印度洋領地),Vmware在資助著redis專案的開發和維護。
針對以上的小總結:
redis為什麼速度那麼快?
首先Mac或Linux系統直接官網原始碼下載編譯安裝即可,但是Windows不支援該方法,因此我去這裡下載
整個過程非常方便,一直下一步即可完成安裝
方法一:在cmd終端以此敲以下兩個命令即可啟動
redis-server # 啟動伺服器端 類似於mysqld命令
redis-cli # 啟動使用者端 類似於mysql命令
第二種方法:在服務中手動啟動redis服務也是可以的
第一步:下載安裝RESP軟體(因為安裝該軟體件幾乎沒有什麼難度因此沒有詳細介紹步驟)
第二步:與redis資料庫連結步驟圖解
方法一:普通連線
# 首先下載第三方模組
pip install redis
# 新建指令碼py檔案
# 第一:步匯入模組
from redis import Redis
# 第二步:範例化,連線資料庫
conn = Redis(host='127.0.0.1', port=6379)
# 第三步:conn.物件設定資料
conn.set('name','mire')
# 查詢資料
res = conn.get('name')
print(res)
# 第四步:最後使用完之後需要關閉連線
conn.close()
設定資料結果
查詢資料結果
方法二:連線池連線
# 新建pool.py檔案,寫以下程式碼
import redis
POOL = redis.ConnectionPool(max_connections=10, host='127.0.0.1', port=6379) # 建立一個大小為10的redis連線池
# 在測試檔案寫以下程式碼
import redis
from threading import Thread
from pool import POOL
def task():
# 做成模組後,匯入,無論匯入多少次,匯入的都那一個POOL物件
conn = redis.Redis(connection_pool=POOL) # 報錯的原因是拿連線,池裡不夠了,沒有等待,執行緒報錯 設定等待,引數
print(conn.get('name'))
for i in range(10):
t = Thread(target=task) # 每次都是一個新的連線,會導致 的連線數過多
t.start()
1. 字串(string)
2. 雜湊(字典hash)
3. 列表(list)
4. 集合(set)
5. 有序集合(sort set)
全部操作
set(name, value, ex=None, px=None, nx=False, xx=False)
setnx(name, value)
setex(name, value, time)
psetex(name, time_ms, value)
mset(*args, **kwargs)
get(name)
mget(keys, *args)
getset(name, value)
getrange(key, start, end)
setrange(name, offset, value)
setbit(name, offset, value)
getbit(name, offset)
bitcount(key, start=None, end=None)
bitop(operation, dest, *keys)
strlen(name)
incr(self, name, amount=1) # incrby
incrbyfloat(self, name, amount=1.0)
decr(self, name, amount=1)
append(key, value)
重點操作
set(name, value, ex=None, px=None, nx=False, xx=False)
"""
ex,過期時間(秒)適合存驗證碼資訊的場景
px,過期時間(毫秒)
nx,如果設定為True,則只有name不存在時,當前set操作才執行, 值存在,就修改不了,執行沒效果
xx,如果設定為True,則只有name存在時,當前set操作才執行,值存在才能修改,值不存在,不會設定新值
"""
get(name) # 括號裡面的引數是key
print(str(conn.get('name'),encoding='utf-8'))
print(conn.get('name'))
strlen(name) # 統計位元組長
res=conn.strlen('hobby')
print(res)
incr(self, name, amount=1) # 自增,不會出並行安全問題,單執行緒架構,並行量高
conn.incr('age')