Redis是一種nosql資料庫(非關系型資料庫),它的資料是以鍵值對的形式保存在記憶體中的,同時也可以定時將資料同步到磁盤檔案中,即實作資料的持久化,相比于Memcached快取系統,它支持更多的資料結構,如string、list(佇列和堆疊)、set(集合)、sorted set(有序集合)、hash(hash表)等,本文只是簡單整理了下學習筆記,感興趣的話可以查看中文官方檔案,
一、使用場景和特點
1. 常用的使用場景
- 登錄會話存盤:存盤在Redis中,與Memcached相比,資料不會丟失,
- 排行榜或計數器:一些實時的排行或計數都可以采用Redis來實作,
- 訊息佇列:如celery就是使用Redis作為中間人,
- 當前在線人數:實時的資料,但是又不需要存盤到資料庫中,可以采用Redis來實作,
- 常用的資料快取:如論壇的首頁等不會經常變化的資料存盤到Redis中,
- 前100文章或評論進行快取:一般情況下,用戶瀏覽資料只會瀏覽前面的部分,可以把這些經常訪問的資料快取到Redis資料庫中,
- 好友關系:微博的好友關系就是使用Redis實作的,
- 發布和訂閱功能:可以用來做聊天軟體,
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. 常用基礎操作
添加:使用set和get命令進行資料的添加和獲取,添加資料時默認為字串型別,如果設定的值中含有空格則需要使用雙引號包裹起來,
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 timeout或setex key timeout value,另一種是對已經存在的值進行設定:expire key timeout,timeout單位為秒,
查看過期時間:通過命令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/value,hmset 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表(字典)中所有的field或value,
查看是否存在某個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 message,channel名稱和message內容都可以自定義,
訂閱某個頻道的訊息:subscribe channel1 channel2 ...,執行這個命令后,程式相當于進入了一個死回圈,會一直等待發布者發布訊息,一旦發布者發布了訊息,那么此訂閱程式就能馬上收到訊息,
三、持久化機制
Redis提供了兩種持久化機制或者說備份方式,即RDB和AOF,它們的存盤方式都是存盤在磁盤的特定檔案中,這兩種方式的配置資訊都在組態檔/etc/redis/redis.conf中,它們各自的特點可以參考如下表格,
| 比較項 | RDB | AOF |
|---|---|---|
| 開啟和關閉 | 默認開啟,如果想要關閉,則注釋掉組態檔中SNAPSHOTTING下相關save即可,如save 900 1表示如果900秒內發生了一次資料更新操作則進行一次同步,其他save也是同理,相當于每隔一定時間會檢查一次,如果資料更新次數達到配置的要求則會進行同步,這也是RDB默認的同步機制, |
默認關閉,如果想要開啟,修改組態檔中appendonly no為appendonly 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/200005.html
標籤:Python
