一、Redis簡(jiǎn)介
什么是Redis?全稱:REmote DIctionary Server,是可支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value高性能數(shù)據(jù)庫(kù),并提供多種語(yǔ)言的API,它通常被稱為數(shù)據(jù)結(jié)構(gòu)服務(wù)器,因?yàn)橹担╲alue)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等類(lèi)型:
String: 字符串
Hash: 散列
List: 列表
Set: 集合
Sorted Set: 有序集合
是相對(duì)于關(guān)系型數(shù)據(jù)庫(kù)來(lái)說(shuō)的非關(guān)系型數(shù)據(jù)庫(kù)。
推薦(免費(fèi)):redis
二、優(yōu)勢(shì)優(yōu)點(diǎn)
Redis 與其他 key – value 緩存產(chǎn)品有以下三個(gè)特點(diǎn):
- Redis支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保存在磁盤(pán)中,重啟的時(shí)候可以再次加載進(jìn)行使用。
- Redis不僅僅支持簡(jiǎn)單的key-value類(lèi)型的數(shù)據(jù),同時(shí)還提供list,set,zset,hash等數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)。
- Redis支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。
三、Redis安裝
Redis安裝很簡(jiǎn)單,下載地址:https://github.com/MSOpenTech/redis/releases。然后下載“Redis-x64-xx.x.xxx.zip”放入硬盤(pán)自己喜歡的位置解壓出來(lái)即可,雙擊“redis-server.exe”則按照默認(rèn)配置啟動(dòng)Redis服務(wù)了;雙擊“redis-cli.exe”打開(kāi)客戶端控制臺(tái)可以進(jìn)行命令操作Redis服務(wù)了。
也可:
打開(kāi)一個(gè) cmd 窗口 使用cd命令切換目錄到 C:redis 運(yùn)行 redis-server.exe redis.windows.conf 。
執(zhí)行redis-cli.exe -h 127.0.0.1 -p 6379 進(jìn)入到客戶端模式 ,
“-h” 指定Redis服務(wù)器主機(jī)
“-p” 指定Redis服務(wù)器端口
四、Redis配置
Redis 的配置文件位于 Redis 安裝目錄下,文件名為 redis.conf。
你可以通過(guò) **“CONFIG ”**命令查看或設(shè)置配置項(xiàng)。
CONFIG GET 'CONFIG_SETTING_NAME' //獲取對(duì)應(yīng)的參數(shù)配置 CONFIG GET * //獲取所有的參數(shù)配置
CONFIG SET "CONFIG_SETTING_NAME" "NEW_CONFIG_VALUE"//設(shè)置對(duì)應(yīng)的參數(shù)值
參數(shù)說(shuō)明
redis.conf 配置項(xiàng)說(shuō)明如下:
1.Redis默認(rèn)不是以守護(hù)進(jìn)程的方式運(yùn)行,可以通過(guò)該配置項(xiàng)修改,使用yes啟用守護(hù)進(jìn)程
daemonize no
2.當(dāng)Redis以守護(hù)進(jìn)程方式運(yùn)行時(shí),Redis默認(rèn)會(huì)把pid寫(xiě)入/var/run/redis.pid文件,可以通過(guò)pidfile指定
pidfile /var/run/redis.pid
3.指定Redis監(jiān)聽(tīng)端口,默認(rèn)端口為6379,作者在自己的一篇博文中解釋了為什么選用6379作為默認(rèn)端口,因?yàn)?379在手機(jī)按鍵上MERZ對(duì)應(yīng)的號(hào)碼,而MERZ取自意大利歌女Alessia Merz的名字
port 6379
4.綁定的主機(jī)地址
bind 127.0.0.1
5.當(dāng) 客戶端閑置多長(zhǎng)時(shí)間后關(guān)閉連接,如果指定為0,表示關(guān)閉該功能
timeout 300
6.指定日志記錄級(jí)別,Redis總共支持四個(gè)級(jí)別:debug、verbose、notice、warning,默認(rèn)為verbose
loglevel verbose
7.日志記錄方式,默認(rèn)為標(biāo)準(zhǔn)輸出,如果配置Redis為守護(hù)進(jìn)程方式運(yùn)行,而這里又配置為日志記錄方式為標(biāo)準(zhǔn)輸出,則日志將會(huì)發(fā)送給/dev/null
logfile stdout
8.設(shè)置數(shù)據(jù)庫(kù)的數(shù)量,默認(rèn)數(shù)據(jù)庫(kù)為0,可以使用SELECT 命令在連接上指定數(shù)據(jù)庫(kù)id
databases 16
9.指定在多長(zhǎng)時(shí)間內(nèi),有多少次更新操作,就將數(shù)據(jù)同步到數(shù)據(jù)文件,可以多個(gè)條件配合
save <seconds> <changes>
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è)更改。
10.指定存儲(chǔ)至本地?cái)?shù)據(jù)庫(kù)時(shí)是否壓縮數(shù)據(jù),默認(rèn)為yes,Redis采用LZF壓縮,如果為了節(jié)省CPU時(shí)間,可以關(guān)閉該選項(xiàng),但會(huì)導(dǎo)致數(shù)據(jù)庫(kù)文件變的巨大
rdbcompression yes
11.指定本地?cái)?shù)據(jù)庫(kù)文件名,默認(rèn)值為dump.rdb
dbfilename dump.rdb
12.指定本地?cái)?shù)據(jù)庫(kù)存放目錄
dir ./
13.設(shè)置當(dāng)本機(jī)為slav服務(wù)時(shí),設(shè)置master服務(wù)的IP地址及端口,在Redis啟動(dòng)時(shí),它會(huì)自動(dòng)從master進(jìn)行數(shù)據(jù)同步
slaveof <masterip> <masterport>
14.當(dāng)master服務(wù)設(shè)置了密碼保護(hù)時(shí),slav服務(wù)連接master的密碼
masterauth <master-password>
15.設(shè)置Redis連接密碼,如果配置了連接密碼,客戶端在連接Redis時(shí)需要通過(guò)AUTH 命令提供密碼,默認(rèn)關(guān)閉
requirepass foobared
16.設(shè)置同一時(shí)間最大客戶端連接數(shù),默認(rèn)無(wú)限制,Redis可以同時(shí)打開(kāi)的客戶端連接數(shù)為Redis進(jìn)程可以打開(kāi)的最大文件描述符數(shù),如果設(shè)置 maxclients 0,表示不作限制。當(dāng)客戶端連接數(shù)到達(dá)限制時(shí),Redis會(huì)關(guān)閉新的連接并向客戶端返回max number of clients reached錯(cuò)誤信息
maxclients 128
17.指定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)行寫(xiě)入操作,但仍然可以進(jìn)行讀取操作。Redis新的vm機(jī)制,會(huì)把Key存放內(nèi)存,Value會(huì)存放在swap區(qū)
maxmemory <bytes>
18.指定是否在每次更新操作后進(jìn)行日志記錄,Redis在默認(rèn)情況下是異步的把數(shù)據(jù)寫(xiě)入磁盤(pán),如果不開(kāi)啟,可能會(huì)在斷電時(shí)導(dǎo)致一段時(shí)間內(nèi)的數(shù)據(jù)丟失。因?yàn)?redis本身同步數(shù)據(jù)文件是按上面save條件來(lái)同步的,所以有的數(shù)據(jù)會(huì)在一段時(shí)間內(nèi)只存在于內(nèi)存中。默認(rèn)為no
appendonly no
19.指定更新日志文件名,默認(rèn)為appendonly.aof
appendfilename appendonly.aof
20.指定更新日志條件,共有3個(gè)可選值:
no:表示等操作系統(tǒng)進(jìn)行數(shù)據(jù)緩存同步到磁盤(pán)(快)
always:表示每次更新操作后手動(dòng)調(diào)用fsync()將數(shù)據(jù)寫(xiě)到磁盤(pán)(慢,安全)
everysec:表示每秒同步一次(折衷,默認(rèn)值)
appendfsync everysec
21.指定是否啟用虛擬內(nèi)存機(jī)制,默認(rèn)值為no,簡(jiǎn)單的介紹一下,VM機(jī)制將數(shù)據(jù)分頁(yè)存放,由Redis將訪問(wèn)量較少的頁(yè)即冷數(shù)據(jù)swap到磁盤(pán)上,訪問(wèn)多的頁(yè)面由磁盤(pán)自動(dòng)換出到內(nèi)存中(在后面的文章我會(huì)仔細(xì)分析Redis的VM機(jī)制)
vm-enabled no
22.虛擬內(nèi)存文件路徑,默認(rèn)值為/tmp/redis.swap,不可多個(gè)Redis實(shí)例共享
vm-swap-file /tmp/redis.swap
23.將所有大于vm-max-memory的數(shù)據(jù)存入虛擬內(nèi)存,無(wú)論vm-max-memory設(shè)置多小,所有索引數(shù)據(jù)都是內(nèi)存存儲(chǔ)的(Redis的索引數(shù)據(jù) 就是keys),也就是說(shuō),當(dāng)vm-max-memory設(shè)置為0的時(shí)候,其實(shí)是所有value都存在于磁盤(pán)。默認(rèn)值為0
vm-max-memory 0
24.Redis swap文件分成了很多的page,一個(gè)對(duì)象可以保存在多個(gè)page上面,但一個(gè)page上不能被多個(gè)對(duì)象共享,vm-page-size是要根據(jù)存儲(chǔ)的 數(shù)據(jù)大小來(lái)設(shè)定的,作者建議如果存儲(chǔ)很多小對(duì)象,page大小最好設(shè)置為32或者64bytes;如果存儲(chǔ)很大大對(duì)象,則可以使用更大的page,如果不 確定,就使用默認(rèn)值
vm-page-size 32
25.設(shè)置swap文件中的page數(shù)量,由于頁(yè)表(一種表示頁(yè)面空閑或使用的bitmap)是在放在內(nèi)存中的,,在磁盤(pán)上每8個(gè)pages將消耗1byte的內(nèi)存。
vm-pages 134217728
26.設(shè)置訪問(wèn)swap文件的線程數(shù),最好不要超過(guò)機(jī)器的核數(shù),如果設(shè)置為0,那么所有對(duì)swap文件的操作都是串行的,可能會(huì)造成比較長(zhǎng)時(shí)間的延遲。默認(rèn)值為4
vm-max-threads 4
27.設(shè)置在向客戶端應(yīng)答時(shí),是否把較小的包合并為一個(gè)包發(fā)送,默認(rèn)為開(kāi)啟
glueoutputbuf yes
28.指定在超過(guò)一定的數(shù)量或者最大的元素超過(guò)某一臨界值時(shí),采用一種特殊的哈希算法
hash-max-zipmap-entries 64 hash-max-zipmap-value 512
29.指定是否激活重置哈希,默認(rèn)為開(kāi)啟(后面在介紹Redis的哈希算法時(shí)具體介紹)
activerehashing yes
30.指定包含其它的配置文件,可以在同一主機(jī)上多個(gè)Redis實(shí)例之間使用同一份配置文件,而同時(shí)各個(gè)實(shí)例又擁有自己的特定配置文件
include /path/to/local.conf
五、Redis 數(shù)據(jù)類(lèi)型
String: 字符串
Hash: 散列
List: 列表
Set: 集合
Sorted Set: 有序集合
1.String(字符串)
string是redis最基本的類(lèi)型,你可以理解成與Memcached一模一樣的類(lèi)型,一個(gè)key對(duì)應(yīng)一個(gè)value。
string類(lèi)型是二進(jìn)制安全的。意思是redis的string可以包含任何數(shù)據(jù)。比如jpg圖片或者序列化的對(duì)象 。
string類(lèi)型是Redis最基本的數(shù)據(jù)類(lèi)型,一個(gè)鍵最大能存儲(chǔ)512MB。
redis 127.0.0.1:6379> SET name "xlosy" OK redis 127.0.0.1:6379> GET name "xlosy"
在以上實(shí)例中我們使用了 Redis 的 SET 和 GET 命令。鍵為 name,對(duì)應(yīng)的值為 xlosy。
2.Hash(哈希)
Redis hash 是一個(gè)鍵值(key=>value)對(duì)集合。
Redis hash 是一個(gè) string 類(lèi)型的 field 和 value 的映射表,hash 特別適合用于存儲(chǔ)對(duì)象。
redis> HMSET myhash field1 "Hello" field2 "World" "OK" redis> HGET myhash field1 "Hello" redis> HGET myhash field2 "World"
實(shí)例中我們使用了 Redis HMSET, HGET 命令,HMSET 設(shè)置了兩個(gè) field=>value 對(duì), HGET 獲取對(duì)應(yīng) field 對(duì)應(yīng)的 value。
3.List(列表)
Redis 列表是簡(jiǎn)單的字符串列表,按照插入順序排序。你可以添加一個(gè)元素到列表的頭部(左邊)或者尾部(右邊)。
redis 127.0.0.1:6379> lpush xlosy redis (integer) 1 redis 127.0.0.1:6379> lpush xlosy mongodb (integer) 2 redis 127.0.0.1:6379> lpush xlosy rabitmq (integer) 3 redis 127.0.0.1:6379> lrange xlosy 0 10 1) "rabitmq" 2) "mongodb" 3) "redis"
列表最多可存儲(chǔ) 232 – 1 元素 (4294967295, 每個(gè)列表可存儲(chǔ)40多億)。
4.Set(集合)
Redis的Set是string類(lèi)型的無(wú)序集合。
集合是通過(guò)哈希表實(shí)現(xiàn)的,所以添加,刪除,查找的復(fù)雜度都是O(1)。
redis 127.0.0.1:6379> sadd xlosy redis (integer) 1 redis 127.0.0.1:6379> sadd xlosy mongodb (integer) 1 redis 127.0.0.1:6379> sadd xlosy rabitmq (integer) 1 redis 127.0.0.1:6379> sadd xlosy rabitmq (integer) 0 redis 127.0.0.1:6379> smembers xlosy 1) "redis" 2) "rabitmq" 3) "mongodb"
注意:以上實(shí)例中 rabitmq 添加了兩次,但根據(jù)集合內(nèi)元素的唯一性,第二次插入的元素將被忽略。
集合中最大的成員數(shù)為 232 – 1(4294967295, 每個(gè)集合可存儲(chǔ)40多億個(gè)成員)。
5.zset(sorted set:有序集合)
Redis zset 和 set 一樣也是string類(lèi)型元素的集合,且不允許重復(fù)的成員。
不同的是每個(gè)元素都會(huì)關(guān)聯(lián)一個(gè)double類(lèi)型的分?jǐn)?shù)。redis正是通過(guò)分?jǐn)?shù)來(lái)為集合中的成員進(jìn)行從小到大的排序。
zset的成員是唯一的,但分?jǐn)?shù)(score)卻可以重復(fù)。
redis 127.0.0.1:6379> zadd xlosy 0 redis (integer) 1 redis 127.0.0.1:6379> zadd xlosy 0 mongodb (integer) 1 redis 127.0.0.1:6379> zadd xlosy 0 rabitmq (integer) 1 redis 127.0.0.1:6379> zadd xlosy 0 rabitmq (integer) 0 redis 127.0.0.1:6379> > ZRANGEBYSCORE xlosy 0 1000 1) "mongodb" 2) "rabitmq" 3) "redis"
六、Redis命令
Ping:命令驗(yàn)證服務(wù)是否啟動(dòng)
$redis-cli -h 127.0.0.1 -p 6379 -a "mypass"//“-h”是主機(jī)地址,“-p”是主機(jī)端口,“-a”是主機(jī)密碼 redis 127.0.0.1:6379> PING PONG
如果執(zhí)行ping命令后輸出pong則表示Redis服務(wù)器運(yùn)行正常。
**1).Redis對(duì)鍵(key)操作的命令 **
SET: 添加鍵值
redis 127.0.0.1:6379> SET xlosykey redis OK
DEL:刪除已經(jīng)存在的鍵值
redis 127.0.0.1:6379> DEL xlosykey (integer) 1
1 DEL key
該命令用于在 key 存在時(shí)刪除 key。
2 DUMP key
序列化給定 key ,并返回被序列化的值。
3 EXISTS key
檢查給定 key 是否存在。
4 EXPIRE key seconds
為給定 key 設(shè)置過(guò)期時(shí)間。
5 EXPIREAT key timestamp
EXPIREAT 的作用和 EXPIRE 類(lèi)似,都用于為 key 設(shè)置過(guò)期時(shí)間。 不同在于 EXPIREAT 命令接受的時(shí)間參數(shù)是 UNIX 時(shí)間戳(unix timestamp)。
6 PEXPIRE key milliseconds
設(shè)置 key 的過(guò)期時(shí)間以毫秒計(jì)。
7 PEXPIREAT key milliseconds-timestamp
設(shè)置 key 過(guò)期時(shí)間的時(shí)間戳(unix timestamp) 以毫秒計(jì)
8 KEYS pattern
查找所有符合給定模式( pattern)的 key 。
9 MOVE key db
將當(dāng)前數(shù)據(jù)庫(kù)的 key 移動(dòng)到給定的數(shù)據(jù)庫(kù) db 當(dāng)中。
10 PERSIST key
移除 key 的過(guò)期時(shí)間,key 將持久保持。
11 PTTL key
以毫秒為單位返回 key 的剩余的過(guò)期時(shí)間。
12 TTL key
以秒為單位,返回給定 key 的剩余生存時(shí)間(TTL, time to live)。
13 RANDOMKEY
從當(dāng)前數(shù)據(jù)庫(kù)中隨機(jī)返回一個(gè) key 。
14 RENAME key newkey
修改 key 的名稱
15 RENAMENX key newkey
僅當(dāng) newkey 不存在時(shí),將 key 改名為 newkey 。
16 TYPE key
返回 key 所儲(chǔ)存的值的類(lèi)型。