一、介紹Redis
1. 詳細介紹
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專案的開發和維護。
2. 介紹總結
針對以上的小總結:
- redis是快取資料庫
- redis是非關係型資料庫,kv鍵值對儲存資料,沒有表的概念
- redis是C語言編寫的服務,速度非常快
redis為什麼速度那麼快?
- 純記憶體操作所以速度如此之快
- 網路模型使用的IO多路複用所以高併發
- 6.X版本之前都是單程式、單執行緒架構,沒有執行緒程式間切換因此資源消耗更少
二、安裝啟動以及執行Redis
1. Redis的安裝步驟
首先Mac或Linux系統直接官網原始碼下載編譯安裝即可,但是Windows不支援該方法,因此我去這裡下載
整個過程非常方便,一直下一步即可完成安裝
2. Redis的啟動方法
方法一:在cmd終端以此敲以下兩個命令即可啟動
redis-server # 啟動服務端 類似於mysqld命令
redis-cli # 啟動客戶端 類似於mysql命令
第二種方法:在服務中手動啟動redis服務也是可以的
3.圖形化介面使用Redis
第一步:下載安裝RESP軟體(因為安裝該軟體件幾乎沒有什麼難度因此沒有詳細介紹步驟)
第二步:與redis資料庫連結步驟圖解
4.pycharm使用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()
設定資料結果
查詢資料結果
方法二:連線池連線
那麼為什麼要使用連線池呢?為了防止我們的專案一下子連線較多的程式導致將專案執行速度變慢,效率降低,導致CPU效能低。
# 新建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()
三、redis五大資料型別
1. 字串(string)
2. 雜湊(字典hash)
3. 列表(list)
4. 集合(set)
5. 有序集合(sort set)
1. 字串及其操作
全部操作
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')