django-redis 中文文檔
django-redis 基于 BSD 許可, 是一個(gè)使 Django 支持 Redis cache/session 后端的全功能組件
Django 使用 django-redis 作為緩存的正確用法
菜鳥redis 教程
純靜態(tài)頁(yè)面
讀取了數(shù)據(jù)庫(kù)信息,但是不經(jīng)常變動(dòng)的頁(yè)面,比如文章熱門排行榜,這個(gè)調(diào)用數(shù)據(jù)庫(kù)信息并且還要排序的完全可以使用緩存,因?yàn)椴恍枰獙?shí)時(shí)展現(xiàn)最新的
HTML 的片段,比如整個(gè)頁(yè)面都經(jīng)常變動(dòng),但是有個(gè)側(cè)邊欄不經(jīng)常變動(dòng),就可以緩存?zhèn)冗厵?br> 需要使用復(fù)雜邏輯生成的 HTML 片段,使用緩存可以減少多次重復(fù)操作
因?yàn)榫彺嬷苯邮菑膬?nèi)存讀取,極大的節(jié)省時(shí)間,另外也可以對(duì)于復(fù)雜數(shù)據(jù)生成可以做到每隔比如十分鐘更新一次,如果每次請(qǐng)求都運(yùn)行計(jì)算,那么后臺(tái)有可能直接卡掉了。這一點(diǎn)可以用在抖音視頻接口上,比如由用戶刷新,改為后臺(tái)刷新。返回地址讀完后再重新請(qǐng)求,這個(gè)要好好搞一下
redis 優(yōu)勢(shì)
- 性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s
- 豐富的數(shù)據(jù)類型 – Redis支持二進(jìn)制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數(shù)據(jù)類型操作
- 豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過(guò)期等等特性
-
Redis運(yùn)行在內(nèi)存中但是可以持久化到磁盤,所以在對(duì)不同數(shù)據(jù)集進(jìn)行高速讀寫時(shí)需要權(quán)衡內(nèi)存,因?yàn)閿?shù)據(jù)量不能大于硬件內(nèi)存
安裝忽略
Redis 配置
Redis 的配置文件位于 Redis 安裝目錄下,文件名為 redis.conf(Windows 名為 redis.windows.conf)
查看和設(shè)置 redis 配置 項(xiàng):
命令 CONFIG
- 查看配置項(xiàng): CONFIG get
redis 127.0.0.1:6379> CONFIG GET loglevel
1) "loglevel"
2) "notice"
redis 127.0.0.1:6379> CONFIG GET * # 查看所有配置項(xiàng)
1) "dbfilename"
2) "dump.rdb"
3) "requirepass"
4) ""
5) "masterauth"
6) ""
# 注意 一行是 名稱,一行是對(duì)應(yīng)的值
- 編輯配置
CONFIG set
格式:
CONFIG SET 配置項(xiàng)名 值
CONFIG SET loglevel "notice"
配置參數(shù)說(shuō)明
daemonize no # 使用 yes 啟用守護(hù)進(jìn)程,windows 只能為 no
(ps 守護(hù)進(jìn)程,啟動(dòng)shell 關(guān)閉,啟動(dòng)的服務(wù)依然會(huì)后臺(tái)運(yùn)行)
pidfile /var/run/redis.pid # Redis 以守護(hù)進(jìn)程方式運(yùn)行 pid 寫入 的文件
port 6379 # 監(jiān)聽端口
bind 127.0.0.1 # 綁定的主機(jī)地址
timeout 300 # 客戶端閑置多久關(guān)閉連接 ,如果指定為 0,表示關(guān)閉該功能
loglevel notice # 日志級(jí)別 ,支持四個(gè)級(jí)別:debug、verbose、notice、warning,默認(rèn)為 notice
logfile stdout # 日志輸出,默認(rèn)為控制臺(tái), 守護(hù)進(jìn)程運(yùn)行,則日志將會(huì)發(fā)送給 /dev/null
databases 16 # 設(shè)置數(shù)據(jù)庫(kù)的數(shù)量,默認(rèn)數(shù)據(jù)庫(kù)為0,可以使用SELECT 命令在連接上指定數(shù)據(jù)庫(kù)id
save <seconds> <changes> # 指定多長(zhǎng)時(shí)間內(nèi),有多少條操作就將數(shù)據(jù)同步到數(shù)據(jù)庫(kù)
Redis 默認(rèn)配置文件中提供了三個(gè)條件:
save 900 1
save 300 10
save 60 10000
分別表示 900 秒(15 分鐘)內(nèi)有 1 個(gè)更改,300 秒(5 分鐘)內(nèi)有 10 個(gè)
更改以及 60 秒內(nèi)有 10000 個(gè)更改。
rdbcompression yes # 保存到本地?cái)?shù)據(jù)庫(kù)是否要進(jìn)行壓縮,默認(rèn) LZF 壓縮,
# 會(huì)增加cpu使用,,不壓縮數(shù)據(jù)會(huì)很大,綜合考慮吧
dbfilename dump.rdb # 指定本地?cái)?shù)據(jù)庫(kù)文件名,默認(rèn)值為 dump.rdb
dir ./ # 本地?cái)?shù)據(jù)庫(kù)存放目錄
requirepass foobared # 設(shè)置 Redis 連接密碼,
# 如果配置了連接密碼 客戶端在連接 Redis
# 時(shí)需要通過(guò) AUTH <password> 命令提供密碼,默認(rèn)關(guān)閉
maxclients 128 # 設(shè)置同一時(shí)間最大客戶端連接數(shù) 0 為不限制 同 sokcet `的listen(128)
maxmemory <bytes> # 指定 Redis 最大內(nèi)存限制,
# Redis 在啟動(dòng)時(shí)會(huì)把數(shù)據(jù)加載到內(nèi)存中,達(dá)到最大內(nèi)存后,
#Redis 會(huì)先嘗試清除已到期或即將到期的 Key,當(dāng)此方法處理 后,
# 仍然到達(dá)最大內(nèi)存設(shè)置,將無(wú)法再進(jìn)行寫入操作,但仍然可以進(jìn)行讀取
# 操作。Redis 新的 vm 機(jī)制,會(huì)把 Key 存放內(nèi)存,Value 會(huì)存放在 swap 區(qū)
appendonly no # 指定是否在每次更新操作后進(jìn)行日志記錄,默認(rèn)不開啟
appendfilename appendonly.aof # 日志名 默認(rèn)為 appendonly.aof
appendfsync everysec # 指定更新日志條件,共有 3 個(gè)可選值:
# no:表示等操作系統(tǒng)進(jìn)行數(shù)據(jù)緩存同步到磁盤(快)
# always:表示每次更新操作后手動(dòng)調(diào)用 fsync() 將數(shù)據(jù)寫到磁盤(慢,安全)
# everysec:表示每秒同步一次(折中,默認(rèn)值)
vm-max-threads 4 # 訪問(wèn)swap文件的線程數(shù) ,默認(rèn)為4
include /path/to/local.conf # 指定包含其它的配置文件,可以在同一主機(jī)上多
# 個(gè)Redis實(shí)例之間使用同一份配置文件,而同時(shí)各個(gè)實(shí)例又擁有自
# 己的特定配置文件
redis 數(shù)據(jù)類型
Redis支持五種數(shù)據(jù)類型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
-
string
是redis最基本的類型了,可以包含二進(jìn)制圖片等數(shù)據(jù)。(可以認(rèn)為可以包含任何數(shù)據(jù))
string 類型的值最大能存儲(chǔ) 512MB。 -
Hash(哈希 字典 )
存儲(chǔ)、讀取、修改用戶屬性
Redis hash 是一個(gè)鍵值(key=>value)對(duì)集合。特別適合存儲(chǔ)對(duì)象數(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è)置了兩個(gè) field=>value 對(duì), HGET 獲取對(duì)應(yīng) field 對(duì)應(yīng)的 value。
每個(gè)hash 存儲(chǔ)的鍵值對(duì)是無(wú)限制的
-
List(列表 雙向鏈表結(jié)構(gòu))
1,最新消息排行等功能(比如朋友圈的時(shí)間線) 2,消息隊(duì)列
簡(jiǎn)單的字符串列表。按照插入順序排列。也可以指定插入頭或尾
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>
列表存儲(chǔ)的數(shù)據(jù)默認(rèn)無(wú)限制
-
Set(集合 )
共同好友 2、利用唯一性,統(tǒng)計(jì)訪問(wèn)網(wǎng)站的所有獨(dú)立ip 3、好友推薦時(shí),根據(jù)tag求交集,大于某個(gè)閾值就可以推薦
set 是字符串的無(wú)序集合,
集合是通過(guò)哈希表實(shí)現(xiàn) ,取值復(fù)雜度為 O(1)
sadd 添加一個(gè)set 元素
sadd key member
# 添加一個(gè) string 元素到 key 對(duì)應(yīng)的 set 集合中,
成功返回 1,如果元素已經(jīng)在集合中返回 0。并且忽略插入
set 元素個(gè)數(shù) 無(wú)限制 (無(wú)限制即 40 億個(gè) )
-
zset(sorted set:有序集合)
1、排行榜 2、帶權(quán)重的消息隊(duì)列
基本和set 類似,元素都不會(huì)重復(fù),到那時(shí)zset 會(huì)對(duì)元素進(jìn)行排序
zadd 命令 添加一個(gè)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非常輕量級(jí),一個(gè)空Redis實(shí)例占用的內(nèi)在只有1M左右,所以不用擔(dān)心多個(gè)Redis實(shí)例會(huì)額外占用很多內(nèi)存。
數(shù)據(jù)庫(kù) 名為 數(shù)字編號(hào) ,不支持自定義名字
每個(gè)數(shù)據(jù)庫(kù)對(duì)外都是一個(gè)從0開始的遞增數(shù)字命名,默認(rèn)連接 0 ,選擇數(shù)據(jù)庫(kù)使用 select 如 SELECT 1
Redis 命令
客戶端命令 :
$ redis-cli
連接本地 :
$redis-cli
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> PING
PONG
# 在以上實(shí)例中我們連接到本地的 redis 服務(wù)并執(zhí)行 PING 命令,該命令用于檢測(cè) redis 服務(wù)是否啟動(dòng)。
連接遠(yuǎn)程:$ 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 存在時(shí),刪除key
DUMP key 序列化給定 key ,并返回被序列化的值。
EXISTS key檢查 key 是否存在
EXPIRE key seconds 設(shè)置key 過(guò)期時(shí)間 秒 計(jì)
KEYS pattern 找出所有符合 pattern 的 key
MOVE key db 把key 移到給定的數(shù)據(jù)庫(kù)db
PERSIST key 移除key的過(guò)期時(shí)間
TTL key 返回秒單位的key 剩余過(guò)期時(shí)間
更多命令參考:
https://redis.io/commands
Redis 字符串命令(String)
SET key value
設(shè)置key 的值
GET key
獲取指定key 的值
GETRANGE key start end
返回 key 對(duì)應(yīng)字符串的子字符串
GETSET key value
給 key 設(shè)置指定的值,并且返回舊的值
GETBIT key offset
對(duì)字符串的值偏移一定位,然后返回偏移量上的位
MGET key1 [key2..]
獲取一個(gè)或多個(gè)key 的值
SETBIT key offset value
設(shè)置或清除指定位的值
SETEX key seconds value
將值 value 關(guān)聯(lián)到 key ,并將 key 的過(guò)期時(shí)間設(shè)為 seconds (以秒為單位)。
SETNX key value
key不存在時(shí),設(shè)置key 的值
SETRANGE key offset value
用 value 覆蓋給定key 偏移后面 的值
STRLEN key
獲得key字符傳的長(zhǎng)度
MSET key value [key value ...]
同時(shí)設(shè)置一個(gè)或多個(gè)key 對(duì)應(yīng)的值
MSETNX key value [key value ...]
同時(shí)設(shè)置多個(gè)key 的值,當(dāng)key 都不存在 時(shí)
PSETEX key milliseconds value
同 SETEX ,只不過(guò)是以毫秒為單位
INCR key
key 中存儲(chǔ)的數(shù)字,加1
INCRBY key increment
key 中存儲(chǔ)的值 加上給定的增量值
INCRBYFLOAT key increment
key 中存儲(chǔ)的值 加上給定的增量浮點(diǎn)值
DECR key
將 key 中儲(chǔ)存的數(shù)字值減一。
DECRBY key decrement
key 所儲(chǔ)存的值減去給定的減量值
APPEND key value
如果 key 已經(jīng)存在并且是一個(gè)字符串, APPEND 命令將指定的 value 追加到該 key 原來(lái)值(value)的末尾
更多命令請(qǐng)參考:https://redis.io/commands
Redis 哈希(Hash)
Redis hash 是一個(gè) string 類型的 field 和 value 的映射表,hash 特別適合用于存儲(chǔ)對(duì)象。
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è)置,字典一樣
我們?cè)O(shè)置了 redis 的一些描述信息(name, description, likes, visitors) 到哈希表的 runoobkey 中。
哈希表命令:
HDEL key field1 [field2]
刪除一個(gè)后者多個(gè)哈希表的字段
HEXISTS key field
查看哈希表指定 字段 是否存在
HGET key field
查看哈希表指定字段的值
HGETALL key
獲取所有字段和值
HINCRBY key field increment
給指定字段的整數(shù)值 加上 增量 increment
HINCRBYFLOAT key field increment
字段的浮點(diǎn)值加 increment
HKEYS key
獲取哈希表的所有字段
HLEN key
獲取哈希表 字段的數(shù)量
HMGET key field1 [field2]
獲取指定字段的值
HMSET key field1 value1 [field2 value2 ]
同時(shí)設(shè)置多個(gè)字段的值 (會(huì)覆蓋指定的值,哈希表不存在,則創(chuàng)建)
HSET key field value
設(shè)置一個(gè)字段的值
HSETNX key field value
只有在 字段不存在時(shí),設(shè)置值
HVALS key
獲取所有字段的值
HSCAN key cursor [MATCH pattern] [COUNT count]
迭代哈希表中的鍵值對(duì)。
Redis 列表(List)
Redis列表是簡(jiǎn)單的字符串列表,按照插入順序排序。你可以添加一個(gè)元素到列表的頭部(左邊)或者尾部(右邊)
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"
在以上實(shí)例中我們使用了 LPUSH 將三個(gè)值插入了名為 runoobkey 的列表當(dāng)中。
Redis 列表命令
BLPOP key1 [key2 ] timeout
移除并獲取列表第一個(gè)值,沒(méi)有元素則等待超時(shí)時(shí)間以內(nèi)
BRPOP key1 [key2 ] timeout
移除并獲取列表最后一個(gè)元素
BRPOPLPUSH source destination timeout
彈出一個(gè)元素并加到另一個(gè)列表(左邊),并返回它。無(wú)值則等超時(shí)
LINDEX key index
索引獲取元素(可 -1 表示最后一個(gè),類推)
LINSERT key BEFORE|AFTER pivot value
在指定的元素前 或 后 插入元素
LLEN key
獲取列表長(zhǎng)度
LPOP key
移除并獲取列表第一個(gè)元素
LPUSH key value1 [value2]
插入多值到表頭
LPUSHX key value
已存在的表 頭加一個(gè)值 返回列表長(zhǎng)度 (列表不存在時(shí)操作無(wú)效)
LRANGE key start stop
獲取指定范圍的值
LREM key count value
移除列表的值(移除數(shù)量為 +-count 值是value 的值,正數(shù)左邊開始,負(fù)數(shù)右邊開始,0 移除所有)
LSET key index value
通過(guò)索引設(shè)置元素的值
LTRIM key start stop
只保留范圍內(nèi)的值,其他刪掉
RPOP key
移除最后一個(gè)值,并返回它
RPOPLPUSH source destination
移除最后一個(gè)值,并加到另外一個(gè)列表(頭),并返回它
RPUSH key value1 [value2]
從右邊插值
RPUSHX key value
已存在右邊插入一個(gè)值 (返回列表長(zhǎng)度)
-
Redis 集合(Set)
不重復(fù)的string集合
Redis 中集合是通過(guò)哈希表實(shí)現(xiàn)的,所以添加,刪除,查找的復(fù)雜度都是 O(1)
最多40億個(gè)成員
實(shí)例:
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 集合命令
向集合添加一個(gè)或多個(gè)成員
SADD key member1 [member2]
獲取集合的成員數(shù)
SCARD key
返回給定所有集合的差集
SDIFF key1 [key2] |
返回給定所有集合的差集并存儲(chǔ)在 destination 中
SDIFFSTORE destination key1 [key2]
返回給定所有集合的交集
SINTER key1 [key2]
返回給定所有集合的交集并存儲(chǔ)在 destination 中
SINTERSTORE destination key1 [key2]
判斷 member 元素是否是集合 key 的成員
SISMEMBER key member
返回集合中的所有成員
SMEMBERS key
將 member 元素從 source 集合移動(dòng)到 destination 集合.
SMOVE source destination member
移除并返回集合中的一個(gè)隨機(jī)元素
SPOP key
返回集合中一個(gè)或多個(gè)隨機(jī)數(shù).
SRANDMEMBER key [count]
移除集合中一個(gè)或多個(gè)成員
SREM key member1 [member2]
返回所有給定集合的并集
SUNION key1 [key2]
所有給定集合的并集存儲(chǔ)在 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 一樣,
不同的是每個(gè)元素都會(huì)關(guān)聯(lián)一個(gè)double類型的分?jǐn)?shù)。redis正是通過(guò)分?jǐn)?shù)來(lái)為集合中的成員進(jìn)行從小到大的排序。
略