Redis基礎筆記 (二)

其餘

事務

Redis中事務是一組命令的集合, 一個事務中的命令要麼都執行, 要麼都不執行git

> MULTI
> SADD k1 v1
> SADD k2 v2
> EXEC

注意, 不支持回滾功能github

SORT

能夠對列表/集合/有序集合進行排序redis

最強大最複雜, 用很差可能成爲性能瓶頸 O(n + mlogm) n爲排序個數, m爲返回個數算法

>SORT key #從小到大
>SORT key DESC #從大到小

SORTBY數據庫

127.0.0.1:6379> LPUSH sortbylist  2 1 3
(integer) 3
127.0.0.1:6379> SET itemscore:1 50
OK
127.0.0.1:6379> SET itemscore:2 100
OK
127.0.0.1:6379> SET itemscore:3 -10
OK
127.0.0.1:6379> SORT sortbylist BY itemscore:* DESC
1) "2"
2) "1"
3) "3"

SORTBY GET緩存

127.0.0.1:6379> SORT sortbylist BY itemscore:* DESC GET POST:*->title GET POST:*->time

SOTRBY GET STORE服務器

127.0.0.1:6379> SORT sortbylist BY itemscore:* DESC GET POST:*->title GET POST:*->time STORE new_key

生存時間

TTL, time to liveapp

時效數據,過必定時間刪除這些數據dom

#設置
>EXPIRE key seconds
1表示設置成功, 0表鍵不存在或設置失敗

#查詢
>TTL key
鍵不存在返回-1 or 沒有設置生存時間

#去除時效
>PERSIST key

#SET/GETSET爲鍵賦值會同時清除鍵的生存時間

任務隊列

通常隊列函數

生產者 LPUSH
消費者 RPOP

BRPOP 和RPOP相似,可是當列表中沒有元素時,BRPOP會一直阻塞住連接,直到有新元素加入

優先隊列

BLPOP key [key ...] timeout,同時檢測多個鍵,若是全部鍵都沒有元素則阻塞,若是其中有一個鍵有元素,則從該鍵中彈出元素
若是都有,則從左到右的順序取第一個鍵中的一個元素

BLPOP queue:1 queue:2 queue:3 0

發佈/訂閱模式

進程間消息傳遞

訂閱者:訂閱者能夠訂閱一個或多個頻道

>SUBSCRIBE channel1

發佈者:能夠向指定的頻道發送消息,全部訂閱此頻道的訂閱者都會受到此消息

>PUBLISH channel1 helloworld

Python中使用Redis

官方推薦redis-py

安裝

sudo pip install redis
sudo easy_install redis

使用

redis-py提供兩個類Redis和StrictRedis用於實現Redis的命令,StrictRedis用於實現大部分官方的命令,並使用官方的語法和命令(好比,SET命令對應與StrictRedis.set方法)Redis是StrictRedis的子類,用於向後兼容舊版本的redis-py>>> import redis>>> r = redis.StrictRedis(host='localhost', port=6379, db=0)>>> r.set('foo', 'bar')True>>> r.get('foo')'bar'

connection pool

管理對一個redis server的全部鏈接,避免每次創建、釋放鏈接的開銷。
默認,每一個Redis實例都會維護一個本身的鏈接池。能夠直接創建一個鏈接池,而後做爲參數Redis,這樣就能夠實現多個Redis實例共享一個鏈接池。

pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
r = redis.Redis(connection_pool=pool)

pipeline機制

能夠在一次請求中執行多個命令,這樣避免了屢次的往返時延
當一組命令中每條命令都不依賴於以前的執行結果, 可使用

pipe = r.pipeline()
pipe.set('one', 'first')
pipe.set('two', 'second')
pipe.execute()

pipeline中的操做是原子的,要改變這種方式,能夠傳入transaction=False

pipe = r.pipeline(transaction=False)

實際實例

什麼應用,都用什麼方式處理的

1.通常的緩存

用字符串類型足矣, e.g.註冊時得用戶名衝突,在線用戶

>SET key value
>GET

一些緩存場景

存儲會話緩存(Session Cache), 利用持久化, 保存一些信息, 例如購物車
全頁緩存(FPC)

2.計數,訪問量統計,自增id等

>INCR key

3.存儲對象實例

用散列
>HSET key field value
>HGET key field

4.存列表,隊列相關

做爲隊列使用

文章分類列表,評論列表等

用列表
>LPUSH key value
>RPUSH key value

>LPOP key
>RPOP key

5.集合相關的

標籤雲等

>SADD key member
>SREM key member

6.排序相關

排行榜

訪問量排序,點擊量等

用有序結合
>ZADD key score member

7.訪問頻率控制

設置key的失效時間 用 INCR 訪問時檢查次數, 若超過閾值, 走限制邏輯

or 記錄次數, 超過閾值, 檢查與最先一個相差是否是1分鐘, 是, 走限制邏輯, 不是, 現有時間加入列表, 同時刪除最先元素

8.發佈/訂閱

會用到的

管理

重啓後數據不丟失, 兩種方式, 可單獨使用或者結合使用

持久化:

RDB

快照,符合必定條件時,將內存中的全部數據進行快照並存儲到硬盤上
快照的條件能夠在配置文件中配置, 兩個參數: 時間和改動的鍵的個數
Redis默認採用的持久化方式

過程
1. Redis使用fork函數複製一份當前進程(父進程)的副本(子進程) (存的是fork時刻的數據)
   寫時複製copy-on-write 開始時父子共享同一內存數據, 當父進程修改某片數據, 操做系統複製一份以保證子進程數據不受影響
2. 父進程繼續接收命令, 子進程開始將內存中數據寫入硬盤中臨時文件
3. 寫入結束後, 替換舊的RDB文件

任意時刻rdb文件都是完整地, 能夠用於備份

能夠手動發SAVE / BGSAVE 讓redis執行快照(前者由主進程進行快照操做,阻塞其餘請求, 後者fork子進程)

AOF

每次執行一條會修改Redis中數據的命令,Redis會將該命令寫到硬盤中的AOF文件
開啓, 設置 appendonly yes
默認文件名 appendonly.aof 能夠經過appendfilename設置

純文本文件, 每當達到必定條件時能夠進行重寫
auto-aof-rewrite-percentage 100 #超過上一次百分比
auto-aof-rewrite-min-size 64mb #容許重寫的最小aof文件大小

默認30s, 執行的命令同步到aof
能夠配置
appendfsync everysec # 每秒一次

Redis能夠配置主從數據庫

redis-server --port 6380 --slaveof 127.0.0.1 6379

複製原理: 從數據庫啓動, 向主庫發SYNC, 主庫後臺開始保存快照(RDB), 並將保存期間的命令緩存起來. 快照完成後, 將快照文件和緩存的命令發送給從庫, 從庫收到後載入快照文件並執行命令. 不支持斷點續傳

讀寫分離: 主庫禁用持久化, 從庫啓用. 從庫崩潰, 重啓自動更新. 主庫崩潰, 從庫提高爲主庫再修復

經常使用查看命令

telnet鏈接

>telnet 127.0.0.1 6379

設定最大可用內存

若是服務器內存有限, 大量使用緩存且生存時間設置過長會致使Redis佔滿內存. or 爲了防止佔用內存過大而將生存時間設過短致使命中率太低

能夠限制redis使用的最大內存, 按照必定規則淘汰不須要的鍵

配置文件 
maxmemory 限制最大可用內存大小(單位字節)
maxmemory-policy 超過限制時的刪除策略,一直刪除直到小於指定內存

volatile-lru  使用LRU算法刪除一個鍵,只對設置了生存時間的
allkeys-lru   使用LRU算法刪除一個鍵
volatile-random 隨機,只對設置了生存時間的
allkeys-random
volatile-ttl    刪除生存時間最近的
noeviction      不刪除鍵,返回錯誤

耗時命令日誌

> SLOWLOG GET

其餘

批量刪除

#刪除 /test/*開始的
./redis-cli -a password -n 0 keys "/test/*" | xargs ./redis-cli -a password -n 0 del

精簡鍵名和鍵值, 最直觀的減小內存佔用的方式


The end! To be continue ....

相關文章
相關標籤/搜索