Redis(Remote Dictionary Server ),即遠(yuǎn)程字典服務(wù)恶守,是一個開源的使用ANSI C語言編寫梢杭、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型收恢、Key-Value數(shù)據(jù)庫武学,并提供多種語言的API。
1.redis的特點(diǎn)
(1)redis具有非常高的讀寫性能伦意,讀的性能是110000次/s火窒,寫的性能是81000次/s。
(2)支持的數(shù)據(jù)類型豐富驮肉,包括String(字符串)熏矿,List(鏈表),Hash(哈希)离钝,SET(集合)票编,ZSET(有序集合)
(3)數(shù)據(jù)是緩存在內(nèi)存里面的,可以把數(shù)據(jù)同步到硬盤里卵渴,導(dǎo)致斷電不會丟失慧域。
(4)所有命令的執(zhí)行都是原子性。
2.適合場合及優(yōu)勢
(1)高性能緩存浪读,最常見的應(yīng)用場景昔榴,(memcache)能干的他都能干。
(2)對類型數(shù)據(jù)結(jié)構(gòu)瑟啃,適用各種類型數(shù)據(jù)论泛。
(3)redis分布式存儲。
(4)數(shù)據(jù)有生命周期蛹屿,redis的鍵可以設(shè)置過期時間 屁奏,一段時間以后自動刪除。
(5)高并發(fā)和海量數(shù)據(jù)的處理错负。
(6)數(shù)據(jù)持久化坟瓢,數(shù)據(jù)存儲到硬盤了,服務(wù)器斷電不丟失犹撒。
5.與memcache的比較
(1)數(shù)據(jù)類型:memcache支持的數(shù)據(jù)類型只有String(字符串)類型折联,而redis支持的數(shù)據(jù)類型有String(字符串),List(鏈表)识颊,Hash(哈希)诚镰,SET(集合),ZSET(有序集合)
(2)持久化 :memcache 數(shù)據(jù)是存儲到內(nèi)存中的祥款,一旦斷電或重啟清笨,則數(shù)據(jù)丟失,redis數(shù)據(jù)也是存儲到內(nèi)存中的刃跛,但是可以持久化抠艾,周期性的把數(shù)據(jù)保存到硬盤里,導(dǎo)致重啟或斷電也不會丟失數(shù)據(jù)桨昙。
(3)數(shù)據(jù)量 :memcache一個鍵存儲的數(shù)據(jù)最大是1M检号,redis一個鍵存儲的數(shù)據(jù)是1G腌歉。
6.啟動
(1)使用vim打開配置文件redis.conf,修改如下參數(shù):
daememonize yes 把 no 改成yes,讓redis的進(jìn)程在后臺執(zhí)行齐苛,不占據(jù)當(dāng)前終端翘盖。
(2)redis-server 開啟redis服務(wù)
~ % redis-server
35049:C 20 Aug 2020 13:28:46.604 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
35049:C 20 Aug 2020 13:28:46.604 # Redis version=5.0.2, bits=64, commit=00000000, modified=0, pid=35049, just started
35049:C 20 Aug 2020 13:28:46.604 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
35049:M 20 Aug 2020 13:28:46.606 * Increased maximum number of open files to 10032 (it was originally set to 256).
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 5.0.2 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 35049
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
35049:M 20 Aug 2020 13:28:46.620 # Server initialized
35049:M 20 Aug 2020 13:28:46.624 * DB loaded from disk: 0.004 seconds
35049:M 20 Aug 2020 13:28:46.624 * Ready to accept connections
(3)客戶端連接redis
語法:redis-cli -h 主機(jī)ip -p 端口號
如果是連接本地,直接輸入連接命令即可脸狸,redis-cli是客戶端連接服務(wù)器的命令最仑。
~ % redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>
7.redis的數(shù)據(jù)類型
redis中的數(shù)據(jù)模型為 key / value 模型
1. String(字符串)
String 是redis 最基本的數(shù)據(jù)類型
Redis的string可以包含任何數(shù)據(jù),包括序列化的對象炊甲,數(shù)組泥彤。
單個value值 最大上線是1G字節(jié),如果只用string類型卿啡,redis就可以看作加上持久化特性(服務(wù)器重啟之后不丟失)的memcache吟吝。
應(yīng)用場景:緩存HTML頁面,關(guān)系型數(shù)據(jù)庫的查詢結(jié)果颈娜,統(tǒng)計網(wǎng)站訪問者的數(shù)量剑逃,每天注冊用戶數(shù),統(tǒng)計活躍用戶官辽,用戶在線狀態(tài)等等蛹磺。
(1)set
設(shè)置鍵,值
語法:set key value
返回值同仆,設(shè)置成功返滬ok
注意:從新設(shè)置則直接覆蓋
具體語法:set key value [expiration EX seconds I PX milliseconds] [NX |XX]
Ex seconds (生成時間:秒) | PX milliseconds (生存時間毫秒)
NX (僅鍵不存在是時設(shè)置) | XX 僅鍵存在時設(shè)置
127.0.0.1:6379> set name zhangshan
OK
(2) mset
語法:mset key value [key value]
同時設(shè)置多個key萤捆,如果key存在會被覆蓋,該命令是原子的俗批,所有的鍵會同時設(shè)置成功或失敗俗或,成功返回OK。
127.0.0.1:6379> mset name lisi age 18 sex 1
OK
(3) setex
語法:setex key seconds value
給一個鍵設(shè)置字符串類型岁忘,并指定生存時間(單位:秒)辛慰,該命令是原子的,如果設(shè)置失敗或指定時間失敗干像,會恢復(fù)初始狀態(tài)帅腌,
返回值:如果設(shè)置成功,返回ok麻汰,設(shè)置失敗速客,返回失敗信息。
127.0.0.1:6379> setex name 10 lisi
OK
127.0.0.1:6379> get name
"lisi"
127.0.0.1:6379> get name
(nil)
(4) setnx
語法:setnx key value
如果key不存在什乙,將其設(shè)置為字符串類型挽封,設(shè)置成功已球,如果該鍵已經(jīng)存在臣镣,則設(shè)置失敗辅愿,設(shè)置成功返回1 ,設(shè)置失敗返回0
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> setnx name zhangshang
(integer) 0
127.0.0.1:6379> get name
"lisi"
127.0.0.1:6379> setnx height 180
(integer) 1
127.0.0.1:6379> get height
"180"
(5) get
獲取key對應(yīng)的string值忆某,如果key不存在点待,則返回nil
語法:get key
如果key不是string類型,返回錯誤信息
127.0.0.1:6379> set name zhangfei
OK
127.0.0.1:6379> get name
"zhangfei"
(6) mget
語法:mget key [key key...]
查詢多個key的值弃舒。
返回值癞埠,列出所有鍵key的值,絕不會執(zhí)行失敗聋呢,如果鍵是string類型苗踪,返回其值,如過鍵不存在或者不是string類型削锰,返回nil
127.0.0.1:6379> mset name zhangfei age 18 email zhangfei@163.com
OK
127.0.0.1:6379> mget name age email
1) "zhangfei"
2) "18"
3) "zhangfei@163.com"
(7) strlen
語法:strlen key
返回key的字符串長度
返回值:字符串長度通铲,如果key不存在則返回0,如果不是字符串類型器贩,返回錯誤信息颅夺。
127.0.0.1:6379> set name zhangjiajia
OK
127.0.0.1:6379> strlen name
(integer) 11
(8) getset
語法:getset key value
原子的給一個key設(shè)置一個新值,并且將舊值返回蛹稍,
返回值:如果key不是字符串類型吧黄,則返回一個錯誤
應(yīng)用場景:比如獲取計數(shù)器并且重置為0.
127.0.0.1:6379> set count 5
OK
127.0.0.1:6379> getset count 6
"5"
127.0.0.1:6379> get count
"6"
(9) incr
對key的值做加加操作,每執(zhí)行一次值加一唆姐,值類型要是數(shù)據(jù)類型拗慨。
語法:incr key
將key中存儲的值增一操作,如果key不存在厦酬,則key的值會被先初始化為0胆描,然后再執(zhí)行 incr 操作,key的值必須是整形仗阅。
127.0.0.1:6379> incr age
(integer) 1
127.0.0.1:6379> incr age
(integer) 2
127.0.0.1:6379> incr age
(integer) 3
127.0.0.1:6379> incr age
(integer) 4
127.0.0.1:6379> get age
"4"
(10) incrby
執(zhí)行加法命令昌讲,可以指定相加的值。
語法:incrby key 相加的值
127.0.0.1:6379> incrby number 10
(integer) 10
127.0.0.1:6379> incrby number 10
(integer) 20
127.0.0.1:6379> get number
"20"
(11) decr/decrby
同incr/incrby减噪,只是它是減的
127.0.0.1:6379> set age 100
OK
127.0.0.1:6379> decr age
(integer) 99
127.0.0.1:6379> decrby age 20
(integer) 79
2.Hash(哈希)
Redis中的哈希類型可以看成是具有key和value的容器短绸,該類型非常適合存儲對象信息,mysql中的一行數(shù)據(jù)筹裕,類似與關(guān)聯(lián)數(shù)組醋闭。
(1)hset
設(shè)置hash里面的field和value的值
語法:hset key field value
127.0.0.1:6379> hset student name bajie
(integer) 1
(2) hget
獲取哈希里面的field的值
語法: hget key field
127.0.0.1:6379> hset student name bajie
(integer) 1
127.0.0.1:6379> hget student name
"bajie"
(3) hmset
一次性設(shè)置多個field 和value
語法:hmset key field1 value1 field2 value2...
127.0.0.1:6379> hmset student name bajie age 2000 address china
OK
(4) hmget
一次性獲取多個field的value
語法:hmget key field1 field2...
127.0.0.1:6379> hmset student name bajie age 2000 address china
OK
127.0.0.1:6379> hmget student name age address
1) "bajie"
2) "2000"
3) "china"
(5) hgetall
獲取指定哈希中所有的field和value
語法:hgetall key
127.0.0.1:6379> hmset student name bajie age 2000 address china
OK
127.0.0.1:6379> hgetall student
1) "name"
2) "bajie"
3) "age"
4) "2000"
5) "address"
6) "china"
3.List(鏈表)
List類型其實(shí)就是一個字符串的雙向鏈表,按照插入順序排序朝卒,可以添加一個元素到鏈表的頭部(左邊)或者尾部(右邊)证逻,一個鏈表做多可以包含232-1個元素。這使得list即可以用作棧抗斤,也可以用作隊(duì)列囚企。
應(yīng)用場景:粉絲列表丈咐,最新文章,消息隊(duì)列等龙宏。
上進(jìn)下出:隊(duì)列棵逊,特點(diǎn),先進(jìn)先出
(1)lpush
從鏈表的頭部添加一個或多個元素
語法:lpush key value
操作為原子性操作银酗,如果key不存在辆影,一個空列表會被創(chuàng)建并執(zhí)行l(wèi)push操作,返回執(zhí)行l(wèi)push操作后鏈表的長度
127.0.0.1:6379> lpush student_list zhangshan
(integer) 1
127.0.0.1:6379> lpush student_list lisi wangwu
(integer) 3
(2) lrange
獲取鏈表里的元素
語法:lrange key start strop
注意:如果start(開始下標(biāo))是0黍特,strop(結(jié)束下標(biāo))是-1蛙讥,則是返回鏈表中所有的元素。鏈表里面的元素序號是從0開始的灭衷,類似與索引數(shù)組键菱。
(3) linsert
將元素插入到來鏈表中某個元素之前或之后
語法:linsert key before | after 鏈表中的某個元素 新的元素
如果命令執(zhí)行成功,返回插入操作厚之后的鏈表長度今布,如果沒有找到鏈表中的元素经备,返回-1,如果鏈表不存在或空鏈表部默,返回0.
127.0.0.1:6379> lrange student_list 0 -1
1) "wangwu"
2) "lisi"
3) "zhangshan"
127.0.0.1:6379> lrange student_list 0 -1
1) "wangwu"
2) "lisi"
3) "zhangshan"
127.0.0.1:6379> linsert student_list before lisi mazi
(integer) 4
127.0.0.1:6379> lrange student_list 0 -1
1) "wangwu"
2) "mazi"
3) "lisi"
4) "zhangshan"
127.0.0.1:6379> linsert student_list after lisi xiaobai
(integer) 5
127.0.0.1:6379> lrange student_list 0 -1
1) "wangwu"
2) "mazi"
3) "lisi"
4) "xiaobai"
5) "zhangshan"
(4) lset
修改鏈表中指定下標(biāo)的元素侵蒙,
語法:lset key index value
127.0.0.1:6379> lrange student_list 0 -1
1) "wangwu"
2) "mazi"
3) "lisi"
4) "xiaobai"
5) "zhangshan"
127.0.0.1:6379> lset student_list 1 xiaoming
OK
127.0.0.1:6379> lrange student_list 0 -1
1) "wangwu"
2) "xiaoming"
3) "lisi"
4) "xiaobai"
5) "zhangshan"
(5) lindex
返鏈表中指定下標(biāo)的元素
語法:lindexn key index
127.0.0.1:6379> lrange student_list 0 -1
1) "wangwu"
2) "xiaoming"
3) "lisi"
4) "xiaobai"
5) "zhangshan"
127.0.0.1:6379> lindex student_list 0
"wangwu"
127.0.0.1:6379> lindex student_list 1
"xiaoming"
(6) rpush
從鏈表的尾部添加元素
語法:rpush key value [value ...]
127.0.0.1:6379> lrange student_list 0 -1
1) "wangwu"
2) "xiaoming"
3) "lisi"
4) "xiaobai"
5) "zhangshan"
127.0.0.1:6379> rpush student_list xiaohong xiaohei
(integer) 7
127.0.0.1:6379> lrange student_list 0 -1
1) "wangwu"
2) "xiaoming"
3) "lisi"
4) "xiaobai"
5) "zhangshan"
6) "xiaohong"
7) "xiaohei"
127.0.0.1:6379>
(7) llen
返回鏈表的長度
語法:llen key
127.0.0.1:6379> llen student_list
(integer) 7
(8) lpop
返回鏈表中頭部的元素,并刪除傅蹂。
語法:lpop key
127.0.0.1:6379> lrange student_list 0 -1
1) "wangwu"
2) "xiaoming"
3) "lisi"
4) "xiaobai"
5) "zhangshan"
6) "xiaohong"
7) "xiaohei"
127.0.0.1:6379> lpop student_list
"wangwu"
127.0.0.1:6379> lrange student_list 0 -1
1) "xiaoming"
2) "lisi"
3) "xiaobai"
4) "zhangshan"
5) "xiaohong"
6) "xiaohei"
(9) lrem
刪除鏈表中的元素
語法: lrem key count value
根據(jù)參數(shù)count 的值 纷闺,刪除鏈表中與value相等的元素
count>0 ,從表頭開始向表尾搜索,刪除與value 相等的元素份蝴,數(shù)量為count
count<0,從表尾開始向表頭開始搜索犁功,刪除與value 相等的元素,數(shù)量為count
count=0,刪除表中所有與value相等的值婚夫,
返回值浸卦,被刪除的元素的數(shù)量
127.0.0.1:6379> lrange student_list 0 -1
1) "xiaoming"
2) "lisi"
3) "xiaobai"
4) "zhangshan"
5) "xiaohong"
6) "xiaohei"
127.0.0.1:6379> lrem student_list 0 xiaoming
(integer) 1
127.0.0.1:6379> lrange student_list 0 -1
1) "lisi"
2) "xiaobai"
3) "zhangshan"
4) "xiaohong"
5) "xiaohei"
(10) ltrim
保留指定范圍的元素
語法:ltrim key 開始下標(biāo) 結(jié)束下標(biāo)
127.0.0.1:6379> lrange student_list 0 -1
1) "xiaoming"
2) "lisi"
3) "xiaobai"
4) "zhangshan"
5) "xiaohong"
6) "xiaohei"
127.0.0.1:6379> lrem student_list 0 xiaoming
(integer) 1
127.0.0.1:6379> lrange student_list 0 -1
1) "lisi"
2) "xiaobai"
3) "zhangshan"
4) "xiaohong"
5) "xiaohei"
127.0.0.1:6379> ltrim student_list 0 3
OK
127.0.0.1:6379> lrange student_list 0 -1
1) "lisi"
2) "xiaobai"
3) "zhangshan"
4) "xiaohong"
(11)rpop
刪除并返回鏈表尾部的元素
127.0.0.1:6379> lrange student_list 0 -1
1) "lisi"
2) "xiaobai"
3) "zhangshan"
4) "xiaohong"
127.0.0.1:6379> rpop student_list
"xiaohong"
127.0.0.1:6379> lrange student_list 0 -1
1) "lisi"
2) "xiaobai"
3) "zhangshan"
4.Set(集合)
Redis的set是string類型的無序集合,
set元素最大可以包含(232-1 整型最大值)個元素案糙。
set集合類型除了基本的添加限嫌,刪除操作,還有其他的操作时捌,包括集合的取并集(union)怒医,交集(intersection),差集(diffierence)奢讨,通過這些操作可以很容易的實(shí)現(xiàn)sns中的好友推薦功能稚叹。
注意:每個集合中的各個元素不同重復(fù)。
該類型的應(yīng)用場合:qq推薦。
(1)sadd
向集合中添加元素
語法:sadd key member [member ...]
127.0.0.1:6379> sadd friend zhnagsan
(integer) 1
127.0.0.1:6379> sadd friend lisi wangwu
(integer) 2
(2) smembers
獲取集合中的元素扒袖。
語法:smembers key
127.0.0.1:6379> sadd friend zhnagsan
(integer) 1
127.0.0.1:6379> sadd friend lisi wangwu
(integer) 2
127.0.0.1:6379> smembers friend
1) "lisi"
2) "wangwu"
3) "zhnagsan"
(3) sdiff
獲取集合中的差集蛤奥。
獲取集合中的差集(在集合1中存在,不在集合二中存在的元素)
語法:sdiff 集合1 集合2 ...
127.0.0.1:6379> sadd class1 xiaohei xiaobai xiaohong xiaolan xiaolv
5
127.0.0.1:6379> sadd class2 xiaohei xiaohua xiaohong xiaobei xiaoli
5
127.0.0.1:6379> sdiff class1 class2
xiaolv
xiaobai
xiaolan
(4) sinter
獲取交集僚稿,(在兩個集合中都存在的元素)
語法:sinter 集合1 集合2 ...
127.0.0.1:6379> sadd class1 xiaohei xiaobai xiaohong xiaolan xiaolv
5
127.0.0.1:6379> sadd class2 xiaohei xiaohua xiaohong xiaobei xiaoli
5
127.0.0.1:6379> sinter class1 class2
xiaohong
xiaohei
(5) sunion
求并集(兩個集合合并后,去掉重復(fù)的元素)
語法:sunion 集合1 集合2...
127.0.0.1:6379> sadd class1 xiaohei xiaobai xiaohong xiaolan xiaolv
5
127.0.0.1:6379> sadd class2 xiaohei xiaohua xiaohong xiaobei xiaoli
5
127.0.0.1:6379> sunion class1 class2
xiaobei
xiaohei
xiaolv
xiaoli
xiaohong
xiaohua
xiaolan
xiaobai
(6)scard
獲取集合中的個數(shù)
語法:scard key
127.0.0.1:6379> sadd class1 xiaohei xiaobai xiaohong xiaolan xiaolv
5
127.0.0.1:6379> sadd class2 xiaohei xiaohua xiaohong xiaobei xiaoli
5
127.0.0.1:6379> scard class1
5
127.0.0.1:6379> scard class2
5
5.Zset(有序集合)
Sorted set 是set 的一個升級版本蟀伸,它在set的基礎(chǔ)上增加了一個順序?qū)傩裕?quán)職)蚀同,這一屬性在添加修改元素的時候可以指定,每次指定后啊掏,zset會自動重新按新的值調(diào)整順序蠢络。操作中的key 理解為zset 的名字。
(1)zadd
向有序集合中添加元素迟蜜。如果該元素存在刹孔,則更新其順序,
語法:zadd 集合名 序號 內(nèi)容
127.0.0.1:6379> zadd friend 3 張三
1
(2) zrange
(把集合排序后娜睛,返回名次[start stop]的元素默認(rèn)是升序排列
Withscores 是把score 也打印出來)
按序號升序獲取有序集合中的內(nèi)容
語法:zrange key start stop [WITHSCORES]
注意:下標(biāo)不是序號髓霞,是數(shù)據(jù)的索引
127.0.0.1:6379> zadd friend 3 張三
0
127.0.0.1:6379> zadd friend 1 李四
0
127.0.0.1:6379> zadd friend 2 王五
1
127.0.0.1:6379> zrange friend 0 -1
李四
王五
張三
127.0.0.1:6379> zrange friend 0 -1 withscores
李四
1
王五
2
張三
3
(3) zrevrange
按序號降序獲取有序集合中的內(nèi)容 。
語法:zrevrange key start stop [WITHSCORES]
127.0.0.1:6379> zadd friend 3 張三
0
127.0.0.1:6379> zadd friend 1 李四
0
127.0.0.1:6379> zadd friend 2 王五
1
127.0.0.1:6379> zrevrange friend 0 -1
張三
王五
李四
127.0.0.1:6379> zrevrange friend 0 -1 withscores
張三
3
王五
2
李四
1
(4) zremrangebyrank
Zremrangebyrank 刪除集合中排名在指定范圍的元素(從小到大排序)
語法 zremrangebyrank key min max
127.0.0.1:6379> zadd friend 3 張三
0
127.0.0.1:6379> zadd friend 1 李四
0
127.0.0.1:6379> zadd friend 2 王五
1
127.0.0.1:6379> zremrangebyrank friend 0 1
2
127.0.0.1:6379> zrange friend 0 -1
張三
(5) zcard
語法:zcard key
返回集合中元素的個數(shù)
127.0.0.1:6379> zadd friend 3 zhangshan
1
127.0.0.1:6379> zadd friend 2 wangwu
1
127.0.0.1:6379> zadd friend 1 lisi
1
127.0.0.1:6379> zcard friend
3
(6) zscore
語法:zscore key 元素
返回給定元素對應(yīng)的score
127.0.0.1:6379> zadd friend 3 zhangshan
1
127.0.0.1:6379> zadd friend 2 wangwu
1
127.0.0.1:6379> zadd friend 1 lisi
1
127.0.0.1:6379> zscore friend wangwu
2
8.redis的常用命令
redis提供了豐富的命令對數(shù)據(jù)庫和各種數(shù)據(jù)庫類型進(jìn)行操作畦戒,這些命令可以在Linux終端使用
- 鍵值相關(guān)的命令
- 服務(wù)器相關(guān)的命令
(1) xKeys
返回數(shù)據(jù)庫里面的鍵方库,可以使用通配符,* 表示障斋,任意多個纵潦,?任意一個字符垃环。
127.0.0.1:6379> set name zhnagjiajia
OK
127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> set email zhangjiajia@163.com
OK
127.0.0.1:6379> keys *
age
name
email
127.0.0.1:6379> keys ag*
age
(2)exists
判斷一個鍵是否存在邀层。
語法:exists 鍵名稱 1 鍵名稱 2....
返回值:1代表存在(表手存在的數(shù)量) 0 代表不存在
127.0.0.1:6379> set name zhnagjiajia
OK
127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> set email zhangjiajia@163.com
OK
127.0.0.1:6379> keys *
age
name
email
127.0.0.1:6379> exists age
1
127.0.0.1:6379> exists height
0
(3)del
指定刪除的鍵
語法:del key
127.0.0.1:6379> set name zhnagjiajia
OK
127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> set email zhangjiajia@163.com
OK
127.0.0.1:6379> keys *
age
name
email
127.0.0.1:6379> del email
1
127.0.0.1:6379> keys *
age
name
(4)expire
設(shè)置鍵的有效期
語法:expire key 有效期(秒數(shù))
127.0.0.1:6379> set name zhangjiajia
OK
127.0.0.1:6379> expire name 5
1
127.0.0.1:6379> get name
zhangjiajia
127.0.0.1:6379> get name
(5)ttl
返回一個鍵剩余的過期時間
127.0.0.1:6379> set name zhangjiajia
OK
127.0.0.1:6379> expire name 20
1
127.0.0.1:6379> ttl name
15
127.0.0.1:6379> ttl name
13
127.0.0.1:6379> ttl name
9
127.0.0.1:6379> ttl name
3
127.0.0.1:6379> ttl name
-2
127.0.0.1:6379> get name
(6)type
返回數(shù)據(jù)類型
語法:type key
127.0.0.1:6379> lpush student zhangshan
1
127.0.0.1:6379> type student
list
(7)Select
選擇數(shù)據(jù)庫,在redis里默認(rèn)有0~15號數(shù)據(jù)庫遂庄,默認(rèn)是0號數(shù)據(jù)庫寥院,可以通過redis,conf配置文件進(jìn)行設(shè)置。
切換數(shù)據(jù)庫語法:select 數(shù)據(jù)庫的編號
127.0.0.1:6379> select 1
OK
(8)dbsize
返回當(dāng)前數(shù)據(jù)庫里面鍵的個數(shù)
127.0.0.1:6379> keys *
age
student
127.0.0.1:6379> dbsize
2
(9)flushdb
清空當(dāng)前數(shù)據(jù)庫里面所有的鍵涛目。(慎重使用)
127.0.0.1:6379> keys *
1) "age"
2) "name"
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> keys *
(empty list or set)
10)flushall
清空所有數(shù)據(jù)庫里面的所有的鍵只磷。(慎重使用)
9.安全認(rèn)證
設(shè)置客戶端連接后進(jìn)行任何其他操作前需要使用的密碼
方法:打開redis的配置文件(redis.conf)
#requirepass 設(shè)置的密碼
注意:設(shè)置的密碼是明文的,因此要對redis配置文件泌绣,進(jìn)行嚴(yán)格的授權(quán)钮追。
重啟redis服務(wù)器,讓密碼生效
關(guān)閉redis服務(wù)阿迈,pkill redis-server
啟動 redis-server
客戶端驗(yàn)證方式
注意:如果沒有通過驗(yàn)證元媚,則無法操作
方式一:
通過客戶端登入到服務(wù)器時,添加 -a 選項(xiàng),語法:redis-cli -a 密碼
~ % redis-cli -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> ping
PONG
方式二:
登入到服務(wù)器端后刊棕,使用auth命令來完成驗(yàn)證炭晒。語法 auth 密碼
通過命令行來設(shè)置密碼(這種方式重啟一下就無效了)
首先在終端連接redis服務(wù)器: redis-server
連接之后,可以先看看密碼是否存在甥角,使用命令 config get requirepass
如果沒有密碼网严,就只返回一個requirepass 字符串
如果有密碼 那么第二行就是密碼了
使用config set requirepass 密碼 來進(jìn)行設(shè)置密碼。
之后的操作都需要用 auth 密碼 命令來進(jìn)行驗(yàn)證了
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) ""
127.0.0.1:6379> config set requirepass 123456
OK
127.0.0.1:6379> config get requirepass
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) "123456"
10.持久化機(jī)制
redis為了內(nèi)存數(shù)據(jù)的安全考慮嗤无,會把內(nèi)存中的數(shù)據(jù)以文件形式保存到硬盤中一份震束,在服務(wù)器重啟之后會自動把硬盤中的數(shù)據(jù)恢復(fù)到內(nèi)存(redis)的里面
數(shù)據(jù)保存到硬盤的過程就稱為”持久化”效果。
redis支持兩種此久化方式当犯,
- snapshotting(快照) 默認(rèn)方式
- append--only file(縮寫 aof)的方式
1.snapshotting快照方式持久化
該持久化默認(rèn)開啟垢村,一次性把redis中全部的數(shù)據(jù)保存一份存儲到硬盤中(備份文件名字默認(rèn)是dump,.rdb),如果數(shù)據(jù)非常多(10~20G)就不適合進(jìn)行該持久化操作。
(1)工作原理
每隔N分鐘N次寫操作后嚎卫,從內(nèi)存dump數(shù)據(jù)形成rdb文件嘉栓,壓縮放在備份的目錄中。
(2)如何開啟拓诸,默認(rèn)開啟侵佃,有自己的觸發(fā)條件,
Save 900 1 #900秒內(nèi)如果超過1個key被修改奠支,則發(fā)起快照保存趣钱。
Save 300 10 #300秒內(nèi)如果超過10個key被修改,則發(fā)起快照保存胚宦。
Save 60 10000 #60秒內(nèi)如果超過1000個key被修改首有,則發(fā)起快照保存。
注意:屏蔽該觸發(fā)條件 枢劝,即可關(guān)閉快照方式
(3) 可以設(shè)置保存的位置井联,和備份的文件名
備份文件名默認(rèn)是dump.php,我們可以自己修改您旁,
可以通過配置文件來完成修改
dbfilename dump.rdb
Dir ./
(4)手動發(fā)起快照
兩種方式完成手動保存
方式一:在登入狀態(tài)
則直接執(zhí)行bgsave 即可
方式二:在沒有登入狀態(tài)
redis-cli bgsave -a 密碼
手動發(fā)起一次快照保存操作
(5) 缺點(diǎn)
由于快照方式是在一定間隔做一次的烙常,如果redis意外down掉的話,就會丟失最后一次快照后的所有修改
2.append-only-file 追加方式此久化AOF
本質(zhì):把用戶執(zhí)行的每個“寫”指定(添加鹤盒,修改蚕脏,刪除)都備份到文件中。還原數(shù)據(jù)的時候就是執(zhí)行具體寫指令而已
(1) 如何開啟
appendonly yes //啟用 aof此久化方式侦锯,
appendfilename appendonly.aof //保存命令的文件(可以指定路徑)
打開redis.conf 配置文件 驼鞭,進(jìn)行修改配置
(2) 觸發(fā)條件
# appenddfsync aways //每次收到寫命令就立即強(qiáng)制寫入磁盤,最慢的尺碰,但是保證完全此久化挣棕,不推薦使用译隘。
appendfsync no //每秒種強(qiáng)制寫入磁盤一次,在性能和此久化方面做了很好的折中洛心,推薦
#appendsync no //完全依賴 os 性能最好固耘,此久化沒保證
3.其他問題說明
注:在dump rdb過程中,aof 如果停止同步词身,會不會丟失
答:不會厅目,所有的操作緩存在內(nèi)存的隊(duì)列里,dump完成后法严,統(tǒng)一操作损敷。
注:aof重寫是值什么?
答:aof中的重寫是指把內(nèi)存中的數(shù)據(jù)逆化成命令,寫入到.aof日志里渐夸,已解決oaf日志過大的問題
問:如果rbd文件,和aof文件都存在渔欢,優(yōu)先用誰來恢復(fù)數(shù)據(jù)墓塌?
答:aof。
問:2種是否可以同時用奥额?
答:可以苫幢,而且推薦這么做。
問:恢復(fù)時 rbd 和aof哪個恢復(fù)的快垫挨。
答:rbd快韩肝,因?yàn)槠涫菙?shù)據(jù)的映射,直接載入到內(nèi)存九榔,而aof是命令哀峻,需要逐條執(zhí)行。
注意點(diǎn):如果兩種此久化方式都開啟哲泊,則已a(bǔ)of為準(zhǔn)剩蟀,雖然快照方式恢復(fù)速度快,但是最終aof給覆蓋切威,所以兩種方式都開啟時育特,以aof為準(zhǔn)。
11.主從復(fù)制
1.什么是主從復(fù)制
網(wǎng)站運(yùn)行先朦,mysql 的寫入缰冤,讀取操作的sql 語句比例:1:7。
mysql為了降低每個服務(wù)器負(fù)載喳魏,可以設(shè)置讀寫分類(有寫服務(wù)器棉浸,有讀取服務(wù)器)
為了降低每個redis服務(wù)器的負(fù)載,可以多設(shè)置幾個刺彩,并做主從模式涮拗。
一個服務(wù)器負(fù)載“寫”(添加乾戏,修改,刪除)數(shù)據(jù)三热,其他服務(wù) 器負(fù)載“讀”數(shù)據(jù)鼓择,
主服務(wù)器數(shù)據(jù)會“自動” 同步給從服務(wù)器
Redis 支持簡單易用的主從復(fù)制(master-slave-replication)功能,該功能可以讓從服務(wù)器(slave server)稱為主服務(wù)器(master server)的精確復(fù)制品就漾。
作用:
主從備份呐能,防止主服務(wù)器宕機(jī);
讀寫分離抑堡,分擔(dān)主服務(wù)器的任務(wù)摆出;
任務(wù)分離,從服務(wù)器分別擔(dān)任備份工作和計算工作首妖。
注意點(diǎn):
redis使用異步復(fù)制
一個主服務(wù)器可以有多個從服務(wù)器偎漫。
不僅主服務(wù)器可以有從服務(wù)器,從服務(wù)器也可以有自己的從服務(wù)器有缆。
復(fù)制功能不能回阻塞主象踊,從服務(wù)器。
2.主從通信過程
3.具體配置步驟
配置操作
主服務(wù)器配置:
(1)bind 127.0.0.1 改為 #bind 127.0.0.1
(2)Protected-model yes 改為 protected-model no 關(guān)閉保護(hù)模式
從服務(wù)器配置:
(1)通過slaveof 指定自己的角色棚壁,主服務(wù)器的地址和IP
slaveof 主服務(wù)器ip 端口號
(2)從服務(wù)器只讀
從redis2.6開始杯矩,從服務(wù)器支持只讀模式,通過slave-read-only配置項(xiàng)配置袖外,該模式為從服務(wù)器的默認(rèn)模式
(3)指定從服務(wù)器連接主服務(wù)器的密碼
如果主服務(wù)器通過requirepass 選項(xiàng)設(shè)置了密碼史隆,為了讓從服務(wù)器同步操作順利進(jìn)行,通過masterauth配種連接主服務(wù)器的密碼曼验。
4.Redis 主從復(fù)制的缺陷
每次slave服務(wù)器斷開后泌射,無論是主動斷開,還是網(wǎng)絡(luò)故障鬓照,再連接master,從服務(wù)器都要從master服務(wù)器全部dump出來rdb魄幕,再aof;即同步的過程都要重新執(zhí)行一遍,所以要記住如果是多臺服務(wù)器時颖杏,不要一下子都啟動起來
12.Redis中的事務(wù)
Redis支持簡單的事務(wù)
1.redis與mysql的事務(wù)對比
mysql | redis | |
---|---|---|
開啟 | start transaction | multi |
語句 | 普通sql | 普通命令 |
失敗 | rollback回滾 | discard取消 |
成功 | commit | exec |
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set ticket 1
QUEUED
127.0.0.1:6379> set money 100
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
127.0.0.1:6379> keys *
1) "money"
2) "ticket"
2.watch命令
watch命令可以監(jiān)控一個或多個鍵纯陨,一旦其中有一個鍵被修改(或刪除),之后的事務(wù)就不會執(zhí)行留储,監(jiān)控一直持續(xù)到exce命令(事務(wù)中的命令是在exec之后才執(zhí)行的翼抠,exec命令執(zhí)行完之后被監(jiān)控的鍵會自動被unwatch)