主頁 > 後端開發 > Django筆記:Redis鍵值對資料庫

Django筆記:Redis鍵值對資料庫

2020-11-02 19:16:55 後端開發

Redis是一種nosql資料庫(非關系型資料庫),它的資料是以鍵值對的形式保存在記憶體中的,同時也可以定時將資料同步到磁盤檔案中,即實作資料的持久化,相比于Memcached快取系統,它支持更多的資料結構,如stringlist(佇列和堆疊)、set(集合)、sorted set(有序集合)、hash(hash表)等,本文只是簡單整理了下學習筆記,感興趣的話可以查看中文官方檔案,

一、使用場景和特點

1. 常用的使用場景

  1. 登錄會話存盤:存盤在Redis中,與Memcached相比,資料不會丟失,
  2. 排行榜或計數器:一些實時的排行或計數都可以采用Redis來實作,
  3. 訊息佇列:如celery就是使用Redis作為中間人,
  4. 當前在線人數:實時的資料,但是又不需要存盤到資料庫中,可以采用Redis來實作,
  5. 常用的資料快取:如論壇的首頁等不會經常變化的資料存盤到Redis中,
  6. 前100文章或評論進行快取:一般情況下,用戶瀏覽資料只會瀏覽前面的部分,可以把這些經常訪問的資料快取到Redis資料庫中,
  7. 好友關系:微博的好友關系就是使用Redis實作的,
  8. 發布和訂閱功能:可以用來做聊天軟體,

2. 和Memcached的比較

比較項 Memcached Redis
型別 純記憶體快取系統 記憶體到磁盤同步資料庫
資料型別 在定義value時就需要指定資料型別 不需要
虛擬記憶體 不支持 支持
過期策略 支持 支持
存盤資料安全 不支持 可以將資料同步到磁盤檔案中
災難恢復 不支持 可以將磁盤中的資料恢復到記憶體中
分布式 支持 支持,主從同步方式
訂閱與發布 不支持 支持

二、安裝和使用

1. 安裝與連接

Redis是不支持Windows系統的,只能在Linux上進行操作,以下示例的命令以ubuntu系統為例,
安裝:sudo apt-get install redis-server
卸載:sudo apt-get purge --auto-remove redis-server
啟動:安裝后默認自動啟動,可以通過命令查看行程資訊ps aux|grep redis,也可以通過命令手動啟動sudo service redis-server start(重啟就是restart),
停止:sudo service redis-server stop
連接redis-server:可以使用命令redis-cli進行連接,相當于Redis的客戶端,命令格式為redis-cli -h [ip] -p [port],如redis-cli -h 127.0.0.1 -p 6379,Redis默認的啟動埠為6379,
設定密碼:在組態檔/etc/redis/redis.conf中放開requirepass password項,并將password替換為對應的密碼即可,設定密碼后還是可以正常連接,但是連接之后需要先執行auth [password]后才能進行正常的資料更新等操作,不然無法進行正常的操作,當然也可以在連接時是用-a引數指定密碼,如redis-cli -h 127.0.0.1 -p 6379 -a 123456
其他機器連接本機Redis:默認只能本機連接,如果想要其他機器也能連接到本機的Redis,則需要在組態檔/etc/redis/redis.conf中給bind 127.0.0.1之后添加具體的本機ip,如bind 127.0.0.1 xxx.xxx.xxx.xxx,其他機器就能通過后面這個ip來進行連接了,

2. 常用基礎操作

添加:使用setget命令進行資料的添加和獲取,添加資料時默認為字串型別,如果設定的值中含有空格則需要使用雙引號包裹起來,

127.0.0.1:6379> set username zhangsan
OK
127.0.0.1:6379> get username
"zhangsan"
127.0.0.1:6379> set username "zhang san"
OK
127.0.0.1:6379> get username
"zhang san"

洗掉:使用del命令進行洗掉,

127.0.0.1:6379> del username
(nil)

設定過期時間:添加資料時如果沒有設定過期時間,則默認為永久不過期,可以采用兩種方式設定過期時間,一種是在添加值時進行設定:set key value EX timeoutsetex key timeout value,另一種是對已經存在的值進行設定:expire key timeouttimeout單位為秒,
查看過期時間:通過命令ttl key進行查看,
查看所有的key:通過命令keys *進行查看,
洗掉全部資料:flushall洗掉全部鍵值對,實際作業中慎用,

3. 常用串列操作

Redis中串列操作是有專門的命令來執行的,而不是先創建一個串列,再對串列進行操作,
在串列頭/尾添加資料:lpush/rpush key value,將value插入到key對應的串列的表頭/尾,如果key不存在,則創建一個空串列并執行lpush/rpush操作,如果key對應的值不是串列,則會回傳一個錯誤,
查看串列元素:lrange key start stop,回傳串列內指定區間的元素,如果要查看全部元素,則可以使用命令lrange key 0 -1
移除串列頭/尾元素:lpop/rpop key,移除(彈出)串列頭/尾的一個元素并回傳,
移除串列多個元素:lrem key count value,洗掉串列中指定count個數的value元素,count大于0時,表示從表頭開始搜索并洗掉指定個數值為value的元素;count小于0時,表示從表尾開始搜索并洗掉指定個數(絕對值)值為value的元素;count等于0時,表示洗掉全部值為value的元素,
根據索引查看串列元素:lindex key index,查看指定索引的元素,
查看串列元素個數:llen key,查看串列中的元素個數,

4. 常用集合操作

同串列一樣,不需要先創建集合,再進行集合操作,在往key中添加集合資料時,如果沒有則會自動創建該集合,
添加集合元素:sadd key value1 value2 ...,往集合中添加資料,可以一次添加多個值,
查看集合元素:smembers key,查看集合中的元素,
移除集合元素:srem key value1 value2,移除集合中的元素,可以一次移除多個元素,
查看集合中的元素個數:scard key,查看集合中的元素個數,
查看多個集合的交集:sinter key1 key2,查看多個集合的交集,
查看多個集合的并集:sunion key1 key2,查看多個集合的并集,
查看多個集合的差集:sdiff key1 key2,查看多個集合的差集,

5. 常用hash操作

哈希操作指的是value的資料型別為字典,同樣的,不需要先創建hash表(字典)再進行操作,在添加資料時,如果hash表不存在則會自動創建,
添加資料:hset key field value,在key對應的hash表(字典)中添加一個新的鍵值對field/valuehmset key field1 value1 field2 value2 ...:一次添加多個鍵值對,
查看資料:hget key field,查看key對應的hash表(字典)中field對應的值,
洗掉資料:hdel key field,洗掉key對應的hash表(字典)中field對應的值,
查看所有的子鍵值對:hgetall key,查看key對應的hash表(字典)中所有的field/value
查看所有的key:hkeys/hvals key,查看key對應的hash表(字典)中所有的fieldvalue
查看是否存在某個key:hexists key field,查看key對應的hash表(字典)中是否存在指定的field
查看子鍵值對個數:hlen key,查看查看key對應的hash表(字典)中的鍵值對個數,

6. 常用事務操作

Redis事務可以一次執行多個命令,具有以下兩個基本特征:

  • 隔離操作:事務中的所有命令都會序列化、按順序執行,不會被打斷,
  • 原子操作:事務中的命令要么全部執行,要么全部不執行,

開啟一個事務:multi,執行這個命令后就開啟了一個事務,之后的所有命令都不會被真正的執行,而是在執行該事務的時候一起執行事務中的所有命令,
執行事務:exec,執行事務中的所有命令,如果事務中的命令有報錯,則該事務也會執行失敗,
取消事務:discard,在使用multi命令后,執行exec命令之前,可以使用discard命令取消并退出事務,
監視:watch key1 key2 ..,監視一個或多個key,在指定監視后,在定義事務程序中,如果該key的值發生了變化,那么執行事務時,對該key的值的修改將不會生效,
取消監視:unwatch,取消監視所有的key

7. 發布訂閱操作

給某個頻道發布訊息:publish channel messagechannel名稱和message內容都可以自定義,
訂閱某個頻道的訊息:subscribe channel1 channel2 ...,執行這個命令后,程式相當于進入了一個死回圈,會一直等待發布者發布訊息,一旦發布者發布了訊息,那么此訂閱程式就能馬上收到訊息,

三、持久化機制

Redis提供了兩種持久化機制或者說備份方式,即RDB和AOF,它們的存盤方式都是存盤在磁盤的特定檔案中,這兩種方式的配置資訊都在組態檔/etc/redis/redis.conf中,它們各自的特點可以參考如下表格,

比較項 RDB AOF
開啟和關閉 默認開啟,如果想要關閉,則注釋掉組態檔中SNAPSHOTTING下相關save即可,如save 900 1表示如果900秒內發生了一次資料更新操作則進行一次同步,其他save也是同理,相當于每隔一定時間會檢查一次,如果資料更新次數達到配置的要求則會進行同步,這也是RDB默認的同步機制, 默認關閉,如果想要開啟,修改組態檔中appendonly noappendonly yes即可,
同步機制 根據組態檔中save項配置值,每隔一定時間會檢查一次,如果資料更新次數達到配置的要求則會進行同步, 組態檔中提供了三種同步方式,可以根據需要打開對應的同步方式即可:appendfsync always(每發生一次更新操作則同步一次),appendfsync everysec(默認,每秒同步一次),appendfsync no(采用作業系統的更新方式,每30秒同步一次),
存盤內容 存盤的是具體的鍵值對,如username: zhangsan,并且資料是經過壓縮的, 存盤的是對應的操作命令,如set username zhangsan,且資料沒有經過壓縮,
存盤檔案的路徑 根據組態檔中dir(默認/var/lib/redis)和dbfilename(默認dump.rdb)兩個引數來指定, 根據組態檔中dir(默認/var/lib/redis)和appendfilename(默認appendonly.aof)兩個引數來指定,
優點 1)因為存盤的資料經過壓縮,所以檔案體積比AOF小,2)因為存盤的是具體的鍵值對,所以恢復速度比AOF塊,3)適用于備份操作, 1)因為默認是每秒同步一次,所以即使發生了故障,丟失的資料也不會太多,2)因為存盤的時候是在檔案末尾追加命令,所以備份速度會比較快,3)如果檔案過大時,AOF會對檔案中的命令進行重寫,只保留最小的命令集,
缺點 1)因為每次同步都會將整個檔案重新壓縮一次,所以一般會將同步的時間間隔設定的較長,而在這個時間內如果發生故障,則會丟失對應的資料,2)每次同步Redis都會fork出一個子行程來進同步操作,當資料量比較大的時候可能會非常耗時, 1)因為檔案沒有經過壓縮,所以檔案體積會比RDB大,2)因為每秒就會進行一次同步,所以并發量較大時,效率可能會較低,3)因為存盤的是命令,所以在災難恢復的時候會比RDB慢,

四、Python操作Redis

安裝:pip install redis
Python中對應操作的方法名大多和客戶端操作時的命令是一致的,可以參考命令來使用,下面只展示部分的操作方法,更多方法可以查看原始碼,

from redis import Redis

# 連接Redis
cache = Redis(host='192.168.1.17', port=6379, password='123456')

# 1. 普通鍵值對,即value為字串型別
# 添加資料,可以使用ex引數指定過期時間
cache.set('username', 'zhangsan')
# 獲取資料
print(cache.get('username'))
# 洗掉資料
cache.delete('username')

# 2. 串列操作
# 添加資料
cache.lpush('languages', 'python')
cache.lpush('languages', 'java')
# 獲取資料
print(cache.lrange('languages', 0, -1))

# 3. 集合操作
# 添加資料
cache.sadd('person', 'zhangsan')
cache.sadd('person', 'lisi')
# 獲取資料
print(cache.smembers('person'))

# 4. hash操作
# 添加資料
cache.hset('person', 'name', 'zhangsan')
cache.hset('person', 'age', '18')
# 獲取資料
print(cache.hgetall('person'))

# 5. 事務操作
# 創建管道(事務)
pl = cache.pipeline()
# 添加命令
pl.set('username', 'lisi')
pl.set('age', '20')
# 執行事務
pl.execute()

# 6. 發布與訂閱操作
# 監聽操作
ps = cache.pubsub()
# 訂閱頻道
ps.subscribe('mychannel')
while True:
    # 監聽訊息
    for message in ps.listen():
        print(message)

'''
# 發布訊息(在另一個程式中運行)
from redis import Redis

# 連接Redis
cache = Redis(host='192.168.1.17', port=6379, password='123456')

# 發布訊息
for i in range(5):
    cache.publish('mychannel', '[email protected]')
'''

注:本文為學習筆記,發現錯誤歡迎指出,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/199895.html

標籤:其他

上一篇:shardbatis實作分表

下一篇:編程代碼:用C語言來實作下雪效果,這個冬天,雪花很美

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more