django-redis 中文文檔
django-redis 基于 BSD 許可, 是一個使 Django 支持 Redis cache/session 后端的全功能組件
Django 使用 django-redis 作為緩存的正確用法
菜鳥redis 教程
純靜態(tài)頁面
讀取了數(shù)據(jù)庫信息搭独,但是不經(jīng)常變動的頁面,比如文章熱門排行榜,這個調(diào)用數(shù)據(jù)庫信息并且還要排序的完全可以使用緩存,因為不需要實時展現(xiàn)最新的
HTML 的片段,比如整個頁面都經(jīng)常變動薄疚,但是有個側(cè)邊欄不經(jīng)常變動,就可以緩存?zhèn)冗厵?br> 需要使用復(fù)雜邏輯生成的 HTML 片段,使用緩存可以減少多次重復(fù)操作
因為緩存直接是從內(nèi)存讀取瘾境,極大的節(jié)省時間,另外也可以對于復(fù)雜數(shù)據(jù)生成可以做到每隔比如十分鐘更新一次镰惦,如果每次請求都運行計算迷守,那么后臺有可能直接卡掉了。這一點可以用在抖音視頻接口上旺入,比如由用戶刷新兑凿,改為后臺刷新。返回地址讀完后再重新請求茵瘾,這個要好好搞一下
redis 優(yōu)勢
- 性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s
- 豐富的數(shù)據(jù)類型 – Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數(shù)據(jù)類型操作
- 豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性
-
Redis運行在內(nèi)存中但是可以持久化到磁盤礼华,所以在對不同數(shù)據(jù)集進行高速讀寫時需要權(quán)衡內(nèi)存,因為數(shù)據(jù)量不能大于硬件內(nèi)存
安裝忽略
Redis 配置
Redis 的配置文件位于 Redis 安裝目錄下拗秘,文件名為 redis.conf(Windows 名為 redis.windows.conf)
查看和設(shè)置 redis 配置 項:
命令 CONFIG
- 查看配置項: CONFIG get
redis 127.0.0.1:6379> CONFIG GET loglevel
1) "loglevel"
2) "notice"
redis 127.0.0.1:6379> CONFIG GET * # 查看所有配置項
1) "dbfilename"
2) "dump.rdb"
3) "requirepass"
4) ""
5) "masterauth"
6) ""
# 注意 一行是 名稱圣絮,一行是對應(yīng)的值
- 編輯配置
CONFIG set
格式:
CONFIG SET 配置項名 值
CONFIG SET loglevel "notice"
配置參數(shù)說明
daemonize no # 使用 yes 啟用守護進程,windows 只能為 no
(ps 守護進程,啟動shell 關(guān)閉雕旨,啟動的服務(wù)依然會后臺運行)
pidfile /var/run/redis.pid # Redis 以守護進程方式運行 pid 寫入 的文件
port 6379 # 監(jiān)聽端口
bind 127.0.0.1 # 綁定的主機地址
timeout 300 # 客戶端閑置多久關(guān)閉連接 扮匠,如果指定為 0,表示關(guān)閉該功能
loglevel notice # 日志級別 凡涩,支持四個級別:debug棒搜、verbose、notice活箕、warning力麸,默認(rèn)為 notice
logfile stdout # 日志輸出,默認(rèn)為控制臺育韩, 守護進程運行克蚂,則日志將會發(fā)送給 /dev/null
databases 16 # 設(shè)置數(shù)據(jù)庫的數(shù)量,默認(rèn)數(shù)據(jù)庫為0座慰,可以使用SELECT 命令在連接上指定數(shù)據(jù)庫id
save <seconds> <changes> # 指定多長時間內(nèi)陨舱,有多少條操作就將數(shù)據(jù)同步到數(shù)據(jù)庫
Redis 默認(rèn)配置文件中提供了三個條件:
save 900 1
save 300 10
save 60 10000
分別表示 900 秒(15 分鐘)內(nèi)有 1 個更改,300 秒(5 分鐘)內(nèi)有 10 個
更改以及 60 秒內(nèi)有 10000 個更改版仔。
rdbcompression yes # 保存到本地數(shù)據(jù)庫是否要進行壓縮游盲,默認(rèn) LZF 壓縮误墓,
# 會增加cpu使用,益缎,不壓縮數(shù)據(jù)會很大谜慌,綜合考慮吧
dbfilename dump.rdb # 指定本地數(shù)據(jù)庫文件名,默認(rèn)值為 dump.rdb
dir ./ # 本地數(shù)據(jù)庫存放目錄
requirepass foobared # 設(shè)置 Redis 連接密碼莺奔,
# 如果配置了連接密碼 客戶端在連接 Redis
# 時需要通過 AUTH <password> 命令提供密碼欣范,默認(rèn)關(guān)閉
maxclients 128 # 設(shè)置同一時間最大客戶端連接數(shù) 0 為不限制 同 sokcet `的listen(128)
maxmemory <bytes> # 指定 Redis 最大內(nèi)存限制,
# Redis 在啟動時會把數(shù)據(jù)加載到內(nèi)存中令哟,達到最大內(nèi)存后恼琼,
#Redis 會先嘗試清除已到期或即將到期的 Key,當(dāng)此方法處理 后屏富,
# 仍然到達最大內(nèi)存設(shè)置晴竞,將無法再進行寫入操作,但仍然可以進行讀取
# 操作狠半。Redis 新的 vm 機制噩死,會把 Key 存放內(nèi)存,Value 會存放在 swap 區(qū)
appendonly no # 指定是否在每次更新操作后進行日志記錄,默認(rèn)不開啟
appendfilename appendonly.aof # 日志名 默認(rèn)為 appendonly.aof
appendfsync everysec # 指定更新日志條件神年,共有 3 個可選值:
# no:表示等操作系統(tǒng)進行數(shù)據(jù)緩存同步到磁盤(快)
# always:表示每次更新操作后手動調(diào)用 fsync() 將數(shù)據(jù)寫到磁盤(慢已维,安全)
# everysec:表示每秒同步一次(折中,默認(rèn)值)
vm-max-threads 4 # 訪問swap文件的線程數(shù) 已日,默認(rèn)為4
include /path/to/local.conf # 指定包含其它的配置文件垛耳,可以在同一主機上多
# 個Redis實例之間使用同一份配置文件,而同時各個實例又擁有自
# 己的特定配置文件
redis 數(shù)據(jù)類型
Redis支持五種數(shù)據(jù)類型:string(字符串)飘千,hash(哈希)艾扮,list(列表),set(集合)及zset(sorted set:有序集合)占婉。
-
string
是redis最基本的類型了,可以包含二進制圖片等數(shù)據(jù)甫恩。(可以認(rèn)為可以包含任何數(shù)據(jù))
string 類型的值最大能存儲 512MB逆济。 -
Hash(哈希 字典 )
存儲、讀取磺箕、修改用戶屬性
Redis hash 是一個鍵值(key=>value)對集合奖慌。特別適合存儲對象數(shù)據(jù)類型
redis 127.0.0.1:6379> HMSET runoob field1 "Hello" field2 "World"
"OK"
redis 127.0.0.1:6379> HGET runoob field1
"Hello"
redis 127.0.0.1:6379> HGET runoob field2
"World"
HMSET 設(shè)置了兩個 field=>value 對, HGET 獲取對應(yīng) field 對應(yīng)的 value。
每個hash 存儲的鍵值對是無限制的
-
List(列表 雙向鏈表結(jié)構(gòu))
1,最新消息排行等功能(比如朋友圈的時間線) 2,消息隊列
簡單的字符串列表松靡。按照插入順序排列简僧。也可以指定插入頭或尾
redis 127.0.0.1:6379> DEL runoob
redis 127.0.0.1:6379> lpush runoob redis
(integer) 1
redis 127.0.0.1:6379> lpush runoob mongodb
(integer) 2
redis 127.0.0.1:6379> lpush runoob rabitmq
(integer) 3
redis 127.0.0.1:6379> lrange runoob 0 10
1) "rabitmq"
2) "mongodb"
3) "redis"
redis 127.0.0.1:6379>
列表存儲的數(shù)據(jù)默認(rèn)無限制
-
Set(集合 )
共同好友 2、利用唯一性,統(tǒng)計訪問網(wǎng)站的所有獨立ip 3雕欺、好友推薦時,根據(jù)tag求交集,大于某個閾值就可以推薦
set 是字符串的無序集合岛马,
集合是通過哈希表實現(xiàn) 棉姐,取值復(fù)雜度為 O(1)
sadd 添加一個set 元素
sadd key member
# 添加一個 string 元素到 key 對應(yīng)的 set 集合中,
成功返回 1啦逆,如果元素已經(jīng)在集合中返回 0伞矩。并且忽略插入
set 元素個數(shù) 無限制 (無限制即 40 億個 )
-
zset(sorted set:有序集合)
1、排行榜 2夏志、帶權(quán)重的消息隊列
基本和set 類似乃坤,元素都不會重復(fù),到那時zset 會對元素進行排序
zadd 命令 添加一個zset 元素
redis 127.0.0.1:6379> DEL runoob
redis 127.0.0.1:6379> zadd runoob 0 redis
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 mongodb
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 0
redis 127.0.0.1:6379> > ZRANGEBYSCORE runoob 0 1000
1) "mongodb"
2) "rabitmq"
3) "redis"
由于Redis非常輕量級沟蔑,一個空Redis實例占用的內(nèi)在只有1M左右湿诊,所以不用擔(dān)心多個Redis實例會額外占用很多內(nèi)存。
數(shù)據(jù)庫 名為 數(shù)字編號 瘦材,不支持自定義名字
每個數(shù)據(jù)庫對外都是一個從0開始的遞增數(shù)字命名厅须,默認(rèn)連接 0 ,選擇數(shù)據(jù)庫使用 select 如 SELECT 1
Redis 命令
客戶端命令 :
$ redis-cli
連接本地 :
$redis-cli
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> PING
PONG
# 在以上實例中我們連接到本地的 redis 服務(wù)并執(zhí)行 PING 命令宇色,該命令用于檢測 redis 服務(wù)是否啟動九杂。
連接遠程:$ redis-cli -h host -p port -a password
$redis-cli -h 127.0.0.1 -p 6379 -a "mypass"
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> PING
PONG
Redis 鍵(key) 命令
key 命令 用于管理 redis 的key
格式 : COMMAND key_name
如:
redis 127.0.0.1:6379> DEL runoobkey
(integer) 1
如果鍵被刪除成功,命令執(zhí)行后輸出 (integer) 1宣蠕,否則將輸出 (integer) 0
所有命令
DEL key key 存在時例隆,刪除key
DUMP key 序列化給定 key ,并返回被序列化的值抢蚀。
EXISTS key檢查 key 是否存在
EXPIRE key seconds 設(shè)置key 過期時間 秒 計
KEYS pattern 找出所有符合 pattern 的 key
MOVE key db 把key 移到給定的數(shù)據(jù)庫db
PERSIST key 移除key的過期時間
TTL key 返回秒單位的key 剩余過期時間
更多命令參考:
https://redis.io/commands
Redis 字符串命令(String)
SET key value
設(shè)置key 的值
GET key
獲取指定key 的值
GETRANGE key start end
返回 key 對應(yīng)字符串的子字符串
GETSET key value
給 key 設(shè)置指定的值镀层,并且返回舊的值
GETBIT key offset
對字符串的值偏移一定位,然后返回偏移量上的位
MGET key1 [key2..]
獲取一個或多個key 的值
SETBIT key offset value
設(shè)置或清除指定位的值
SETEX key seconds value
將值 value 關(guān)聯(lián)到 key 皿曲,并將 key 的過期時間設(shè)為 seconds (以秒為單位)唱逢。
SETNX key value
key不存在時,設(shè)置key 的值
SETRANGE key offset value
用 value 覆蓋給定key 偏移后面 的值
STRLEN key
獲得key字符傳的長度
MSET key value [key value ...]
同時設(shè)置一個或多個key 對應(yīng)的值
MSETNX key value [key value ...]
同時設(shè)置多個key 的值屋休,當(dāng)key 都不存在 時
PSETEX key milliseconds value
同 SETEX ,只不過是以毫秒為單位
INCR key
key 中存儲的數(shù)字坞古,加1
INCRBY key increment
key 中存儲的值 加上給定的增量值
INCRBYFLOAT key increment
key 中存儲的值 加上給定的增量浮點值
DECR key
將 key 中儲存的數(shù)字值減一。
DECRBY key decrement
key 所儲存的值減去給定的減量值
APPEND key value
如果 key 已經(jīng)存在并且是一個字符串劫樟, APPEND 命令將指定的 value 追加到該 key 原來值(value)的末尾
更多命令請參考:https://redis.io/commands
Redis 哈希(Hash)
Redis hash 是一個 string 類型的 field 和 value 的映射表痪枫,hash 特別適合用于存儲對象。
127.0.0.1:6379> HMSET runoobkey name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000
OK
127.0.0.1:6379> HGETALL runoobkey
1) "name"
2) "redis tutorial"
3) "description"
4) "redis basic commands for caching"
5) "likes"
6) "20"
7) "visitors"
8) "23000"
可以看出就像設(shè)置叠艳,字典一樣
我們設(shè)置了 redis 的一些描述信息(name, description, likes, visitors) 到哈希表的 runoobkey 中奶陈。
哈希表命令:
HDEL key field1 [field2]
刪除一個后者多個哈希表的字段
HEXISTS key field
查看哈希表指定 字段 是否存在
HGET key field
查看哈希表指定字段的值
HGETALL key
獲取所有字段和值
HINCRBY key field increment
給指定字段的整數(shù)值 加上 增量 increment
HINCRBYFLOAT key field increment
字段的浮點值加 increment
HKEYS key
獲取哈希表的所有字段
HLEN key
獲取哈希表 字段的數(shù)量
HMGET key field1 [field2]
獲取指定字段的值
HMSET key field1 value1 [field2 value2 ]
同時設(shè)置多個字段的值 (會覆蓋指定的值,哈希表不存在附较,則創(chuàng)建)
HSET key field value
設(shè)置一個字段的值
HSETNX key field value
只有在 字段不存在時吃粒,設(shè)置值
HVALS key
獲取所有字段的值
HSCAN key cursor [MATCH pattern] [COUNT count]
迭代哈希表中的鍵值對。
Redis 列表(List)
Redis列表是簡單的字符串列表拒课,按照插入順序排序徐勃。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)
redis 127.0.0.1:6379> LPUSH runoobkey redis
(integer) 1
redis 127.0.0.1:6379> LPUSH runoobkey mongodb
(integer) 2
redis 127.0.0.1:6379> LPUSH runoobkey mysql
(integer) 3
redis 127.0.0.1:6379> LRANGE runoobkey 0 10
1) "mysql"
2) "mongodb"
3) "redis"
在以上實例中我們使用了 LPUSH 將三個值插入了名為 runoobkey 的列表當(dāng)中事示。
Redis 列表命令
BLPOP key1 [key2 ] timeout
移除并獲取列表第一個值,沒有元素則等待超時時間以內(nèi)
BRPOP key1 [key2 ] timeout
移除并獲取列表最后一個元素
BRPOPLPUSH source destination timeout
彈出一個元素并加到另一個列表(左邊)疏旨,并返回它很魂。無值則等超時
LINDEX key index
索引獲取元素(可 -1 表示最后一個,類推)
LINSERT key BEFORE|AFTER pivot value
在指定的元素前 或 后 插入元素
LLEN key
獲取列表長度
LPOP key
移除并獲取列表第一個元素
LPUSH key value1 [value2]
插入多值到表頭
LPUSHX key value
已存在的表 頭加一個值 返回列表長度 (列表不存在時操作無效)
LRANGE key start stop
獲取指定范圍的值
LREM key count value
移除列表的值(移除數(shù)量為 +-count 值是value 的值檐涝,正數(shù)左邊開始遏匆,負(fù)數(shù)右邊開始,0 移除所有)
LSET key index value
通過索引設(shè)置元素的值
LTRIM key start stop
只保留范圍內(nèi)的值谁榜,其他刪掉
RPOP key
移除最后一個值幅聘,并返回它
RPOPLPUSH source destination
移除最后一個值,并加到另外一個列表(頭)窃植,并返回它
RPUSH key value1 [value2]
從右邊插值
RPUSHX key value
已存在右邊插入一個值 (返回列表長度)
-
Redis 集合(Set)
不重復(fù)的string集合
Redis 中集合是通過哈希表實現(xiàn)的帝蒿,所以添加,刪除巷怜,查找的復(fù)雜度都是 O(1)
最多40億個成員
實例:
redis 127.0.0.1:6379> SADD runoobkey redis
(integer) 1
redis 127.0.0.1:6379> SADD runoobkey mongodb
(integer) 1
redis 127.0.0.1:6379> SADD runoobkey mysql
(integer) 1
redis 127.0.0.1:6379> SADD runoobkey mysql
(integer) 0
redis 127.0.0.1:6379> SMEMBERS runoobkey
1) "mysql"
2) "mongodb"
3) "redis"
1 代表執(zhí)行正確
Redis 集合命令
向集合添加一個或多個成員
SADD key member1 [member2]
獲取集合的成員數(shù)
SCARD key
返回給定所有集合的差集
SDIFF key1 [key2] |
返回給定所有集合的差集并存儲在 destination 中
SDIFFSTORE destination key1 [key2]
返回給定所有集合的交集
SINTER key1 [key2]
返回給定所有集合的交集并存儲在 destination 中
SINTERSTORE destination key1 [key2]
判斷 member 元素是否是集合 key 的成員
SISMEMBER key member
返回集合中的所有成員
SMEMBERS key
將 member 元素從 source 集合移動到 destination 集合.
SMOVE source destination member
移除并返回集合中的一個隨機元素
SPOP key
返回集合中一個或多個隨機數(shù).
SRANDMEMBER key [count]
移除集合中一個或多個成員
SREM key member1 [member2]
返回所有給定集合的并集
SUNION key1 [key2]
所有給定集合的并集存儲在 destination 集合中
SUNIONSTORE destination key1 [key2]
迭代集合中的元素
SSCAN key cursor [MATCH pattern] [COUNT count]
-
Redis 有序集合(sorted set)
https://www.runoob.com/redis/redis-sorted-sets.html
和set 一樣葛超,
不同的是每個元素都會關(guān)聯(lián)一個double類型的分?jǐn)?shù)。redis正是通過分?jǐn)?shù)來為集合中的成員進行從小到大的排序延塑。
略