無序,無重複(惟一),能夠存儲最多2^32 - 1 個字符串git
增長刪除元素github
返回操做成功的個數redis
>SADD key member [member ...] >SREM key member [member ...]
e.g.算法
127.0.0.1:6379> SADD letters a (integer) 1 127.0.0.1:6379> SADD letters a b c (integer) 2
得到集合中的全部元素數據庫
>SMEMBERS key
e.g.緩存
127.0.0.1:6379> SMEMBERS letters 1) "c" 2) "a" 3) "b"
判斷元素是否在集合中(複雜度O(1))服務器
>SISMEMBER key member
e.g.app
127.0.0.1:6379> SISMEMBER letters a (integer) 1 127.0.0.1:6379> SISMEMBER letters d (integer) 0
集合間運算dom
# 差集 >SDIFF key [key ...] # 交集 >SINTER key [key ...] # 並集 >SUNION key [key ...]
進行集合運算並將結果存儲函數
>SDIFFSTORE destination_key key [key ...] >SINTERSTORE destination_key key [key ...] >SUNIONSTORE destination_key key [key ...]
得到集合中元素個數
>SCARD key
e.g.
127.0.0.1:6379> SCARD letters (integer) 3
隨機獲取集合中元素
>SRANDMEMBER key [count] count,正數,獲取count個不重複的元素 count, 負數,獲取|count|個,可能重複
e.g.
127.0.0.1:6379> SRANDMEMBER letters "b" 127.0.0.1:6379> SRANDMEMBER letters 2 1) "a" 2) "c" 127.0.0.1:6379> SRANDMEMBER letters -2 1) "b" 2) "b"
彈出一個元素
>SPOP key
e.g.
127.0.0.1:6379> SPOP letters "c" 127.0.0.1:6379> SCARD letters (integer) 2
sorted set,集合中每一個元素都關聯一個分數(不一樣元素分數能夠相同),能夠根據分數進行排序(最高/最低N個),進行有序相關的操做(分數能夠相同)
有序集合使用散列表和跳躍表實現, 讀取複雜度更低, 更耗費內存
按點擊量排序,按時間排序等等,時間軸操做
增長元素
>ZADD key score member [score member]
e.g.
127.0.0.1:6379> ZADD scoreboard 89 tom 67 peter 100 david (integer) 3 127.0.0.1:6379> ZADD scoreboard 70 peter (integer) 0
獲取元素分數
>ZSCORE key member
e.g.
127.0.0.1:6379> ZSCORE scoreboard peter "70"
獲取排名在某個範圍內的元素列表
分數相同,按字典序排,中文的話,取決於編碼方式
#分數從小到大排,返回索引從 start-stop之間的全部元素,包含兩端元素, WITHSCORES同時得到元素分數 >ZRANGE key start stop [WITHSCORES] >ZREVRANGE key start stop [WITHSCORES]
e.g.
127.0.0.1:6379> ZRANGE scoreboard 0 2 1) "peter" 2) "tom" 3) "david" 127.0.0.1:6379> ZRANGE scoreboard 0 2 WITHSCORES 1) "peter" 2) "70" 3) "tom" 4) "89" 5) "david" 6) "100" 127.0.0.1:6379> ZREVRANGE scoreboard 0 2 WITHSCORES 1) "david" 2) "100" 3) "tom" 4) "89" 5) "peter" 6) "70"
獲取指定分數範圍的元素
>ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
e.g.
127.0.0.1:6379> ZRANGEBYSCORE scoreboard 80 100 WITHSCORES 1) "tom" 2) "89" 3) "david" 4) "100"
但願不包含端點值
>ZRANGEBYSCORE scoreboard 80 (100 正負無窮大 +inf -inf
e.g.
127.0.0.1:6379> ZRANGEBYSCORE scoreboard 80 (100 WITHSCORES 1) "tom" 2) "89" 127.0.0.1:6379> ZRANGEBYSCORE scoreboard 80 +inf WITHSCORES 1) "tom" 2) "89" 3) "david" 4) "100" 127.0.0.1:6379> ZRANGEBYSCORE scoreboard 80 +inf WITHSCORES LIMIT 0 1 1) "tom" 2) "89"
增長某個元素分數
>ZINCRBY key increment member
e.g.
127.0.0.1:6379> ZSCORE scoreboard tom "89" 127.0.0.1:6379> ZINCRBY scoreboard 2 tom "91" 127.0.0.1:6379> ZSCORE scoreboard tom "91"
得到集合中元素數量
>ZCARD key
e.g.
127.0.0.1:6379> ZCARD scoreboard (integer) 3
得到指定分數範圍內的元素個數
>ZCOUNT key min max
e.g.
127.0.0.1:6379> ZCOUNT scoreboard 80 100 (integer) 2
刪除一個或多個元素
>ZREM key member [member ...]
按照排名範圍刪除元素
>ZREMRANGEBYRANK key start stop
按照分數範圍刪除
>ZREMRANGEBYSCORE key min max
得到元素排名
>ZRANK key member #從小到大 >ZREVRANK key member #相反
e.g.
127.0.0.1:6379> ZRANK scoreboard tom (integer) 1
計算有序集合的交集
>ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX] #返回值爲destination中元素個數 #AGGREGATE sum默認值,destination鍵中元素分數是每一個參與計算的集合中該元素分數的和 min取最小值 max取最大值 #WEIGHTS 設置每一個集合的權重,每一個集合在參與計算時分數會被乘以權重
Redis中事務是一組命令的集合, 一個事務中的命令要麼都執行, 要麼都不執行
> MULTI > SADD k1 v1 > SADD k2 v2 > EXEC
注意, 不支持回滾功能
能夠對列表/集合/有序集合進行排序
最強大最複雜, 用很差可能成爲性能瓶頸 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 live
時效數據,過必定時間刪除這些數據
#設置 >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
官方推薦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 ....
版權聲明:自由轉載-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0