Web後端學習筆記 Flask (14)redis

redis介紹:

redis是一種noSQL數據庫,它的數據是保存在內存中,同時,redis可以定時把內存中的數據同步到磁盤,即可以將數據持久化,並且它比memcached支持更多的數據結構,string, list, set, sorted_set, hash

redis應用場景:

1. 登陸會話存儲,存儲在redis中,與memcached相比,數據不會丟失

2. 計數器/排行榜: 這種數據訪問的頻率很高,且不停的在刷新。

3. 作爲消息隊列:比如celery就是使用redis作爲中間人

4. 當前在線人數,會顯示當前系統有多少人在線

5. 一些常用的數據,可以使用redis緩存,而不用每次登陸都要請求數據庫

6. 可以將前200篇文章或者評論緩存,一般用戶瀏覽網站,只會瀏覽前面一部分文章或者評論,所以可以將前面一部分的數據緩存起來,當用戶訪問超過時,再去請求數據庫,並且當文章超過200且有更新時,redis章的數據也跟着更新。

8. 發佈和訂閱功能,可以用來做聊天軟件

redis和memcached的比較:
 

  memcached redis
類型 純內存數據庫 內存+磁盤同步
數據類型 在定義val時固定數據類型 不需要
虛擬內存 不支持 支持
過期策略 支持 支持
存儲數據安全 不支持 可以將數據同步到dump.db中
災難恢復 不支持 可以將磁盤中的數據恢復到內存中
分佈式 支持 主從同步
訂閱與發佈 不支持 支持

虛擬內存:操作系統在內存不夠用的時候,將硬盤虛擬化爲內存。

Redis安裝與連接:
redis官方只支持linux系統:

可以嘗試安裝window下的redis服務,然後我們的主要目標是通過python來操作redis

windows下redis的下載地址:

Github 下載地址:https://github.com/microsoftarchive/redis/releases

這裏選擇下載msi安裝文件,點擊安裝文件:
 

點擊安裝包,開始安裝:

點擊next即可:

設置redis的安裝目錄,以及勾選將redis添加到環境變量,此時會將Redis 設置成 windows 下的服務,否則每次都要在該目錄下啓動命令 redis-server redis.windows.conf,但是隻要一關閉 cmd 窗口,redis 就會消失,這樣就比較麻煩。

然後保持redis默認端口不變:

關於最大內存設置:

1. 如果是將redis作爲數據庫使用,那不需要設置這個選項,應爲設置了固定的大小,在內存超出這個設定的時候,數據就會丟失

2. 如果是作爲緩存,那麼可以按需設置redis的最大內存限制,設置了最大內存限制,redis在啓動之後會將數據加載到內存中。g當數據超過最大內存限制之後,redis會將過期或者即將過期的數據清除,如果內存依然超過最大限制,則此時redis將不能寫入數據,但是可以正常讀取數據。

這裏是最爲緩存使用的,所以設置最大的內存限制爲500M;安裝即可

安裝完成後,可以在資源管理器中看到Redis已經在運行了:

此時先停止redis服務

設置redis密碼(默認是沒有密碼的):找到下面的兩個文件,打開後分別是requirepass的值:

在cmd下,cd到redis安裝的根目錄:執行redis-server.exe redis.windows.conf

此時表示redis安裝成功。

在資源管理器中,首先確定已經啓動了Redis服務,如果沒有啓動,先手動啓動Redis服務:

然後在命令行中執行命令:redis-cli -a 123456ff,即可連接到redis:

redis字符串以及過期時間設置:

常用方法:

1. set key val  設置

2. get key

3. del key

4. set key val EX 10   設置過期時間,默認爲永不過期

5. ttl key  查看過期時間

6. expire key time     重新爲key設置過期時間

7. keys *    獲取redis中所有的鍵

Redis列表操作:

1. lpush key value    在列表左邊添加元素

2. rpush key value     在列表右邊添加元素

3. lrange key start stop    查找列表中的元素,start起始位置, stop結束位置     0第一個元素的索引      -1最後一個元素的索引

4. lpop  key   移除並返回列表key的頭元素

5. rpop  key   移除並返回列表key的尾元素

6. lindex key index   查看下錶爲index的元素

7. llen key 返回列表的長度

8. lrem key count val    刪除列表中的指定元素

count >0 從表頭開始向表尾搜索,移除值爲value的元素,移除的數量爲count個

count <0 從表尾開始向表頭搜索,移除值爲value的元素,移除的數量爲-count個

count=0  表示刪除所有值爲value的元素

Redis集合操作:

集合:

1. 數據不能重複

2. 列表中的元素是有序的,而列表中的元素是無序的。

集合的操作:

1. sadd key val1 val2 val3      給集合中添加元素

2. srem key val1 val2             移除集合中的元素

3. scard key                           查看集合中的元素個數

4. sinter key1 key2                 查看兩個集合的交集

5. sunion key1 key2               查看兩個集合的並集

6. sdiff  key1, key2                查看兩個集合的差集

Redis Hash操作:(在python中爲字典)

哈希: 字典中的字典:person
{

      "username": "tom",

       "person": {

        "name": "xxx",

        "age":  22

        }

}

1. hset key field value        將hash表key中的域field的值設置爲value

hset person name xxx

hmset person name xxx age 22 sahool high-school        一次添加多個鍵值對

2. hget key  field                獲取哈希中field域的值

hget person name

3. hdel key field                刪除哈希表中field域

hdel person name

4. hgetall key                    獲取hash中的所有鍵值對

5. hkeys key                      獲取哈希中所有的鍵

6. hvals key                       獲取哈希中所有的值

7. hexists key field            判斷哈希中是否存在某個鍵

hexists person name      

8. hlen key   獲取哈希中所有的鍵值對

hlen person

Redis事務操作:

redis事務一次可以執行多個命令,事務具有以下特徵:

隔離操作: 事務中的所有命令都會序列化,按順序的執行,不被其他命令打擾

原子操作:事務中的命令要麼全部被執行,要麼全部都不執行

開啓一個事務:

multi命令開啓一個事務, 然後編寫一些列的命令

執行事務:

exec命令用於執行事務

取消事務:

discard命令用於取消事務

1. 監視一個或者多個key:   watch key    如果在事務執行之前,這些key被其他的命令所改動,那麼事務將被打斷

2. 取消所有key的監視     unwatch

Redis發佈/訂閱操作: 

Redis發佈,相當於發送消息,而訂閱,相當於監聽,監聽是否有消息發送過來

發佈,首先要指定將消息發佈到哪一個頻道上去,訂閱,也要指定是在監聽哪一個頻道

subscribe channel   開始監聽

publish channen message   發佈信息

可以訂閱多個頻道

實際的應用場景:發送郵件,python代碼操作redis發送郵件

RDB和AOF兩種數據持久化機制:

在redis.conifg文件中:  數據同步方式

save 900 1                      在900秒內發生1次數據更新,則把數據同步到RDB文件中

save 300 10                    在300秒內發生10次數據更新,則把數據同步到RDB文件中

save 60 10000                在60秒內發生10000次數據更新,則把數據同步到RDB文件中

redis默認的是RDB數據持久化機制

關閉RDB,只需要將config文件中的所有的save註釋掉

  RDB AOF
開啓關閉 默認開啓;關閉:將配置文件中所有的save都註釋了 在配置文件中,appendonly yes就開啓了AOF,no爲關閉
同步機制 可以指定某個時間內發生多少次數據更新則進行同步save 300 10 每秒同步或者每次發生數據更新後同步
存儲內容 存儲的是redis裏面的具體值 存儲的是redis中執行寫操作的命令
存儲文件的路徑 根據dir以及filename來指定具體的存儲路徑和文件名 根據dir以及appendfiename來指定具體的路徑和文件名
優點

1.存儲數據到文件中會進行壓縮,文件體積比AOF小。

2. 存儲的是redis中數據的具體值,並且經過壓縮,所以在恢復的時候比AOF塊,非常適用於備份

1. AOF的策略是每秒鐘或者每次發生寫操作的時候,都會進行數據同步,因此即使服務器發生故障,最多隻丟失1秒的數據。

2. AOF存儲的是Redis命令,並且是直接追加到aof文件後面,因此每次備份的時候只需添加新的命令進去就可以了。

3. 如果AOF文件比較大了,redis會進行重寫,只保留最小的命令集合

缺點

1. RDB在多少時間內發生多少次寫操作的時候,就會發出同步機制,因爲採用壓縮機制,RDB在同步的時候都重新保存整個redis中的數據,因此一般會設置最少5分鐘才保存一次數據,在這種情況下,一旦服務器故障,會造成5分鐘的數據丟失

2. 載數據保存進RDB的時候,Redis會fork出一個子進程來進行數據同步,在數據量比較大的時候,可能會非常耗時

1. AOF文件沒有壓縮,所以體積會比RDB文件大。

2. AOF是在每秒或者每次寫操作的時候都進行備份,因此如果併發量比較大,效率可能有點慢。

3. AOF文件因爲存儲的是命令,因此在災難恢復的時候,會重新運行AOF中的命令,速度不及RDB

 

AOF中數據同步的策略:

appendsync always   只要發生一次數據更新, 就進行同步

appendsync everysec    每秒鐘進行一次同步

appendsync no         使用操作系統的同步機制,通常是30s同步一次數據

其他機器連接本機Redis:

如果想讓其他機器連接本機的redis,那麼應該在redis.config配置文件中,指定bind 本機IP。這樣別的機器就能連接成功

python操作Redis:

安裝redis:pip install redis-i https://pypi.douban.com/simple/

相當於一個驅動,可以通過這個python包來操作redis

# -*- coding: utf-8 -*-

from redis import Redis

# 初始化redis實例對象
cache = Redis(host="127.0.0.1", port="6379", password="123456ff")

# 字符串操作
cache.set(name="username", value="tom", ex=120)    # ex是設定過期時間
username = cache.get(name="username")
print(username)

cache.delete("username")
username = cache.get("username")
print(username)


# 列表操作
cache.rpush("language", "java")
cache.rpush("language", "python")
cache.rpush("language", "C++")
cache.rpush("language", "php")
cache.expire(name="language", time=120)
print(cache.lrange("language", start=0, end=-1))

# 集合操作
cache.sadd("teammate", "zhang")
cache.sadd("teammate", "tom")
cache.sadd("teammate", "kong")
cache.expire(name="teammate", time=120)
print(cache.smembers(name="teammate"))

# hash操作
cache.hset(name="person", key="name", value="took")
cache.hset(name="person", key="age", value="moon")
cache.hset(name="person", key="address", value="street No.1")
cache.expire(name="person", time=120)
print(cache.hgetall(name="person"))

# 事務操作
pipeline = cache.pipeline()
pipeline.set(name="name", value="kitty", ex=100)
pipeline.rpush("candidate", ["coon", "mood", "cooker"])
pipeline.expire(name="candidate", time=120)
pipeline.execute()

發佈與訂閱:

異步發送郵件,在訂閱之後,只需通過頻道發送一個消息,訂閱方會在收到消息後,自動發送郵件

發送消息:

# -*- coding: utf-8 -*-

from redis import Redis

# 初始化redis實例對象
cache = Redis(host="127.0.0.1", port="6379", password="123456ff")

for x in range(3):
    # 發佈消息
    cache.publish(channel="email", message="[email protected]")   # 發佈的頻道,及消息

接收消息:

# -*- coding: utf-8 -*-

from redis import Redis

# 初始化redis實例對象
cache = Redis(host="127.0.0.1", port="6379", password="123456ff")


# 發佈與訂閱   異步發送郵件的功能
ps = cache.pubsub()
ps.subscribe("email")     # 訂閱
while True:
    # ps.listen()      # 開始監聽
    for item in ps.listen():      # 監聽到消息
        # print(item)
        if item.get("type") == "message":
            data = item.get("data")
            print(data)
            # 可以進行發送郵件操作

監聽到的消息,item的數據如下所示:

如果item中的字段爲message,則表示收到發佈信息,data字段中爲收到的信息。channel爲發佈的頻道。

--------------------------------------------------------------------------------------------------------

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章