Redis的學(xué)習(xí)之旅

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 yesno 改成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.主從通信過程

image.png

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)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市获讳,隨后出現(xiàn)的幾起案子阴颖,更是在濱河造成了極大的恐慌,老刑警劉巖丐膝,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件量愧,死亡現(xiàn)場離奇詭異钾菊,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)偎肃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門煞烫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人累颂,你說我怎么就攤上這事滞详。” “怎么了紊馏?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵料饥,是天一觀的道長。 經(jīng)常有香客問我朱监,道長岸啡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任赫编,我火速辦了婚禮巡蘸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘沛慢。我一直安慰自己赡若,他們只是感情好达布,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布团甲。 她就那樣靜靜地躺著,像睡著了一般黍聂。 火紅的嫁衣襯著肌膚如雪躺苦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天产还,我揣著相機(jī)與錄音匹厘,去河邊找鬼。 笑死脐区,一個胖子當(dāng)著我的面吹牛愈诚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播牛隅,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼炕柔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了媒佣?” 一聲冷哼從身側(cè)響起匕累,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎默伍,沒想到半個月后欢嘿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衰琐,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年炼蹦,在試婚紗的時候發(fā)現(xiàn)自己被綠了羡宙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡框弛,死狀恐怖辛辨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瑟枫,我是刑警寧澤斗搞,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站慷妙,受9級特大地震影響僻焚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜膝擂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一虑啤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧架馋,春花似錦狞山、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至屏鳍,卻和暖如春勘纯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钓瞭。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工驳遵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人山涡。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓堤结,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鸭丛。 傳聞我的和親對象是個殘疾皇子竞穷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評論 2 356