本篇文章給大家?guī)?lái)了關(guān)于Redis的相關(guān)知識(shí),其中主要整理了從環(huán)境搭建到熟練使用的相關(guān)問(wèn)題,其中包括了Redis的單節(jié)點(diǎn)安裝教程、Redis的常用命令、Redis的數(shù)據(jù)模型等等內(nèi)容,下面一起來(lái)看一下,希望對(duì)大家有幫助。
推薦學(xué)習(xí):Redis視頻教程
一、常見(jiàn)的非關(guān)系型數(shù)據(jù)庫(kù)NOSQL分類
NOSQL類型 | 主要數(shù)據(jù)庫(kù)產(chǎn)品 | 類型特色 |
---|---|---|
K-V鍵值對(duì)存儲(chǔ)類型 | Redis、Memcached | 使用key可以快速的查詢到value,Memcached可以支持String類型的值value,Redis支持的值的數(shù)據(jù)類型很多如:Stringsethashsortsetlist等等 |
文檔存儲(chǔ)類型 | MongoDB、CouchDB | 使用JSON或類JSON的BSON數(shù)據(jù)結(jié)構(gòu),存儲(chǔ)的內(nèi)容為文檔型,能夠?qū)崿F(xiàn)部分關(guān)系型數(shù)據(jù)庫(kù)的功能 |
列存儲(chǔ)類型 | HBase、Cassandra | 按照列進(jìn)行數(shù)據(jù)存儲(chǔ),該類型便于存儲(chǔ)結(jié)構(gòu)化和半結(jié)構(gòu)化的數(shù)據(jù),可以方便做數(shù)據(jù)壓縮和針對(duì)某一列或者某幾列的數(shù)據(jù)查詢 |
圖存儲(chǔ)類型 | Neo4J、FlockDB | 以圖形關(guān)系存儲(chǔ)數(shù)據(jù),能夠很好的彌補(bǔ)關(guān)系型數(shù)據(jù)庫(kù)在圖形存儲(chǔ)時(shí)的不足 |
對(duì)象存儲(chǔ)類型 | Db4o、Versant | 該存儲(chǔ)類型的數(shù)據(jù)庫(kù)通過(guò)類似面向?qū)ο蟮姆绞讲僮鲾?shù)據(jù)庫(kù),通過(guò)對(duì)象的方式存取數(shù)據(jù) |
XML存儲(chǔ)類型 | Berkeley DB XML、BaseX | 該類型數(shù)據(jù)庫(kù)可以高效的存儲(chǔ)XML數(shù)據(jù),并且支持XML的內(nèi)部查詢語(yǔ)法,例如;XQuery、XPath |
二、了解Redis
Redis(Remote Dictionary Server ),即遠(yuǎn)程字典服務(wù),是一個(gè)開(kāi)源的(BSD協(xié)議)使用ANSI C語(yǔ)言編寫(xiě),基于內(nèi)存的且支持持久化,高性能的Key-Value的NOSQL數(shù)據(jù)庫(kù);Redis支持的數(shù)據(jù)結(jié)構(gòu)類型很豐富,如 :字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 以及范圍查詢, bitmaps(位圖), hyperloglogs (超級(jí)日志)和 地理空間(geospatial) 索引半徑查詢等等。并且Redis有著豐富的支持主流語(yǔ)言的客戶端,C/C++、Python、Erlang、R、C#、Java、PHP、Objective-C、Perl、Ruby、Scala、Go、JavaScript等;Redis 內(nèi)置復(fù)制、Lua 腳本、LRU 驅(qū)逐、事務(wù)和不同級(jí)別的磁盤(pán)持久化,并通過(guò) Redis Sentinel 和 Redis Cluster 自動(dòng)分區(qū)提供高可用性;我們可以將Redis應(yīng)用在緩存(StackOverFlow)、數(shù)據(jù)庫(kù)、消息中間件等上。
Redis官網(wǎng)鏈接: https://redis.io/
三、Redis的單節(jié)點(diǎn)安裝教程
點(diǎn)我返回目錄
安裝準(zhǔn)備:Linux虛擬機(jī):CentOS7、操作工具:Xshell 、Xftp
Redis安裝包下載地址:https://download.redis.io/releases/
(1)、在安裝Redis之前,我們需要先配置阿里云的yum源
下載配置文件
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
生成緩存
yum makecache
(2)、安裝Redis
1、因?yàn)镽edis是使用ANSI C語(yǔ)言編寫(xiě)的,所以我們要先安裝gcc依賴
yum install -y gcc-c++ gcc tcl
2、使用Xftp上傳Redis壓縮的安裝包到Linux虛擬機(jī)并解壓
上傳的壓縮包的路徑,可以自己指定或創(chuàng)建上傳的目錄
小北是上傳到了/usr/local/module/目錄,然后解壓到了/usr/local/soft/目錄下
tar -xvf redis-3.0.0.tar.gz
3、進(jìn)入解壓好的目錄redis-3.0.0,編譯make
cd redis-3.0.0
make
下面shell命令是用于測(cè)試make的,可用可不用
make test
創(chuàng)建安裝目錄
這是小北的安裝目錄 mkdir -p /usr/local/soft/redis
安裝
make PREFIX=/usr/local/soft/redis install
4、復(fù)制配置文件
cp /usr/local/soft/redis-3.0.0/redis.conf /usr/local/soft/redis/bin/
配置環(huán)境變量
vim /etc/profile
添加環(huán)境變量
export REDIS_HOME=/usr/local/soft/redis/ export PATH=$REDIS_HOME/bin
讓環(huán)境變量修改生效
source /etc/profile
5、啟動(dòng)Redis
后臺(tái)啟動(dòng)
cd /usr/local/soft/redis/bin
nohup redis-server redis.conf &
關(guān)閉redis的命令,要先獲取Redis的進(jìn)程號(hào),殺死該進(jìn)程
ps -aux | grep redis
kill -9
6、連接Redis
查看啟動(dòng)日志:
cat nohup.out
后臺(tái)啟動(dòng)Redis
redis-cli
7、測(cè)試使用Redis
插入一條數(shù)據(jù)
set key1 value1
查詢數(shù)據(jù)
get key1
四、Redis的常用命令
1、Help幫助命令
2、SET命令
點(diǎn)我返回目錄
(1)設(shè)置字符串值 命令使用格式: SET key value [EX seconds] [PX milliseconds] [NX|XX] 注意: EX 表示設(shè)置過(guò)期時(shí)間,單位:秒,等同于SETEX key seconds value PX 表示設(shè)置過(guò)期時(shí)間,單位:毫秒,等同于PSETEX key milliseconds value NX 表示鍵不存在,才能設(shè)置,等同于SETNX key value XX 表示鍵存在時(shí),才能設(shè)置 (2)設(shè)置多個(gè)鍵的字符串值 使用格式: MSET key value [key value ...](3)當(dāng)鍵不存在時(shí),設(shè)置字符串值 MSETNX key value [key value ...] 注意:這是原子操作
3、過(guò)期命令
Redis中可以給Key設(shè)置一個(gè)生存時(shí)間(秒或毫秒),當(dāng)達(dá)到這個(gè)時(shí)長(zhǎng)后,這些鍵值將會(huì)被自動(dòng)刪除。
(1)設(shè)置多少秒或者毫秒后過(guò)期 EXPIRE key seconds PEXPIRE key milliseconds (2)設(shè)置在指定Unix時(shí)間戳過(guò)期 EXPIREAT key timestamp PEXPIREAT key milliseconds-timestamp (3)刪除過(guò)期 PERSIST key (4)生存時(shí)間 Time To Live,指Key的剩余生存時(shí)間 (5)查看剩余生存時(shí)間 TTL key PTTL key key存在但沒(méi)有設(shè)置TTL,返回-1 key存在,但還在生存期內(nèi),返回剩余的秒或者毫秒 key曾經(jīng)存在,但已經(jīng)消亡,返回-2(2.8版本之前返回-1)
4、查找鍵命令
(1)查找鍵使用格式: KEYS pattern (2)pattern的取值 * 任意長(zhǎng)度字符 ? 任意一個(gè)字符 [] 字符集合,表示可以是集合中的任意一個(gè)
5、操作鍵命令
(1)查看鍵的數(shù)據(jù)類型 TYPE key (2)判斷鍵是否存在 EXISTS key (3)給鍵重命名 RENAME key newkey RENAMENX key newkey 若鍵存在就rename (4)刪除鍵 DEL key [key ...]
6、GET命令
(1)獲取值 GET key (2)獲取多個(gè)給定的鍵的值 MGET key [key ...] (3)返回舊值并設(shè)置新值 GETSET key value 如果鍵不存在,就創(chuàng)建并賦值 (4)獲取字符串長(zhǎng)度 STRLEN key (5)追加字符串 APPEND key value 如果鍵存在就追加;如果不存在就等同于SET key value (6)獲取子字符串 GETRANGE key start end 索引值從0開(kāi)始,負(fù)數(shù)表示從字符串右邊向左數(shù)起,-1表示最有一個(gè)字符 (7)覆蓋字符串 SETRANGE key offset value
7、步長(zhǎng)命令
注意:只能對(duì)整形的數(shù)據(jù)進(jìn)行步長(zhǎng)操作 (1)步長(zhǎng)1的增減 INCR key DECR key 字符串值會(huì)被解釋成64位有符號(hào)的十進(jìn)制整數(shù)來(lái)操作,結(jié)果依然轉(zhuǎn)成字符串 (2)步長(zhǎng)增減,指定步長(zhǎng)長(zhǎng)度 INCRBY key decrement DECRBY key decrement 字符串值會(huì)被解釋成64位有符號(hào)的十進(jìn)制整數(shù)來(lái)操作,結(jié)果依然轉(zhuǎn)成字符串
8、登錄不同的庫(kù)命令
redis-cli --help redis-cli -n 2
9、清除當(dāng)前庫(kù)數(shù)據(jù)命令
FLUSHDB
10、清除所有庫(kù)中的數(shù)據(jù)命令
FLUSHALL
五、BITMAP位圖
位圖不是真正的數(shù)據(jù)類型,它是定義在字符串類型中的,我們知道一個(gè)字符串類型的值最多能存儲(chǔ)512M字節(jié)的內(nèi)容,其中位上限:2^(9+10+10+3) =2^32b
1、位圖常用命令
(1)設(shè)置某一位上的值 SETBIT key offset value offset偏移量,從0開(kāi)始 value不寫(xiě),默認(rèn)是0 (2)獲取某一位上的值 GETBIT key offset (3)返回指定值0或者1在指定區(qū)間上第一次出現(xiàn)的位置 BITPOS key bit [start] [end]
2、位操作命令
對(duì)一個(gè)或多個(gè)保存二進(jìn)制位的字符串 key 進(jìn)行位元操作,并將結(jié)果保存到 dteskey 上
- operation 可以是 AND 、 OR 、 NOT 、 XOR 這四種操作中的任意一種
- BITOP AND destkey key [key …] ,對(duì)一個(gè)或多個(gè) key 求邏輯并,并將結(jié)果保存到 destkey
- BITOP OR destkey key [key …] ,對(duì)一個(gè)或多個(gè) key 求邏輯或,并將結(jié)果保存到 destkey
- BITOP XOR destkey key [key …] ,對(duì)一個(gè)或多個(gè) key 求邏輯異或,并將結(jié)果保存到 destkey
- BITOP NOT destkey key ,對(duì)給定 key 求邏輯非,并將結(jié)果保存到 destkey
- 除了 NOT 操作之外,其他操作都可以接受一個(gè)或多個(gè) key 作為輸入
- 當(dāng) BITOP 處理不同長(zhǎng)度的字符串時(shí),較短的那個(gè)字符串所缺少的部分會(huì)被看作 0
- 空的 key 也被看作是包含 0 的字符串序列
已知a和b的二進(jìn)制表示: a = 01100001 b = 01100010 都為1才為1 AND=》求邏輯并(與) 1 and 1->1 0 and 0->0 1 and 0->0 bitop and aband a b 有一個(gè)為1就為1 OR=》求邏輯或 1 or 1->1 0 or 0->0 1 or 0->1 bitop or abor a b 就是取反(反轉(zhuǎn))NOT=》求邏輯非 not 0 ->1 not 1->0 bitop not anot a bitop not bnot b 相同為0,相異為1 XOR=》求邏輯異或 0 xor 0->0 1 xor 1->0 1 xor 0->1 bitop xor abxor a b
3、統(tǒng)計(jì)指定位區(qū)間上值為1的個(gè)數(shù)
使用格式1: BITCOUNT key [start] [end] 從左向右從0開(kāi)始,從右向左從-1開(kāi)始, 注意:官方start、end是位,測(cè)試后是字節(jié) 使用格式2: BITCOUNT testkey 0 0 表示從索引為0個(gè)字節(jié)到索引為0個(gè)字節(jié),也就是指對(duì)第一個(gè)字節(jié)的統(tǒng)計(jì) 注意: BITCOUNT testkey 0 -1 等同于BITCOUNT testkey 我們最常用的格式就是 BITCOUNT testkey
六、Redis的數(shù)據(jù)模型
1、Redis的 key 鍵
Redis的 key 值是二進(jìn)制安全的,這意味著可以用任何二進(jìn)制序列作為key值,從形如”foo”的簡(jiǎn)單字符串到一個(gè)JPEG文件的內(nèi)容都可以??兆址彩怯行ey值。
Key取值原則:
- 鍵值不需要太長(zhǎng),太長(zhǎng)會(huì)消耗內(nèi)存,且在數(shù)據(jù)中查找這類鍵值的計(jì)算成本較高
- 鍵值不宜過(guò)短,過(guò)短則可讀性較差
2、Redis的 Value 值
1、String字符串
字符串是一種最基本的Redis值類型。Redis字符串是二進(jìn)制安全的,這意味著一個(gè)Redis字符串能包含任意類型的數(shù)據(jù);并且一個(gè)字符串類型的值最多能存儲(chǔ)512M字節(jié)的內(nèi)容。
2、 List列表
List列表是基于Linked List實(shí)現(xiàn)的,列表中的元素是字符串類型;而列表的頭尾增刪速度快,中間增刪速度慢,正常使用過(guò)程中增刪元素是常態(tài),列表中元素可以重復(fù)出現(xiàn),并且列表中最多能包含2^32-1個(gè)元素;列表的索引,從左至右,從0開(kāi)始;從右至左,從-1開(kāi)始
(1)注意: 命令說(shuō)明: B --》block 塊,阻塞 L --》left 左 R --》right 右 X --》exist 存在
(2)左右(或者頭尾)壓入元素 左(頭)壓入元素: 格式: LPUSH key value [value ...] 舉例: LPUSHX key value 左(頭)壓入元素: 格式:RPUSH key value [value ...] 舉例:RPUSHX key value
(3)左右(或者頭尾)彈出元素(取出元素后,原先的位置就沒(méi)有了) LPOP key RPOP key (4)從一個(gè)列表尾部彈出元素壓入到另一個(gè)列表的頭部 RPOPLPUSH source destination (5)返回列表中指定范圍元素(返回元素后,原先的位置還有) LRANGE key start stop LRANGE key 0 -1 表示返回所有元素 (6)獲取指定位置的元素 LINDEX key index (7)設(shè)置指定位置元素的值 LSET key index value (8)獲取列表長(zhǎng)度(元素個(gè)數(shù)) LLEN key (9)從列表頭部開(kāi)始刪除值等于value的元素count次 LREM key count value count > 0 : 從表頭開(kāi)始向表尾搜索,移除與 value 相等的元素,數(shù)量為 count count < 0 : 從表尾開(kāi)始向表頭搜索,移除與 value 相等的元素,數(shù)量為 count 的絕對(duì)值 count = 0 : 移除表中所有與 value 相等的值 (10)去除指定范圍外元素 LTRIM key start stop (11)在列表中某個(gè)存在的值(pivot)前或后插入元素 LINSERT key BEFORE|AFTER pivot value 若key和pivot不存在,則不進(jìn)行任何操作 (12)阻塞 如果彈出的列表不存在或者為空,就會(huì)造成阻塞 若超時(shí)時(shí)間設(shè)置為0,就是永久阻塞,直到有數(shù)據(jù)可以彈出 如果多個(gè)客戶端阻塞在同一個(gè)列表上,那么使用First In First Service原則,先到先服務(wù) (13)左右(或者頭尾)阻塞彈出元素 BLPOP key [key ...] timeout BRPOP key [key ...] timeout (14)從一個(gè)列表尾部阻塞彈出元素壓入到另一個(gè)列表的頭部 BRPOPLPUSH source destination timeout
3、 Hash散列
Hash散列是由field和關(guān)聯(lián)的value組成的map鍵值對(duì),而field和value都是字符串類型,一個(gè)hash中最多包含2^32-1鍵值對(duì)。
(1)設(shè)置單個(gè)字段 HSET key field value HSETNX key field value 當(dāng)在key的filed不存在的情況下執(zhí)行,那么key不存在會(huì)直接創(chuàng)建 (2)設(shè)置多個(gè)字段 HMSET key field value [field value ...] (3)返回字段個(gè)數(shù) HLEN key (4)判斷字段是否存在 HEXISTS key field key或者field不存在,返回0 (5)返回字段值 HGET key field (6)返回多個(gè)字段值 HMGET key field [field ...] (7)返回所有的鍵值對(duì) HGETALL key (8)返回所有字段名 HKEYS key (9)返回所有值 HVALS key (10)在字段對(duì)應(yīng)的值上進(jìn)行整數(shù)的增量計(jì)算 HINCRBY key field increment (11)在字段對(duì)應(yīng)的值上進(jìn)行浮點(diǎn)數(shù)的增量計(jì)算 HINCRBYFLOAT key field increment (12)刪除指定的字段 HDEL key field [field ...]
1).使用Hash的優(yōu)點(diǎn)
- 節(jié)約內(nèi)存空間
- 每創(chuàng)建一個(gè)鍵,它都會(huì)為這個(gè)鍵儲(chǔ)存一些附加的管理信息(例如這個(gè)鍵最后一次被訪問(wèn)的時(shí)間等等)所以數(shù)據(jù)庫(kù)里面的鍵越多,Redis數(shù)據(jù)庫(kù)服務(wù)器在儲(chǔ)存附加管理信息方面耗費(fèi)的內(nèi)存就會(huì)越多,那么用在管理數(shù)據(jù)庫(kù)鍵上的CPU也會(huì)越多,在字段對(duì)應(yīng)的值上進(jìn)行浮點(diǎn)數(shù)的增量計(jì)算。
2).不適合使用Hash的情況
- 使用二進(jìn)制位操作命令:因?yàn)镽edis目前支持對(duì)字符串鍵進(jìn)行SETBIT、GETBIT、BITOP等操作,若要使用這些操作,那么只能使用字符串鍵,雖然散列也能保存二進(jìn)制數(shù)據(jù)
- 使用過(guò)期鍵功能:Redis的鍵過(guò)期功能目前只能對(duì)鍵進(jìn)行過(guò)期操作,而不能對(duì)散列的字段進(jìn)行過(guò)期操作,因此如果你要對(duì)鍵值對(duì)數(shù)據(jù)使用過(guò)期功能的話,那么只能把鍵值對(duì)儲(chǔ)存在字符串里面
4、Set集合
Set集合內(nèi)存儲(chǔ)的元素是無(wú)序的、去重的,元素是字符串類型,最多包含2^32-1個(gè)元素
(1)增加一個(gè)或多個(gè)元素 SADD key member [member ...] 如果元素已經(jīng)存在,則自動(dòng)忽略 (2)移除一個(gè)或者多個(gè)元素 SREM key member [member ...] 元素不存在,自動(dòng)忽略 (3)返回集合包含的所有元素 SMEMBERS key 如果集合元素過(guò)多,例如百萬(wàn)個(gè),需要遍歷,可能會(huì)造成服務(wù)器阻塞,生產(chǎn)環(huán)境應(yīng)避免使用 (4)檢查給定元素是否存在于集合中 SISMEMBER key member (5)集合的無(wú)序性 SADD friends "java" "hadoop" "tomcat" "hive" "mapreduce" "spark" SADD anotherfriends "java" "hadoop" "tomcat" "hive" "mapreduce" "spark" SMEMBERS friends SMEMBERS anotherfriends 注意: SMEMBERS 有可能返回不同的結(jié)果, 如果需要存儲(chǔ)有序且不重復(fù)的數(shù)據(jù)使用有序集合,存儲(chǔ)有序可重復(fù)的使用列表 (6)隨機(jī)返回集合中指定個(gè)數(shù)的 SRANDMEMBER key [count] 如果 count 為正數(shù),且小于集合基數(shù), 那么命令返回一個(gè)包含 count 個(gè)元素的數(shù)組,數(shù)組中的元素各不相同。 如果 count 大于等于集合基數(shù),那么返回整個(gè)集合 如果 count 為負(fù)數(shù), 那么命令返回一個(gè)數(shù)組,數(shù)組中的元素可能會(huì)重復(fù)出現(xiàn)多次,而數(shù)組的長(zhǎng)度為 count 的絕對(duì)值 如果 count 為 0,返回空 如果 count 不指定,隨機(jī)返回一個(gè)元素 (7)返回集合中元素的個(gè)數(shù) SCARD key 鍵的結(jié)果會(huì)保存信息,集合長(zhǎng)度就記錄在里面,所以不需要遍歷 (8)隨機(jī)從集合中移除并返回這個(gè)被移除的元素 SPOP key (9)把元素從源集合移動(dòng)到目標(biāo)集合 SMOVE source destination member (10)求差集 SDIFF key [key ...],從第一個(gè)key的集合中去除其他集合和自己的交集部分 SDIFFSTORE destination key [key ...],將差集結(jié)果存儲(chǔ)在目標(biāo)key中 (11)求交集 SINTER key [key ...],取所有集合交集部分 SINTERSTORE destination key [key ...],將交集結(jié)果存儲(chǔ)在目標(biāo)key中 (12)求并集 SUNION key [key ...],取所有集合并集 SUNIONSTORE destination key [key ...],將并集結(jié)果存儲(chǔ)在目標(biāo)key中
5、SortedSet有序集合
SortedSet有序集合與Set集合類似,它是有序的、去重的,元素是字符串類型,每一個(gè)元素都關(guān)聯(lián)著一個(gè)浮點(diǎn)數(shù)分值(Score),并按照分值從小到大的順序排列集合中的元素。其分值可以相同;最多包含2^32-1個(gè)元素。
(1)增加一個(gè)或多個(gè)元素 ZADD key score member [score member ...] 如果元素已經(jīng)存在,則使用新的score (2)移除一個(gè)或者多個(gè)元素 ZREM key member [member ...] 元素不存在,自動(dòng)忽略 (3)顯示分值 ZSCORE key member (4)增加或者減少分值 ZINCRBY key increment member increment為負(fù)數(shù)就是減少 (5)返回元素的排名(索引) ZRANK key member (6)返回元素的逆序排名 ZREVRANK key member (7)返回指定索引區(qū)間元素 ZRANGE key start stop [WITHSCORES] 如果score相同,則按照字典序lexicographical order 排列 默認(rèn)按照score從小到大,如果需要score從大到小排列,使用ZREVRANGE (8)返回指定索引區(qū)間元素 ZREVRANGE key start stop [WITHSCORES] 如果score相同,則按照字典序lexicographical order 的 逆序 排列 默認(rèn)按照score從大到小,如果需要score從小到大排列,使用ZRANGE (9)返回指定分值區(qū)間元素(升序排序) ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] 返回score默認(rèn)屬于[min,max]之間,元素按照score升序排列,若score相同則按照字典排序 LIMIT中offset代表跳過(guò)多少個(gè)元素,count是返回幾個(gè)。類似于Mysql 使用小括號(hào),則修改區(qū)間為開(kāi)區(qū)間,例如(5、(10、5) -inf 和 +inf 分別表示負(fù)無(wú)窮和正無(wú)窮 (10)返回指定分值區(qū)間元素(降序排序) ZREVRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] 返回score默認(rèn)屬于[min,max]之間,元素按照score降序排列,score相同字典降序 LIMIT中offset代表跳過(guò)多少個(gè)元素,count是返回幾個(gè)。類似于Mysql 使用小括號(hào),修改區(qū)間為開(kāi)區(qū)間,例如(5、(10、5) -inf和+inf表示負(fù)無(wú)窮和正無(wú)窮 (11)移除指定排名范圍的元素 ZREMRANGEBYRANK key start stop (12)移除指定分值范圍的元素 ZREMRANGEBYSCORE key min max (13)返回集合中元素個(gè)數(shù) ZCARD key (14)返回指定范圍中元素的個(gè)數(shù) ZCOUNT key min max ZCOUNT fruits 4 7 ZCOUNT fruits (4 7 (15)求并集 ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]numkeys必須指定key的數(shù)量 WEIGHTS選項(xiàng),與前面設(shè)定的key對(duì)應(yīng),對(duì)應(yīng)key中每一個(gè)score都要乘以這個(gè)權(quán)重 AGGREGATE選項(xiàng),指定并集結(jié)果的聚合方式 SUM:將所有集合中某一個(gè)元素的score值之和作為結(jié)果集中該成員的score值 MIN:將所有集合中某一個(gè)元素的score值中最小值作為結(jié)果集中該成員的score值 MAX:將所有集合中某一個(gè)元素的score值中最大值作為結(jié)果集中該成員的score值 (16)求交集 ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]numkeys指定key的數(shù)量,必須 WEIGHTS選項(xiàng),與前面設(shè)定的key對(duì)應(yīng),對(duì)應(yīng)key中每一個(gè)score都要乘以這個(gè)權(quán)重 AGGREGATE選項(xiàng),指定并集結(jié)果的聚合方式 SUM:將所有集合中某一個(gè)元素的score值之和作為結(jié)果集中該成員的score值 MIN:將所有集合中某一個(gè)元素的score值中最小值作為結(jié)果集中該成員的score值 MAX:將所有集合中某一個(gè)元素的score值中最大值作為結(jié)果集中該成員的score值
七、Redis持久化
Redis持久化是指將數(shù)據(jù)從掉電易失的內(nèi)存存放到能夠永久存儲(chǔ)的設(shè)備上
Redis持久化兩種方式:RDB(Redis DB) 和 AOF(AppendOnlyFile)
1、Redis持久化-RDB
在默認(rèn)情況下,Redis 將數(shù)據(jù)庫(kù)快照保存在名字為 dump.rdb的二進(jìn)制文件中
(1)RDB使用策略
- 自動(dòng):按照配置文件中的條件滿足就執(zhí)行BGSAVE
save 60 10000,Redis要滿足在60秒內(nèi)至少有10000個(gè)鍵被改動(dòng),會(huì)自動(dòng)保存一次 - 手動(dòng):客戶端發(fā)起SAVE、BGSAVE命令
注意:RDB策略會(huì)容易造成數(shù)據(jù)丟失
(2)SAVE命令
在redis 客戶端使用 save命令用于將數(shù)據(jù)持久化的保存到disk(磁盤(pán))中,但執(zhí)行該命令時(shí)會(huì)阻塞Redis服務(wù),無(wú)法響應(yīng)客戶端請(qǐng)求,也就是在服務(wù)器執(zhí)行save命令期間,Redis服務(wù)器不允許執(zhí)行其它的命令直到save命令執(zhí)行完,執(zhí)行save命令會(huì)創(chuàng)建新的dump.rdb替代舊文件。
(3)BGSAVE命令
(該命令是在后臺(tái)執(zhí)行的,是一個(gè)異步命令)
在redis客戶端 使用 bgsave命令時(shí),不會(huì)阻塞Redis服務(wù),也就是非阻塞,Redis服務(wù)正常接收處理客戶端請(qǐng)求,并且Redis會(huì)folk()一個(gè)新的子進(jìn)程來(lái)創(chuàng)建RDB文件,子進(jìn)程處理完后會(huì)向父進(jìn)程發(fā)送一個(gè)信號(hào),通知它處理完畢,父進(jìn)程用新的dump.rdb替代舊文件
(4)SAVE 和 BGSAVE 命令的區(qū)別
- SAVE不用創(chuàng)建新的進(jìn)程,速度略快
- BGSAVE需要?jiǎng)?chuàng)建子進(jìn)程,消耗額外的內(nèi)存
- SAVE適合停機(jī)維護(hù),服務(wù)低谷時(shí)段
- BGSAVE適合線上執(zhí)行
(5)RDB持久化的優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
- 完全備份,不同時(shí)間的數(shù)據(jù)集備份可以做到多版本恢復(fù)
- 緊湊的單一文件,方便網(wǎng)絡(luò)傳輸,適合災(zāi)難恢復(fù)
- 恢復(fù)大數(shù)據(jù)集速度較AOF快
缺點(diǎn)
- 會(huì)丟失最近寫(xiě)入、修改的而未能持久化的數(shù)據(jù)
- folk過(guò)程非常耗時(shí),會(huì)造成毫秒級(jí)不能響應(yīng)客戶端請(qǐng)求
2、Redis持久化-AOF
Append only file(AOF),該方式采用追加的方式保存數(shù)據(jù),默認(rèn)保存的文件appendonly.aof;該方式會(huì)記錄所有的寫(xiě)操作命令,在服務(wù)啟動(dòng)的時(shí)候使用這些命令就可以還原數(shù)據(jù)庫(kù);調(diào)整AOF持久化策略,可以在服務(wù)出現(xiàn)故障時(shí),不丟失任何數(shù)據(jù),也可以丟失一秒的數(shù)據(jù)。相對(duì)于RDB方式損失要小得多
(1)AOF寫(xiě)入機(jī)制
- AOF方式不能保證絕對(duì)不丟失數(shù)據(jù)
- 目前常見(jiàn)的操作系統(tǒng)中,執(zhí)行系統(tǒng)調(diào)用write函數(shù),將一些內(nèi)容寫(xiě)入到某個(gè)文件里面時(shí),為了提高效率,系統(tǒng)通常不會(huì)直接將內(nèi)容寫(xiě)入硬盤(pán)里面,而是先將內(nèi)容放入一個(gè)內(nèi)存緩沖區(qū)(buffer)里面,等到緩沖區(qū)被填滿,或者用戶執(zhí)行fsync調(diào)用和fdatasync調(diào)用時(shí)才將儲(chǔ)存在緩沖區(qū)里的內(nèi)容真正的寫(xiě)入到硬盤(pán)里,而在未寫(xiě)入磁盤(pán)之前,數(shù)據(jù)可能會(huì)丟失。
(2) 寫(xiě)入磁盤(pán)的策略
在redis.conf文件中的appendfsync選項(xiàng),這個(gè)選項(xiàng)的值可以是always、everysec或者no
- Always:服務(wù)器每寫(xiě)入一個(gè)命令,就調(diào)用一次fdatasync,將緩沖區(qū)里面的命令寫(xiě)入到硬盤(pán)。這種模式下,服務(wù)器出現(xiàn)故障,也不會(huì)丟失任何已經(jīng)成功執(zhí)行的命令數(shù)據(jù)
- Everysec(默認(rèn)):服務(wù)器每一秒重調(diào)用一次fdatasync,將緩沖區(qū)里面的命令寫(xiě)入到硬盤(pán)。這種模式下,服務(wù)器出現(xiàn)故障,最多只丟失一秒鐘內(nèi)的執(zhí)行的命令數(shù)據(jù)
- No:服務(wù)器不主動(dòng)調(diào)用fdatasync,由操作系統(tǒng)決定何時(shí)將緩沖區(qū)里面的命令寫(xiě)入到硬盤(pán)。這種模式下,服務(wù)器遭遇意外停機(jī)時(shí),丟失命令的數(shù)量是不確定的
運(yùn)行速度:always的速度慢,everysec和no都很快
(3)AOF重寫(xiě)機(jī)制
- AOF文件過(guò)大
- 合并重復(fù)的操作,AOF會(huì)使用盡可能少的命令來(lái)記錄
重寫(xiě)的過(guò)程
- folk一個(gè)子進(jìn)程負(fù)責(zé)重寫(xiě)AOF文件
- 子進(jìn)程會(huì)創(chuàng)建一個(gè)臨時(shí)文件寫(xiě)入AOF信息
- 父進(jìn)程會(huì)開(kāi)辟一個(gè)內(nèi)存緩沖區(qū)接收新的寫(xiě)命令
- 子進(jìn)程重寫(xiě)完成后,父進(jìn)程會(huì)獲得一個(gè)信號(hào),將父進(jìn)程接收到的新的寫(xiě)操作由子進(jìn)程寫(xiě)入到臨時(shí)文件中
- 新文件替代舊文件
注意:如果寫(xiě)入操作的時(shí)候出現(xiàn)故障導(dǎo)致命令寫(xiě)半截,可以使用redis-check-aof工具修復(fù)
(4)AOF重寫(xiě)觸發(fā)
- 手動(dòng):客戶端向服務(wù)器發(fā)送BGREWRITEAOF命令
- 自動(dòng):配置文件中的選項(xiàng),自動(dòng)執(zhí)行BGREWRITEAOF命令
- auto-aof-rewrite-min-size < size >,觸發(fā)AOF重寫(xiě)所需的最小體積:只要在AOF文件的體積大于等于size時(shí),才會(huì)考慮是否需要進(jìn)行AOF重寫(xiě),這個(gè)選項(xiàng)用于避免對(duì)體積過(guò)小的AOF文件進(jìn)行重寫(xiě)
- auto-aof-rewrite-percentage < percent >,指定觸發(fā)重寫(xiě)所需的AOF文件體積百分比:當(dāng)AOF文件的體積大于auto-aof-rewrite-min-size指定的體積,并且超過(guò)上一次重寫(xiě)之后的AOF文件體積的percent %時(shí),就會(huì)觸發(fā)AOF重寫(xiě)。(如果服務(wù)器剛剛啟動(dòng)不久,還沒(méi)有進(jìn)行過(guò)AOF重寫(xiě),那么使用服務(wù)器啟動(dòng)時(shí)載入的AOF文件的體積來(lái)作為基準(zhǔn)值)。將這個(gè)值設(shè)置為0表示關(guān)閉自動(dòng)AOF重寫(xiě)
舉例:
auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb 當(dāng)AOF文件大于64MB時(shí)候,可以考慮重寫(xiě)AOF文件 只有當(dāng)AOF文件的增量大于起始size的100%時(shí), 也就是文件大小翻了一倍時(shí),啟動(dòng)重寫(xiě)
(5)AOF持久化的優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
- 寫(xiě)入機(jī)制,默認(rèn)fysnc每秒執(zhí)行,性能很好不阻塞服務(wù),最多丟失一秒的數(shù)據(jù)
- 重寫(xiě)機(jī)制,優(yōu)化AOF文件
- 如果誤操作了(例如:FLUSHALL等),只要AOF未被重寫(xiě),停止服務(wù)移除AOF文件尾部FLUSHALL命令,重啟Redis,可以將數(shù)據(jù)集恢復(fù)到 FLUSHALL 執(zhí)行之前的狀態(tài)
缺點(diǎn)
- 相同數(shù)據(jù)集,AOF文件體積較RDB大了很多
- 恢復(fù)數(shù)據(jù)庫(kù)速度叫RDB慢(文本,命令重演)
八、idea使用Jedis連接Redis
首先需要在idea中的maven中的依賴配置文件pom.xml中導(dǎo)入jedis的依賴包,這里北使用的3.0版本的redis,那么導(dǎo)入的jedis依賴也是對(duì)應(yīng)版本的;若是其它版本可以在maven倉(cāng)庫(kù)中選擇對(duì)應(yīng)版本,鏈接地址:https://mvnrepository.com/artifact/redis.clients/jedis
<!-- https://mvnrepository.com/artifact/redis.clients/jedis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.0.0</version> </dependency>
idea中建立連接
import redis.clients.jedis.Jedis;/** * jdbc:是一種連接關(guān)系型數(shù)據(jù)的規(guī)范 * redis: 是kv結(jié)構(gòu)的非關(guān)系型數(shù)據(jù)庫(kù)(沒(méi)有sql語(yǔ)句),使用jedis連接 */public class jedistest { public static void main(String[] args) { //創(chuàng)建redis連接 Jedis jedis = new Jedis("master", 6379); //獲取數(shù)據(jù) String name = jedis.get("name"); System.out.println(name); }}
推薦學(xué)習(xí):Redis視頻教程