国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Redis九種數(shù)據(jù)類(lèi)型及其持久化機(jī)制:探索數(shù)據(jù)存儲(chǔ)的奇妙世界

這篇具有很好參考價(jià)值的文章主要介紹了Redis九種數(shù)據(jù)類(lèi)型及其持久化機(jī)制:探索數(shù)據(jù)存儲(chǔ)的奇妙世界。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄

一、9種數(shù)據(jù)類(lèi)型

3.1 Key操作

3.1.1 相關(guān)命令

練習(xí):

3.2 String

3.2.1 結(jié)構(gòu)圖

3.2.2 相關(guān)命令

?練習(xí):

3.3 List(雙向的鏈表)

3.3.1 結(jié)構(gòu)圖

3.3.2 相關(guān)命令

練習(xí):

3.4 Set(無(wú)序集合)

3.4.1 結(jié)構(gòu)圖

3.4.2 相關(guān)命令

練習(xí):

3.5 Zset(有序集合)

3.5.1 結(jié)構(gòu)圖

3.5.2 相關(guān)命令

練習(xí)

3.6 Hash

3.6.1 結(jié)構(gòu)圖

3.6.2 相關(guān)命令

練習(xí)

3.7 Bitmaps

3.7.1 介紹

練習(xí)

1、setbit

2、getbit

3、bitcount

4、bitop

3.8 HyperLogLog

3.8.1 簡(jiǎn)介

3.8.2 相關(guān)命令

練習(xí)

3.9 Geospatial(地理空間)

3.9.1 簡(jiǎn)介

3.9.2 相關(guān)命令

練習(xí)

二、Redis持久化

1、RDB

1.1 什么是RDB

1.2 如何備份

1.3 Fork

1.4?優(yōu)勢(shì)

1.5?劣勢(shì)

1.6具體實(shí)現(xiàn):

2、AOF

2.1 什么是AOF

2.2?優(yōu)勢(shì)

2.3?劣勢(shì)

2.4具體實(shí)現(xiàn)


一、9種數(shù)據(jù)類(lèi)型

3.1 Key操作

3.1.1 相關(guān)命令

序號(hào)

命令語(yǔ)法

描述

1

DEL key

該命令用于在 key 存在時(shí)刪除 key

2

DUMP key

序列化給定 key ,并返回被序列化的值

3

EXISTS key

檢查給定 key 是否存在,存在返回1,否則返回0

4

EXPIRE key seconds

為給定 key 設(shè)置過(guò)期時(shí)間,以秒計(jì)

5

EXPIREAT key timestamp

EXPIREAT 的作用和 EXPIRE 類(lèi)似,都用于為 key 設(shè)置過(guò)期時(shí)間。不同在于 EXPIREAT 命令接受的時(shí)間參數(shù)是 UNIX 時(shí)間戳

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 的名稱(chēng)

15

RENAMENX key newkey

僅當(dāng) newkey 不存在時(shí),將 key 改名為 newkey

16

SCAN cursor [MATCH pattern] [COUNT count]

迭代數(shù)據(jù)庫(kù)中的數(shù)據(jù)庫(kù)鍵

17

TYPE key

返回 key 所儲(chǔ)存的值的類(lèi)型

18

SELECT db

選擇數(shù)據(jù)庫(kù) 數(shù)據(jù)庫(kù)為0-15(默認(rèn)一共16個(gè)數(shù)據(jù)庫(kù))

19

DBSIZE

查看數(shù)據(jù)庫(kù)的key數(shù)量

20

FLUSHDB

清空當(dāng)前數(shù)據(jù)庫(kù)

21

FLUSHALL

清空所有數(shù)據(jù)庫(kù)

22

ECHO

打印命令

說(shuō)明: KEYS * 匹配數(shù)據(jù)庫(kù)中所有key KEYS h?llo 匹配hello,hallo,hxllo等 KEYS h*llo 匹配hllo和heeello等 KEYS h[ae]llo 匹配hello和hallo

練習(xí):

首先創(chuàng)建一些數(shù)據(jù):

127.0.0.1:6379> set key1 k1
127.0.0.1:6379> set key2 k3
127.0.0.1:6379> set key3 k2
127.0.0.1:6379> set key4 k4
127.0.0.1:6379> set key5 k5

實(shí)例:

127.0.0.1:6379> del key1 如果key1存在則刪除key1
(integer) 1
127.0.0.1:6379> get key1 獲取key1的balue
(nil)
127.0.0.1:6379> dump key2 序列化key2,并且返回系列化的值
"\x00\x02k3\n\x00O\xa3<\xcc \x19;\x04"
127.0.0.1:6379> exists key3 判斷key3是否存在
(integer) 1
127.0.0.1:6379> expire key6 3 給key設(shè)置過(guò)期時(shí)間3秒
(integer) 0
127.0.0.1:6379> pexpire key7 3000 給key7設(shè)置過(guò)期時(shí)間3000毫秒
(integer) 0
127.0.0.1:6379> expire key8 3000 給key8設(shè)置過(guò)期時(shí)間,單位是時(shí)間戳
(integer) 0
127.0.0.1:6379> keys key5 查看指定的key5
1) "key5"
127.0.0.1:6379> select 1 選擇數(shù)據(jù)庫(kù)1
OK
127.0.0.1:6379[1]> move key5 2 將key5移動(dòng)到 數(shù)據(jù)庫(kù)2
(integer) 0
127.0.0.1:6379[1]> set key6 k6 新建key6
OK
127.0.0.1:6379[1]> rename key6 key66 給key6重命名key66
OK
127.0.0.1:6379[1]> type key66 查看key66的類(lèi)型
string
127.0.0.1:6379[1]> dbsize  查看當(dāng)前數(shù)據(jù)庫(kù)的大小
(integer) 1
127.0.0.1:6379[1]> flushdb   刪除當(dāng)前數(shù)據(jù)庫(kù)中所有數(shù)據(jù)
OK
127.0.0.1:6379[1]> flushall  刪除所有數(shù)據(jù)庫(kù)中的所有數(shù)據(jù)
OK

3.2 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)型,String 類(lèi)型的值最大能存儲(chǔ) 512MB。

String類(lèi)型一般用于緩存、限流、計(jì)數(shù)器、分布式鎖、分布式Session。

3.2.1 結(jié)構(gòu)圖

Redis九種數(shù)據(jù)類(lèi)型及其持久化機(jī)制:探索數(shù)據(jù)存儲(chǔ)的奇妙世界,Redis,作業(yè),redis,數(shù)據(jù)庫(kù),緩存

3.2.2 相關(guān)命令

序號(hào)

命令語(yǔ)法

描述

1

SET key value

設(shè)置指定 key 的值

2

GET key

獲取指定 key 的值

3

GETRANGE key start end

返回 key 中字符串值的子字符,end=-1時(shí)表示全部

4

SETBIT key offset value

對(duì) key 所儲(chǔ)存的字符串值,設(shè)置或清除指定偏移量上的位(bit)

5

GETBIT key offset

對(duì) key 所儲(chǔ)存的字符串值,獲取指定偏移量上的位(bit)

6

MSET key value [key value ...]

同時(shí)設(shè)置一個(gè)或多個(gè) key-value 對(duì)

7

MGET key1 [key2..]

獲取所有(一個(gè)或多個(gè))給定 key 的值

8

GETSET key value

將給定 key 的值設(shè)為 value ,并返回 key 的舊值(old value)

9

SETEX key seconds value

將值 value 關(guān)聯(lián)到 key ,并將 key 的過(guò)期時(shí)間設(shè)為 seconds (以秒為單位)

10

SETNX key value

只有在 key 不存在時(shí)設(shè)置 key 的值

11

SETRANGE key offset value

用 value 參數(shù)覆寫(xiě)給定 key 所儲(chǔ)存的字符串值,從偏移量 offset 開(kāi)始

12

STRLEN key

返回 key 所儲(chǔ)存的字符串值的長(zhǎng)度

13

MSETNX key value [key value ...]

同時(shí)設(shè)置一個(gè)或多個(gè) key-value 對(duì),當(dāng)且僅當(dāng)所有給定 key 都不存在

14

PSETEX key milliseconds value

與 SETEX 命令相似,但它以毫秒為單位設(shè)置 key 的生存時(shí)間

15

INCR key

將 key 中儲(chǔ)存的數(shù)字值增一

16

INCRBY key increment

將 key 所儲(chǔ)存的值加上給定的增量值(increment)

17

INCRBYFLOAT key increment

將 key 所儲(chǔ)存的值加上給定的浮點(diǎn)增量值(increment)

18

DECR key

將 key 中儲(chǔ)存的數(shù)字值減一

19

DECRBY key decrement

key 所儲(chǔ)存的值減去給定的減量值(decrement)

20

APPEND key value

如果 key 已經(jīng)存在并且是一個(gè)字符串,APPEND 命令將指定的 value 追加到該 key 原來(lái)值 value 的末尾

?練習(xí):

127.0.0.1:6379> set mykey1 "hello" 為鍵mykey1設(shè)置值“hello”
OK
127.0.0.1:6379> set mykey2  2 EX 5 為mykey2設(shè)置過(guò)期時(shí)間5秒
OK
127.0.0.1:6379> set mykey2  2 PX 5000 為mykey2設(shè)置過(guò)期時(shí)間5000毫秒
OK
127.0.0.1:6379> set mykey4  4 EXAT 5 為mykey4設(shè)置unix時(shí)間,以秒為單位
OK
127.0.0.1:6379> set mykey5  5 EXAT 5000 為mykey5設(shè)置unix時(shí)間,以毫秒為單位
OK
127.0.0.1:6379> set mykey6  6 NX 為mykey6設(shè)置value 當(dāng)mykey6不存在時(shí)創(chuàng)建
OK
127.0.0.1:6379> set mykey7  7 XX 為mykey7設(shè)置value 當(dāng)mykey7存在時(shí)創(chuàng)建(這里很明顯創(chuàng)建失?。?(nil)
127.0.0.1:6379> set mykey6  8 GET 返回舊鍵即mykey中的字符串,如果不存在則返回nil,相當(dāng)于get操作
"6" 
127.0.0.1:6379> mset mykey200 200 mykey300 300一次性創(chuàng)建多個(gè)鍵值對(duì)
OK
get
127.0.0.1:6379> get mykey1 查找一個(gè)存在的鍵
"hello"
127.0.0.1:6379> get mykey100 查找一個(gè)不存在的鍵
(nil)
127.0.0.1:6379> set mykey10 100 新建一個(gè)mykey10鍵并且賦值
OK
127.0.0.1:6379> getdel mykey10 找到并且刪除該mykey10
"100"
127.0.0.1:6379> get mykey10 再查看就查不到了
(nil)
127.0.0.1:6379> getrange mykey1 2  8 指定查看的鍵為mykey1 起始位置為2 結(jié)束到8
"llo wor"
127.0.0.1:6379> mget mykey200  mykey300 
1) "200"
2) "300"
Append
127.0.0.1:6379> append mykey1  " world" 為mykey1后面追加“ world”
(integer) 11
127.0.0.1:6379> get mykey1 查看
"hello world"
?DESC
127.0.0.1:6379> set mykey8 1
OK
127.0.0.1:6379> decr mykey8
(integer) 0
127.0.0.1:6379> decr mykey8
(integer) -1
注意:
(1)desc 能夠自減的對(duì)象必須是一個(gè)數(shù)值型數(shù)據(jù)
(2)desc只能進(jìn)行自減一的操作
127.0.0.1:6379> decrby mykey8 10自減并且指定偏移量為10
(integer) -11
?INCR
127.0.0.1:6379> incr mykey8
(integer) -10
127.0.0.1:6379> incrby mykey8 20
(integer) 10
127.0.0.1:6379> incrbyfloat mykey8 0.1incrbyfloat 可以使用浮點(diǎn)數(shù)自增
"10.1"
127.0.0.1:6379> strlen mykey1 獲取指定鍵中的值的長(zhǎng)度
(integer) 11
127.0.0.1:6379> substr mykey1 0 7獲取指定鍵子串 起始0 結(jié)束到7
"hello wo"
?

3.3 List(雙向的鏈表)

Redis列表是簡(jiǎn)單的字符串列表,按照插入順序排序。你可以添加一個(gè)元素到列表的頭部(左邊)或者尾部(右邊)一個(gè)列表最多可以包含 2^32^ - 1 個(gè)元素 (4294967295, 每個(gè)列表超過(guò)40億個(gè)元素)。

List類(lèi)型一般用于關(guān)注人、簡(jiǎn)單隊(duì)列等。

3.3.1 結(jié)構(gòu)圖

Redis九種數(shù)據(jù)類(lèi)型及其持久化機(jī)制:探索數(shù)據(jù)存儲(chǔ)的奇妙世界,Redis,作業(yè),redis,數(shù)據(jù)庫(kù),緩存

3.3.2 相關(guān)命令

序號(hào)

命令語(yǔ)法

描述

1

LPUSH key value1 [value2]

將一個(gè)或多個(gè)值插入到列表頭部

2

LPOP key

移出并獲取列表的第一個(gè)元素

3

LRANGE key start stop

獲取列表指定范圍內(nèi)的元素

4

LPUSHX key value

將一個(gè)值插入到已存在的列表頭部

5

RPUSH key value1 [value2]

在列表中添加一個(gè)或多個(gè)值

6

RPOP key

移除列表的最后一個(gè)元素,返回值為移除的元素

7

RPUSHX key value

為已存在的列表添加值

8

LLEN key

獲取列表長(zhǎng)度

9

LINSERT key BEFORE|AFTER pivot value

在列表的元素前或者后插入元素

10

LINDEX key index

通過(guò)索引獲取列表中的元素

11

LSET key index value

通過(guò)索引設(shè)置列表元素的值

12

LREM key count value

移除列表元素

13

LTRIM key start stop

對(duì)一個(gè)列表進(jìn)行修剪,就是讓列表只保留指定區(qū)間內(nèi)的元素,不在指定區(qū)間之內(nèi)的元素都將被刪除

14

BLPOP key1 [key2 ] timeout

移出并獲取列表的第一個(gè)元素,如果列表沒(méi)有元素會(huì)阻塞列表直到等待超時(shí)或發(fā)現(xiàn)可彈出元素為止

15

BRPOP key1 [key2 ] timeout

移出并獲取列表的最后一個(gè)元素,如果列表沒(méi)有元素會(huì)阻塞列表直到等待超時(shí)或發(fā)現(xiàn)可彈出元素為止

16

BRPOPLPUSH source destination timeout

從列表中彈出一個(gè)值,將彈出的元素插入到另外一個(gè)列表中并返回它;如果列表沒(méi)有元素會(huì)阻塞列表直到等待超時(shí)或發(fā)現(xiàn)可lpu彈出元素為止

17

RPOPLPUSH source destination

移除列表的最后一個(gè)元素,并將該元素添加到另一個(gè)列表并返回

先創(chuàng)建數(shù)據(jù):
?

127.0.0.1:6379[1]> lpush key1 zhangsan
(integer) 1
127.0.0.1:6379[1]> lpush key2 lisi
(integer) 1
127.0.0.1:6379[1]> lpush key3 wangwu
(integer) 1
127.0.0.1:6379[1]> lpush key4 1 2 3 4 5
(integer) 5

練習(xí):

127.0.0.1:6379[1]> lpop key4  移除并且獲得列表的第一個(gè)元素
"5"
127.0.0.1:6379[1]> lrange key4 0 -1 獲取指定范圍的元素
1) "4"
2) "3"
3) "2"
4) "1"
127.0.0.1:6379[1]> rpush key4 3 0 -1 在列表中添加一個(gè)值 3
(integer) 7
127.0.0.1:6379[1]> rpush key4 10 20 在列表中添加兩個(gè)值 10 20
(integer) 9
127.0.0.1:6379[1]> rpop key4 移除列表的最后一個(gè)元素,并且返回該值
"20"
127.0.0.1:6379[1]> rpush key 30 40 為列表中添加值
(integer) 2
127.0.0.1:6379[1]> llen key4 獲取key4中值的長(zhǎng)度
(integer) 8
127.0.0.1:6379[1]> lindex key4 5 獲取指定下標(biāo)的值
"0"
127.0.0.1:6379[1]> lset key4 5 555 為下標(biāo)為5的設(shè)置555
OK
127.0.0.1:6379[1]> lrem key4 5 555 移除下標(biāo)為5的值
(integer) 1
127.0.0.1:6379[1]> ltrim key4 0 10 只保留0-10的值其他的值全部刪除
OK
127.0.0.1:6379[1]> blpop key4  10 移出并獲取列表的第一個(gè)元素,如果列表沒(méi)有元素會(huì)阻塞列表直到等待超時(shí)或發(fā)現(xiàn)可彈出元素為止
1) "key4"
2) "4"
127.0.0.1:6379[1]> brpop key4  10移出并獲取列表的最后一個(gè)元素,如果列表沒(méi)有元素會(huì)阻塞列表直到等待超時(shí)或發(fā)現(xiàn)可彈出元素為止
1) "key4"
2) "10"
127.0.0.1:6379[1]> rpoplpush key4 key1 移除列表的最后一個(gè)元素,并將該元素添加到另一個(gè)列表并返回
"-1"

3.4 Set(無(wú)序集合)

集合(特點(diǎn):無(wú)序,不重復(fù))

Redis 的 Set 是 String 類(lèi)型的無(wú)序集合。集合中成員是唯一的,這就意味著集合中不能出現(xiàn)重復(fù)的數(shù)據(jù)。Redis 中集合是通過(guò)哈希表實(shí)現(xiàn)的,所以添加,刪除,查找的復(fù)雜度都是 O(1)。 集合中最大的成員數(shù)為 2^32^ - 1 (4294967295, 每個(gè)集合可存儲(chǔ)40多億個(gè)成員)。

Set類(lèi)型一般用于贊、踩、標(biāo)簽、好友關(guān)系(互相為好友,直去重一次)等。

3.4.1 結(jié)構(gòu)圖

Redis九種數(shù)據(jù)類(lèi)型及其持久化機(jī)制:探索數(shù)據(jù)存儲(chǔ)的奇妙世界,Redis,作業(yè),redis,數(shù)據(jù)庫(kù),緩存

3.4.2 相關(guān)命令

序號(hào)

命令語(yǔ)法

描述

1

SADD key member1 [member2]

向集合添加一個(gè)或多個(gè)成員

2

SMEMBERS key

返回集合中的所有成員

3

SCARD key

獲取集合的成員數(shù)

4

SRANDMEMBER key [count]

返回集合中一個(gè)或多個(gè)隨機(jī)數(shù)

5

SISMEMBER key member

判斷 member 元素是否是集合 key 的成員

6

SREM key member1 [member2]

移除集合中一個(gè)或多個(gè)成員

7

SDIFF key1 [key2]

返回給定所有集合的差集

8

SDIFFSTORE destination key1 [key2]

返回給定所有集合的差集并存儲(chǔ)在 destination 中

9

SINTER key1 [key2]

返回給定所有集合的交集

10

SINTERSTORE destination key1 [key2]

返回給定所有集合的交集并存儲(chǔ)在 destination 中

11

SUNION key1 [key2]

返回所有給定集合的并集

12

SUNIONSTORE destination key1 [key2]

所有給定集合的并集存儲(chǔ)在 destination 集合中

13

SMOVE source destination member

將 member 元素從 source 集合移動(dòng)到 destination 集合

14

SPOP key

移除并返回集合中的一個(gè)隨機(jī)元素

15

SSCAN key cursor [MATCH pattern] [COUNT count]

迭代集合中的元素

  • cursor:游標(biāo)

  • MATCH pattern:查詢(xún) Key 的條件

  • Count count:返回的條數(shù),默認(rèn)值為 10

SCAN 是一個(gè)基于游標(biāo)的迭代器,需要基于上一次的游標(biāo)延續(xù)之前的迭代過(guò)程。SCAN 以 ==0== 作為游標(biāo),開(kāi)始一次新的迭代,直到命令返回游標(biāo) 0 完成一次遍歷。 此命令并不保證每次執(zhí)行都返回某個(gè)給定數(shù)量的元素,甚至?xí)祷?0 個(gè)元素,但只要游標(biāo)不是 0,程序都不會(huì)認(rèn)為 SCAN 命令結(jié)束,但是返回的元素?cái)?shù)量大概率符合 Count 參數(shù)。另外,SCAN 支持模糊查詢(xún)。

例:SSCAN names 0 MATCH test* COUNT 10 # 每次返回10條以test為前綴的key

練習(xí):

127.0.0.1:6379[1]> sadd myset 1 2 3 4 5 向集合中添加五個(gè)元素
(integer) 5
127.0.0.1:6379[1]> smembers myset 返回集合中的所有元素
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379[1]> scard myset 獲取集合的成員數(shù)
(integer) 5
127.0.0.1:6379[1]> srandmember myset 返貨集合中的一個(gè)或者多個(gè)隨機(jī)數(shù)
"2"
127.0.0.1:6379[1]> sismember myset 100 判斷100是不是 myset中的元素
(integer) 0
127.0.0.1:6379[1]> srem myset 2 移除 myset中的一個(gè)或者多個(gè)元素
(integer) 1
127.0.0.1:6379[1]> sadd myset2 1 3 5 7 9 新建一個(gè)myset2
(integer) 5
127.0.0.1:6379[1]> sdiff myset myset2 求myset myset2 的差集
1) "4"
127.0.0.1:6379[1]> sinter myset myset2 求myset myset2 的交集
1) "1"
2) "3"
3) "5"
127.0.0.1:6379[1]> sunion myset myset2 求myset myset2 的合集
1) "1"
2) "3"
3) "4"
4) "5"
5) "7"
6) "9"
127.0.0.1:6379[1]> spop myset 移除并且返回集合中的一個(gè)隨機(jī)數(shù)
"3"

3.5 Zset(有序集合)

Redis 有序集合和集合一樣也是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)行從小到大的排序。有序集合的成員是唯一的,但分?jǐn)?shù)(score)卻可以重復(fù)。

集合是通過(guò)哈希表實(shí)現(xiàn)的,所以添加,刪除,查找的復(fù)雜度都是O(1)。 集合中最大的成員數(shù)為 2^32^ - 1 (4294967295, 每個(gè)集合可存儲(chǔ)40多億個(gè)成員)。

Zset類(lèi)型一般用于排行榜等。

3.5.1 結(jié)構(gòu)圖

Redis九種數(shù)據(jù)類(lèi)型及其持久化機(jī)制:探索數(shù)據(jù)存儲(chǔ)的奇妙世界,Redis,作業(yè),redis,數(shù)據(jù)庫(kù),緩存

3.5.2 相關(guān)命令

序號(hào)

命令語(yǔ)法

描述

1

ZADD key score1 member1 [score2 member2]

向有序集合添加一個(gè)或多個(gè)成員,或者更新已存在成員的分?jǐn)?shù)

2

ZCARD key

獲取有序集合的成員數(shù)

3

ZCOUNT key min max

計(jì)算在有序集合中指定區(qū)間分?jǐn)?shù)的成員數(shù)

4

ZINCRBY key increment member

有序集合中對(duì)指定成員的分?jǐn)?shù)加上增量 increment

5

ZLEXCOUNT key min max

在有序集合中計(jì)算指定字典區(qū)間內(nèi)成員數(shù)量

6

ZRANGE key start stop [WITHSCORES]

通過(guò)索引區(qū)間返回有序集合指定區(qū)間內(nèi)的成員

7

ZRANGEBYLEX key min max [LIMIT offset count]

通過(guò)字典區(qū)間返回有序集合的成員

8

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]

通過(guò)分?jǐn)?shù)返回有序集合指定區(qū)間內(nèi)的成員

9

ZRANK key member

返回有序集合中指定成員的索引

10

ZREM key member [member ...]

移除有序集合中的一個(gè)或多個(gè)成員

11

ZREMRANGEBYLEX key min max

移除有序集合中給定的字典區(qū)間的所有成員

12

ZREMRANGEBYRANK key start stop

移除有序集合中給定的排名區(qū)間的所有成員

13

ZREMRANGEBYSCORE key min max

移除有序集合中給定的分?jǐn)?shù)區(qū)間的所有成員

14

ZREVRANGE key start stop [WITHSCORES]

返回有序集中指定區(qū)間內(nèi)的成員,通過(guò)索引,分?jǐn)?shù)從高到低

15

ZREVRANGEBYSCORE key max min [WITHSCORES]

返回有序集中指定分?jǐn)?shù)區(qū)間內(nèi)的成員,分?jǐn)?shù)從高到低排序

16

ZREVRANK key member

返回有序集合中指定成員的排名,有序集成員按分?jǐn)?shù)值遞減(從大到小)排序

17

ZSCORE key member

返回有序集中,成員的分?jǐn)?shù)值

18

ZINTERSTORE destination numkeys key [key ...]

計(jì)算給定的一個(gè)或多個(gè)有序集的交集并將結(jié)果集存儲(chǔ)在新的有序集合 key 中

19

ZUNIONSTORE destination numkeys key [key ...]

計(jì)算給定的一個(gè)或多個(gè)有序集的并集,并存儲(chǔ)在新的 key 中

20

ZSCAN key cursor [MATCH pattern] [COUNT count]

迭代有序集合中的元素(包括元素成員和元素分值)

創(chuàng)建一些數(shù)據(jù):

127.0.0.1:6379[1]> zadd myzset 85 zhangsan
(integer) 1
127.0.0.1:6379[1]> zadd myzset 70 lisi
(integer) 1
127.0.0.1:6379[1]> zadd myzset 90 wangwu
(integer) 1
127.0.0.1:6379[1]> zadd myzset 60 1 2 3 4 5
(integer) 3

練習(xí)

127.0.0.1:6379[1]> zcard myzset  獲取有序集合的成員數(shù)
(integer) 6
127.0.0.1:6379[1]> zcount myset 60 90 計(jì)算指定score區(qū)間的成員數(shù)
(integer) 4
127.0.0.1:6379[1]> zincrby myzset 10 60 給分?jǐn)?shù)為 60的人的score增加10
"10"
127.0.0.1:6379[1]> zrange myzset 0 -1   返回區(qū)間的元素
1) "3"
2) "5"
3) "60"
4) "1"
5) "lisi"
6) "zhangsan"
7) "wangwu"
127.0.0.1:6379[1]> zrank myzset zhangsan 返回有序集合中指定成員的索引
(integer) 5
127.0.0.1:6379[1]> zrem myzset zhangsan 移除有序集合中的一個(gè)或者多個(gè)成員
(integer) 1

3.6 Hash

Redis hash 是一個(gè) string 類(lèi)型的 field 和 value 的映射表,hash 特別適合用于存儲(chǔ)對(duì)象。Redis 中每個(gè) hash 可以存儲(chǔ) 2^32^ - 1 鍵值對(duì)(40多億)。

Hash類(lèi)型一般用于存儲(chǔ)用戶(hù)信息、用戶(hù)主頁(yè)訪(fǎng)問(wèn)量、組合查詢(xún)等。

3.6.1 結(jié)構(gòu)圖

Redis九種數(shù)據(jù)類(lèi)型及其持久化機(jī)制:探索數(shù)據(jù)存儲(chǔ)的奇妙世界,Redis,作業(yè),redis,數(shù)據(jù)庫(kù),緩存

3.6.2 相關(guān)命令

序號(hào)

命令語(yǔ)法

描述

1

HSET key field value

將哈希表 key 中的字段 field 的值設(shè)為 value

2

HGET key field

獲取存儲(chǔ)在哈希表中指定字段的值

3

HGETALL key

獲取在哈希表中指定 key 的所有字段和值

4

HEXISTS key field

查看哈希表 key 中,指定的字段是否存在

5

HSETNX key field value

只有在字段 field 不存在時(shí),設(shè)置哈希表字段的值

6

HKEYS key

獲取所有哈希表中的字段

7

HVALS key

獲取哈希表中所有值

8

HLEN key

獲取哈希表中字段的數(shù)量

9

HMGET key field1 [field2]

獲取所有給定字段的值

10

HMSET key field1 value1 [field2 value2]

同時(shí)將多個(gè) field-value (域-值)對(duì)設(shè)置到哈希表 key 中

11

HINCRBY key field increment

為哈希表 key 中的指定字段的整數(shù)值加上增量 increment

12

HINCRBYFLOAT key field increment

為哈希表 key 中的指定字段的浮點(diǎn)數(shù)值加上增量 increment

13

HDEL key field1 [field2]

刪除一個(gè)或多個(gè)哈希表字段

14

HSCAN key cursor [MATCH pattern] [COUNT count]

迭代哈希表中的鍵值對(duì)

練習(xí)

127.0.0.1:6379[1]> HSET myhash name zhangsan 創(chuàng)建哈希表 myhash 并且為字段name設(shè)置 zhangsan
(integer) 1
127.0.0.1:6379[1]> HGET myhash name  獲取指定字段的值
"zhangsan"
127.0.0.1:6379[1]> hgetall myhash 獲取哈希表中myhash的所有字段和值
1) "name"
2) "zhangsan"
127.0.0.1:6379[1]> HEXISTS myhash name  查看myhash表中指定字段是否存在
(integer) 1
127.0.0.1:6379[1]> hsetnx myhash age 11 只有age不存在時(shí)才會(huì)設(shè)置字段的值
(integer) 1
127.0.0.1:6379[1]> hvals myhash 獲取所有值
1) "zhangsan"
2) "11"
127.0.0.1:6379[1]> hkeys myhash 獲取所有字段
1) "name"
2) "age"
127.0.0.1:6379[1]> hlen myhash 獲取表中字段的數(shù)量
(integer) 2
127.0.0.1:6379[1]> hmget myhash name 獲取給定字段的值
1) "zhangsan"
127.0.0.1:6379[1]> hdel myhash age 刪除指定字段age
(integer) 1

3.7 Bitmaps

3.7.1 介紹

現(xiàn)代計(jì)算機(jī)用二進(jìn)制(位) 作為信息的基礎(chǔ)單位, 1個(gè)字節(jié)等于8位, 例如“abc”字符串是由3個(gè)字節(jié)組成, 但實(shí)際在計(jì)算機(jī)存儲(chǔ)時(shí)將其用二進(jìn)制表示, “abc”分別對(duì)應(yīng)的ASCII碼分別是97、 98、 99, 對(duì)應(yīng)的二進(jìn)制分別是01100001、 01100010和01100011,如下圖:

Redis九種數(shù)據(jù)類(lèi)型及其持久化機(jī)制:探索數(shù)據(jù)存儲(chǔ)的奇妙世界,Redis,作業(yè),redis,數(shù)據(jù)庫(kù),緩存

合理地使用操作位能夠有效地提高內(nèi)存使用率和開(kāi)發(fā)效率。

Redis 6 中提供了 Bitmaps 這個(gè)“數(shù)據(jù)類(lèi)型”可以實(shí)現(xiàn)對(duì)位的操作:

1)Bitmaps本身不是一種數(shù)據(jù)類(lèi)型,實(shí)際上它就是字符串(key-value),但是它可以對(duì)字符串的位進(jìn)行操作。

2)Bitmaps單獨(dú)提供了一套命令,所以在Redis中使用Bitmaps和使用字符串的方法不太相同。 可以把Bitmaps想象成一個(gè)以位為單位的數(shù)組, 數(shù)組的每個(gè)單元只能存儲(chǔ)0和1, 數(shù)組的下標(biāo)在Bitmaps中叫做偏移量。

Redis九種數(shù)據(jù)類(lèi)型及其持久化機(jī)制:探索數(shù)據(jù)存儲(chǔ)的奇妙世界,Redis,作業(yè),redis,數(shù)據(jù)庫(kù),緩存

練習(xí)

1、setbit

這個(gè)命令用于設(shè)置Bitmaps中某個(gè)偏移量的值(0或1),offset偏移量從0開(kāi)始。格式如下:

setbit <key> <offset> <value>

例如,把每個(gè)獨(dú)立用戶(hù)是否訪(fǎng)問(wèn)過(guò)網(wǎng)站存放在Bitmaps中, 將訪(fǎng)問(wèn)的用戶(hù)記做1,沒(méi)有訪(fǎng)問(wèn)的用戶(hù)記做0,用偏移量作為用戶(hù)的id。

設(shè)置鍵的第offset個(gè)位的值(從0算起) , 假設(shè)現(xiàn)在有20個(gè)用戶(hù),userid=1,6,11,15,19的用戶(hù)對(duì)網(wǎng)站進(jìn)行了訪(fǎng)問(wèn), 那么當(dāng)前Bitmaps初始化結(jié)果如圖:

Redis九種數(shù)據(jù)類(lèi)型及其持久化機(jī)制:探索數(shù)據(jù)存儲(chǔ)的奇妙世界,Redis,作業(yè),redis,數(shù)據(jù)庫(kù),緩存

下面示例是代表 2023-07-21?這天的獨(dú)立訪(fǎng)問(wèn)用戶(hù)的Bitmaps:

127.0.0.1:6379[1]> setbit username:dog:20230721 1 1
(integer) 0
127.0.0.1:6379[1]> setbit username:dog:20230721 2 1
(integer) 0
127.0.0.1:6379[1]> setbit username:dog:20230721 3 1
(integer) 0
127.0.0.1:6379[1]> setbit username:dog:20230721 4 0
(integer) 0
127.0.0.1:6379[1]> setbit username:dog:20230721 5 0
(integer) 0
127.0.0.1:6379[1]> setbit username:dog:20230721 6 1
(integer) 0
127.0.0.1:6379[1]> setbit username:dog:20230721 7 1
(integer) 0

注意:

很多應(yīng)用的用戶(hù)id以一個(gè)指定數(shù)字(例如10000) 開(kāi)頭, 直接將用戶(hù)id和Bitmaps的偏移量對(duì)應(yīng)勢(shì)必會(huì)造成一定的浪費(fèi), 通常的做法是每次做setbit操作時(shí)將用戶(hù)id減去這個(gè)指定數(shù)字。

在第一次初始化Bitmaps時(shí), 假如偏移量非常大, 那么整個(gè)初始化過(guò)程執(zhí)行會(huì)比較慢, 可能會(huì)造成Redis的阻塞。

2、getbit

這個(gè)命令用于獲取Bitmaps中某個(gè)偏移量的值。格式為:

getbit <key> <offset>

獲取鍵的第offset位的值(從0開(kāi)始算)。例如獲取id=dog的用戶(hù)是否在2022-07-21這天訪(fǎng)問(wèn)過(guò), 返回0說(shuō)明沒(méi)有訪(fǎng)問(wèn)過(guò):

127.0.0.1:6379[1]> getbit username:dog:20230721 1
(integer) 1
127.0.0.1:6379[1]> getbit username:dog:20230721 5
(integer) 0
3、bitcount

這個(gè)命令用于統(tǒng)計(jì)字符串被設(shè)置為1的bit數(shù)。一般情況下,給定的整個(gè)字符串都會(huì)被進(jìn)行計(jì)數(shù),通過(guò)指定額外的 start 或 end 參數(shù),可以讓計(jì)數(shù)只在特定的位上進(jìn)行。start 和 end 參數(shù)的設(shè)置,都可以使用負(fù)數(shù)值:比如 -1 表示最后一個(gè)位,而 -2 表示倒數(shù)第二個(gè)位,start、end 是指bit組的字節(jié)的下標(biāo)數(shù),二者皆包含。格式如下:

bitcount <key> [start end]

用于統(tǒng)計(jì)字符串從start字節(jié)到end字節(jié)比特值為1的數(shù)量。例如,統(tǒng)計(jì)dog用戶(hù)訪(fǎng)問(wèn)的次數(shù)

127.0.0.1:6379[1]> bitcount username:dog:20230721 
4、bitop

這個(gè)命令是一個(gè)復(fù)合操作, 它可以做多個(gè)Bitmaps的and(交集) 、 or(并集) 、 not(非) 、 xor(異或) 操作并將結(jié)果保存在destkey中。格式如下:

bitop and(or/not/xor) <destkey> [key…]

例如:

2023-7-20?日訪(fǎng)問(wèn)網(wǎng)站的userid=1,2,5,9。

2023-7-21?日訪(fǎng)問(wèn)網(wǎng)站的userid=0,1,4,9。

127.0.0.1:6379[1]> setbit user:20230720 1 1
(integer) 0
127.0.0.1:6379[1]> setbit user:20230720 2 1
(integer) 0
127.0.0.1:6379[1]> setbit user:20230720 5 1
(integer) 0
127.0.0.1:6379[1]> setbit user:20230720 9 1
(integer) 0
127.0.0.1:6379[1]> setbit user:20230721 0 1
(integer) 0
127.0.0.1:6379[1]> setbit user:20230721 1 1
(integer) 0
127.0.0.1:6379[1]> setbit user:20230721 4 1
(integer) 0
127.0.0.1:6379[1]> setbit user:20230721 9 1
(integer) 0

計(jì)算出兩天都訪(fǎng)問(wèn)過(guò)網(wǎng)站的用戶(hù)數(shù)量

127.0.0.1:6379[1]> bitop and user:and:20_21 user:20230720 user:20230721
(integer) 2

Redis九種數(shù)據(jù)類(lèi)型及其持久化機(jī)制:探索數(shù)據(jù)存儲(chǔ)的奇妙世界,Redis,作業(yè),redis,數(shù)據(jù)庫(kù),緩存

計(jì)算出任意一天都訪(fǎng)問(wèn)過(guò)網(wǎng)站的用戶(hù)數(shù)量(例如月活躍就是類(lèi)似這種) , 可以使用or求并集

127.0.0.1:6379[1]> bitop or user:and:20_21 user:20230720 user:20230721
(integer) 2

3.8 HyperLogLog

3.8.1 簡(jiǎn)介

在工作當(dāng)中,我們經(jīng)常會(huì)遇到與統(tǒng)計(jì)相關(guān)的功能需求,比如統(tǒng)計(jì)網(wǎng)站PV(PageView頁(yè)面訪(fǎng)問(wèn)量),可以使用Redis的incr、incrby輕松實(shí)現(xiàn)。

但像UV(UniqueVisitor,獨(dú)立訪(fǎng)客)、獨(dú)立IP數(shù)、搜索記錄數(shù)等需要去重和計(jì)數(shù)的問(wèn)題如何解決?這種求集合中不重復(fù)元素個(gè)數(shù)的問(wèn)題稱(chēng)為基數(shù)問(wèn)題。

解決基數(shù)問(wèn)題有很多種方案:

1)數(shù)據(jù)存儲(chǔ)在MySQL表中,使用distinct count計(jì)算不重復(fù)個(gè)數(shù)

2)使用Redis提供的hash、set、bitmaps等數(shù)據(jù)結(jié)構(gòu)來(lái)處理

以上的方案結(jié)果精確,但隨著數(shù)據(jù)不斷增加,導(dǎo)致占用空間越來(lái)越大,對(duì)于非常大的數(shù)據(jù)集是不切實(shí)際的。

為了能夠降低一定的精度來(lái)平衡存儲(chǔ)空間,Redis推出了HyperLogLog。

HyperLogLog 是用來(lái)做基數(shù)統(tǒng)計(jì)的算法,HyperLogLog 的優(yōu)點(diǎn)是:在輸入元素的數(shù)量或者體積非常非常大時(shí),計(jì)算基數(shù)所需的空間總是固定的、并且是很小的。

在 Redis 里面,每個(gè) HyperLogLog 鍵只需要花費(fèi) 12 KB 內(nèi)存,就可以計(jì)算接近 2^64 個(gè)不同元素的基數(shù)。這和計(jì)算基數(shù)時(shí),元素越多耗費(fèi)內(nèi)存就越多的集合形成鮮明對(duì)比。

但是,因?yàn)?HyperLogLog 只會(huì)根據(jù)輸入元素來(lái)計(jì)算基數(shù),而不會(huì)儲(chǔ)存輸入元素本身,所以 HyperLogLog 不能像集合那樣,返回輸入的各個(gè)元素。

什么是基數(shù)?

比如數(shù)據(jù)集 {1, 3, 5, 7, 5, 7, 8},那么這個(gè)數(shù)據(jù)集的基數(shù)集為 {1, 3, 5 ,7, 8},基數(shù)(不重復(fù)元素)為5。 基數(shù)估計(jì)就是在誤差可接受的范圍內(nèi),快速計(jì)算基數(shù)。

3.8.2 相關(guān)命令

序號(hào)

命令語(yǔ)法

描述

1

PFADD key element [element ...]

添加指定元素到 HyperLogLog 中

2

PFCOUNT key [key ...]

返回給定 HyperLogLog 的基數(shù)估算值

3

PFMERGE destkey sourcekey [sourcekey ...]

將多個(gè) HyperLogLog 合并為一個(gè) HyperLogLog

練習(xí)

127.0.0.1:6379[1]> pfadd mypf 1 2 3 7 9 5 3 4 2 2 為mypf中插入數(shù)據(jù)
(integer) 1
127.0.0.1:6379[1]> pfcount mypf 統(tǒng)計(jì)mypf的基數(shù)
(integer) 7
127.0.0.1:6379[1]> pfadd mypf2 4 5 13 2 2 4  為mypf2中插入數(shù)據(jù)
(integer) 1
127.0.0.1:6379[1]> pfmerge mypf mypf2 將mypf和mypf2合并為一個(gè)
OK

將所有元素添加到指定HyperLogLog數(shù)據(jù)結(jié)構(gòu)中。如果執(zhí)行命令后HLL估計(jì)的近似基數(shù)發(fā)生變化,則返回1,否則返回0。

3.9 Geospatial(地理空間)

3.9.1 簡(jiǎn)介

Redis 3.2 中增加了對(duì)GEO類(lèi)型的支持。GEO,Geographic,地理信息的縮寫(xiě)。該類(lèi)型,就是元素的2維坐標(biāo),在地圖上就是經(jīng)緯度。redis基于該類(lèi)型,提供了經(jīng)緯度設(shè)置,查詢(xún),范圍查詢(xún),距離查詢(xún),經(jīng)緯度Hash等常見(jiàn)操作。

3.9.2 相關(guān)命令

序號(hào)

命令語(yǔ)法

描述

1

geoadd key longitude latitude member [longitude latitude member...]

添加地理位置(經(jīng)度,緯度,名稱(chēng))

2

geopos key member [member...]

獲得指定地區(qū)的坐標(biāo)值

3

geodist key member1 member2 [mkmftmi]

獲取兩個(gè)位置之間的直線(xiàn)距離

4

georadius key longitude latitude radius [mkmft?mi]

以給定的經(jīng)緯度為中心,找出某一半徑內(nèi)的元素

練習(xí)

1)添加城市坐標(biāo)

例如,設(shè)置上海、重慶、深圳和北京的坐標(biāo)

127.0.0.1:6379[1]> geoadd china:city 121.47 31.23 shanghai
(integer) 1
127.0.0.1:6379[1]> geoadd china:city 106.50 29.53 chongqing 114.05 22.52 shenzhen 116.38 39.90 beijing
(integer) 3

有效的經(jīng)度從 -180 度到 180 度。有效的緯度從 -85.05112878 度到 85.05112878 度。

當(dāng)坐標(biāo)位置超出指定范圍時(shí),該命令將會(huì)返回一個(gè)錯(cuò)誤。

已經(jīng)添加的數(shù)據(jù),是無(wú)法再次往里面添加的。

2)獲取城市坐標(biāo)

例如,獲取上海的坐標(biāo)。

127.0.0.1:6379[1]>  geopos china:city shanghai
1) 1) "121.47000163793563843"
   2) "31.22999903975783553"

3)用于獲取兩個(gè)位置之間的直線(xiàn)距離。

例如,獲取北京和深圳的直線(xiàn)距離。

127.0.0.1:6379[1]>  geopos china:city beijing shanghai km
1) 1) "116.38000041246414185"
   2) "39.90000009167092543"
2) 1) "121.47000163793563843"
   2) "31.22999903975783553"
3) (nil)

單位:

m:表示單位為米[默認(rèn)值]。

km:表示單位為千米。

mi:表示單位為英里。

ft:表示單位為英尺。

4)用于獲取指定坐標(biāo)半徑內(nèi)的元素

例如,獲取經(jīng)度為 110,緯度為 30,半徑為 1000KM 的所有城市。

127.0.0.1:6379[1]>  georadius china:city 110 30 1000 km
1) "chongqing"
2) "shenzhen"

二、Redis持久化

觸發(fā)方式:
(1)手動(dòng)觸發(fā):save

(2)自動(dòng)觸發(fā):bgsave,即

在redis.conf中去進(jìn)行配置:

save time opeation_count

例如:save 10 30;#表示的是十秒內(nèi)如果有三十次操作就自動(dòng)進(jìn)行一次快照

1、RDB

1.1 什么是RDB

在指定的時(shí)間間隔內(nèi)將內(nèi)存中的數(shù)據(jù)集快照寫(xiě)入磁盤(pán), 也就是Snapshot快照,它恢復(fù)時(shí)是將快照文件直接讀到內(nèi)存里。

1.2 如何備份

Redis會(huì)單獨(dú)創(chuàng)建(fork)一個(gè)子進(jìn)程來(lái)進(jìn)行持久化,(創(chuàng)建子進(jìn)程的目的:讓主進(jìn)程正常工作)會(huì)先將數(shù)據(jù)寫(xiě)入到 一個(gè)臨時(shí)文件中(防止子進(jìn)程失敗破壞原文件件),待持久化過(guò)程都結(jié)束后,再用這個(gè)臨時(shí)文件替換上次持久化好的文件。 整個(gè)過(guò)程中,主進(jìn)程是不進(jìn)行任何IO操作的,這就確保了極高的性能。如果需要進(jìn)行大規(guī)模數(shù)據(jù)的恢復(fù),且對(duì)于數(shù)據(jù)恢復(fù)的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺點(diǎn)是最后一次持久化后的數(shù)據(jù)可能丟失。

1.3 Fork

Fork 的作用是復(fù)制一個(gè)與當(dāng)前進(jìn)程一樣的進(jìn)程。新進(jìn)程的所有數(shù)據(jù)(變量、環(huán)境變量、程序計(jì)數(shù)器等) 數(shù)值都和原進(jìn)程一致,但它是一個(gè)全新的進(jìn)程,并作為原進(jìn)程的子進(jìn)程。在 Linux 程序中,fork() 會(huì)產(chǎn)生一個(gè)和父進(jìn)程完全相同的子進(jìn)程,但子進(jìn)程在此后多會(huì) exec 系統(tǒng)調(diào)用,出于效率考慮,Linux 中引入了“寫(xiě)時(shí)復(fù)制技術(shù)”。一般情況下父進(jìn)程和子進(jìn)程會(huì)共用同一段物理內(nèi)存,只有進(jìn)程空間的各段的內(nèi)容要發(fā)生變化時(shí),才會(huì)將父進(jìn)程的內(nèi)容復(fù)制一份給子進(jìn)程。(只有主進(jìn)程中的數(shù)據(jù)發(fā)生變化時(shí)才會(huì)把副本復(fù)制給子進(jìn)程)

1.4?優(yōu)勢(shì)

RDB 方式適合大規(guī)模的數(shù)據(jù)恢復(fù),并且對(duì)數(shù)據(jù)完整性和一致性要求不高更適合使用。它有以下幾種優(yōu)勢(shì):

  • 節(jié)省磁盤(pán)空間(二進(jìn)制存儲(chǔ))

  • 恢復(fù)速度快

Redis九種數(shù)據(jù)類(lèi)型及其持久化機(jī)制:探索數(shù)據(jù)存儲(chǔ)的奇妙世界,Redis,作業(yè),redis,數(shù)據(jù)庫(kù),緩存

1.5?劣勢(shì)

  • Fork的時(shí)候,內(nèi)存中的數(shù)據(jù)被克隆了一份,大致2倍的膨脹性需要考慮

  • 雖然Redis在fork時(shí)使用了寫(xiě)時(shí)拷貝技術(shù),但是如果數(shù)據(jù)龐大時(shí)還是比較消耗性能。

  • 在備份周期在一定間隔時(shí)間做一次備份,所以如果Redis意外down掉的話(huà),就會(huì)丟失最后一次快照后的所有修改。

1.6具體實(shí)現(xiàn):

1、進(jìn)入redis.conf配置文件中:

vim /etc/redis.conf 
一些配置可設(shè)置的配置:
save 3600 1 300 100 60 10000 # 自動(dòng)觸發(fā)機(jī)制
stop-writes-on-bgsave-error yes # 是否在遇到錯(cuò)誤停止寫(xiě)
rdbcompression yes # 是否壓縮
rdbchecksum yes # 是否校驗(yàn)完整性
dbfilename dump.rdb #rdb文件名
dir /usr/local/redis-stable/# 存儲(chǔ)rdb文件的位置

2、修改文件路徑

Redis九種數(shù)據(jù)類(lèi)型及其持久化機(jī)制:探索數(shù)據(jù)存儲(chǔ)的奇妙世界,Redis,作業(yè),redis,數(shù)據(jù)庫(kù),緩存

3、增加觸發(fā)機(jī)制:

Redis九種數(shù)據(jù)類(lèi)型及其持久化機(jī)制:探索數(shù)據(jù)存儲(chǔ)的奇妙世界,Redis,作業(yè),redis,數(shù)據(jù)庫(kù),緩存

4、 重啟redis服務(wù)

systemctl restart redis

?5、在配置文件中關(guān)閉aof

Redis九種數(shù)據(jù)類(lèi)型及其持久化機(jī)制:探索數(shù)據(jù)存儲(chǔ)的奇妙世界,Redis,作業(yè),redis,數(shù)據(jù)庫(kù),緩存

6、 嘗試在redis中存放6條數(shù)據(jù):

127.0.0.1:6379> lpush k1 1
(integer) 1
127.0.0.1:6379> lpush k1 2
(integer) 2
127.0.0.1:6379> lpush k1 3
(integer) 3
127.0.0.1:6379> lpush k1 4
(integer) 4
127.0.0.1:6379> lpush k1 5
(integer) 5
127.0.0.1:6379> lpush k1 6
(integer) 6

7、查看并且killredis進(jìn)程

[root@server ~]# ps -e | grep redis
   2476 pts/0    00:00:00 redis-server
   2481 pts/2    00:00:00 redis-cli
[root@server ~]# kill -9 2476

8、查看:

127.0.0.1:6379> lrange k1 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
#這里結(jié)果顯示的只有前五條數(shù)據(jù),符合之前設(shè)置的60秒保存5條記錄

2、AOF

2.1 什么是AOF

以日志的形式來(lái)記錄每個(gè)寫(xiě)操作(增量保存),將Redis執(zhí)行過(guò)的所有寫(xiě)指令記錄下來(lái)(讀操作不記錄), 只追加文件但不可以改寫(xiě)文件,Redis啟動(dòng)之初會(huì)讀取該文件重新構(gòu)建數(shù)據(jù)。簡(jiǎn)單說(shuō),Redis 重啟時(shí)會(huì)根據(jù)日志文件的內(nèi)容將寫(xiě)指令從前到后執(zhí)行一次以完成數(shù)據(jù)的恢復(fù)工作。

在Redis的默認(rèn)配置中AOF(Append Only File)持久化機(jī)制是沒(méi)有開(kāi)啟的,要想使用AOF持久化需要先開(kāi)啟此功能。AOF持久化會(huì)將被執(zhí)行的寫(xiě)命令寫(xiě)到AOF文件末尾,以此來(lái)記錄數(shù)據(jù)發(fā)生的變化,因此只要Redis從頭到尾執(zhí)行一次AOF文件所包含的所有寫(xiě)命令,就可以恢復(fù)AOF文件的記錄的數(shù)據(jù)集。

注:AOF的文件是文本文件格式;

2.2?優(yōu)勢(shì)

  • 備份機(jī)制更穩(wěn)健,丟失數(shù)據(jù)概率更低。

  • 可讀的日志文本,通過(guò)操作AOF穩(wěn)健,可以處理誤操作。

2.3?劣勢(shì)

  • 比起RDB占用更多的磁盤(pán)空間。

  • 恢復(fù)備份速度要慢。

  • 每次讀寫(xiě)都同步的話(huà),有一定的性能壓力。

  • 存在個(gè)別Bug,造成恢復(fù)不能。

2.4具體實(shí)現(xiàn)

1、首先關(guān)閉RDB?

Redis九種數(shù)據(jù)類(lèi)型及其持久化機(jī)制:探索數(shù)據(jù)存儲(chǔ)的奇妙世界,Redis,作業(yè),redis,數(shù)據(jù)庫(kù),緩存

2、移除之前的文件并且重啟redis服務(wù):

 mv dump.rdb dump.rdb.bak
systemctl restart redis

3、開(kāi)啟AOF:

Redis九種數(shù)據(jù)類(lèi)型及其持久化機(jī)制:探索數(shù)據(jù)存儲(chǔ)的奇妙世界,Redis,作業(yè),redis,數(shù)據(jù)庫(kù),緩存

#有關(guān)AOF的配置文件
appendonly no # 是否開(kāi)啟AOF
appendfilename "appendonly.aof" # AOF文件名
appenddirname "appendonlydir" # AOF文件的目錄
appendfsync everysec # 刷盤(pán)時(shí)機(jī)
no-appendfsync-on-rewrite no # 重寫(xiě)的時(shí)候是否刷盤(pán)
# 觸發(fā)重寫(xiě)rewrite的條件
auto-aof-rewrite-percentage 100 # 當(dāng)文件大小和上一次rewrite的aof文件大小一樣的時(shí)候開(kāi)始rewrite
100M-> 100M 
auto-aof-rewrite-min-size 64mb  # 64mb 文件大小最小64mb

?4、重啟服務(wù):

 systemctl restart redis.service 

5、查看內(nèi)容

127.0.0.1:6379> keys *
(empty array)
#已經(jīng)變?yōu)榭罩盗?/code>

6、寫(xiě)入一些內(nèi)容

127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> set k3 v3
OK
127.0.0.1:6379> set k1 v2
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> set k1 v3
OK
127.0.0.1:6379> set k1 v4
OK
127.0.0.1:6379> set k1 v5
OK
127.0.0.1:6379> lpush mylist 1
(integer) 1
127.0.0.1:6379> lpush mylist 2
(integer) 2
127.0.0.1:6379> lpush mylist 3
(integer) 3
127.0.0.1:6379> lpush mylist 4
(integer) 4
127.0.0.1:6379> lpush mylist 5
(integer) 5
127.0.0.1:6379> lpush mylist 6
(integer) 6

7、手動(dòng)觸發(fā)瘦身

BGREWRITEAOF
Background append only file rewriting started

8、瘦身前后對(duì)比

瘦身前:
ls -l
總用量 12
-rw-r--r--. 1 root root  89  7月 21 06:29 appendonly.aof.1.base.rdb
-rw-r--r--. 1 root root 459  7月 21 06:32 appendonly.aof.1.incr.aof
-rw-r--r--. 1 root root  88  7月 21 06:29 appendonly.aof.manifest
瘦身后:
ls -l
總用量 8
-rw-r--r--. 1 root root 145  7月 21 06:37 appendonly.aof.2.base.rdb
-rw-r--r--. 1 root root   0  7月 21 06:37 appendonly.aof.2.incr.aof
-rw-r--r--. 1 root root  88  7月 21 06:37 appendonly.aof.manifest

很明顯瘦身后的文件比瘦身前小很多文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-602007.html

到了這里,關(guān)于Redis九種數(shù)據(jù)類(lèi)型及其持久化機(jī)制:探索數(shù)據(jù)存儲(chǔ)的奇妙世界的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 深入解析 Redis 持久化機(jī)制

    深入解析 Redis 持久化機(jī)制

    我們都知道,Redis 的數(shù)據(jù)存儲(chǔ)在內(nèi)存中, 一旦服務(wù)器宕機(jī),內(nèi)存中的數(shù)據(jù)將全部丟失。因此,對(duì) Redis 來(lái)說(shuō),實(shí)現(xiàn)數(shù)據(jù)的持久化,避免從后端數(shù)據(jù)庫(kù)中進(jìn)行恢復(fù),是至關(guān)重要的。本篇我們?cè)敿?xì)講解下 Redis 的三種持久化機(jī)制,分別是? AOF(Append Only File) ?日志和? RDB 快照 ?以及

    2024年02月12日
    瀏覽(29)
  • 搞明白R(shí)edis持久化機(jī)制

    Redis是一種內(nèi)存數(shù)據(jù)庫(kù),其內(nèi)存中的數(shù)據(jù)存儲(chǔ)在計(jì)算機(jī)的內(nèi)存中,如果服務(wù)器發(fā)生崩潰或者重啟,內(nèi)存中的數(shù)據(jù)將會(huì)丟失。為了避免這種情況發(fā)生,Redis提供了兩種持久化機(jī)制:RDB和AOF。 Redis支持將當(dāng)前數(shù)據(jù)狀態(tài)快照持久化到硬盤(pán)上,這種快照是一個(gè)二進(jìn)制文件,包含了Redis在

    2023年04月25日
    瀏覽(29)
  • 【Redis】—— Redis的RDB持久化機(jī)制

    【Redis】—— Redis的RDB持久化機(jī)制

    ?????????????????????????????????????????????????????????????????? ?? 【 R e d i s 】—— R e d i s 的 R D B 持久化機(jī)制 color{#FF1493}{【Redis】 —— Redis的RDB持久化機(jī)制} 【 R e d i s 】 —— R e d i s 的 R D B 持久化機(jī)制 ?? ????????? ?? 仰望天空

    2024年02月13日
    瀏覽(23)
  • 【Redis】Redis持久化機(jī)制RDB與AOF

    【Redis】Redis持久化機(jī)制RDB與AOF

    目錄 一、RDB 1、概念 2、RDB文件保存 3、執(zhí)行RDB 4、觸發(fā)RDB 5、fork原理 6、RDB的缺點(diǎn) 二、AOF 1、概念 2、開(kāi)啟AOF 3、觸發(fā)AOF 4、觸發(fā)重寫(xiě)AOF 三、區(qū)別 RDB全稱(chēng)為Redis Database Backup File(Redis數(shù)據(jù)備份文件),也叫做Redis數(shù)據(jù)快照。簡(jiǎn)單的來(lái)說(shuō)就是把某一時(shí)刻Redis內(nèi)存里的數(shù)據(jù)都記錄到磁

    2024年02月08日
    瀏覽(39)
  • redis持久化機(jī)制:RDB和AOF

    Redis的持久化機(jī)制主要依賴(lài)于兩種方法:RDB(Redis Database)和AOF(Append Only File)。這兩種機(jī)制可以單獨(dú)使用,也可以同時(shí)使用,以提高數(shù)據(jù)的持久性和可靠性。 RDB(Redis Database) 工作原理 : RDB通過(guò)創(chuàng)建數(shù)據(jù)集的快照來(lái)進(jìn)行持久化。 快照創(chuàng)建可以在指定的時(shí)間間隔內(nèi)自動(dòng)完成

    2024年01月19日
    瀏覽(58)
  • Redis持久化:RDB和AOF機(jī)制詳解

    Redis持久化:RDB和AOF機(jī)制詳解

    目錄 1.Redis持久化簡(jiǎn)介 2.RDB持久化 ? ?2.1 什么是 RDB 持久化? ? ?2.2 觸發(fā)方式 ? ?2.3 Redis.conf中配置RDB ? ?2.4 RDB 更深入理解 ? ?2.5 RDB優(yōu)缺點(diǎn) 3.AOF持久化 ? ?3.1 什么是 AOF 持久化? ? ?3.2 如何實(shí)現(xiàn)AOF ? ?3.3 Redis.conf中配置AOF ? ?3.4?深入理解AOF重寫(xiě) 4.RDB和AOF混合方式(4.0版本

    2024年02月12日
    瀏覽(21)
  • Redis支持的數(shù)據(jù)結(jié)構(gòu)有哪些?Redis使用單線(xiàn)程還是多線(xiàn)程?Redis的持久化機(jī)制有哪些?Redis的緩存淘汰策略有哪些?

    Redis支持的數(shù)據(jù)結(jié)構(gòu)包括: 字符串(string):存儲(chǔ)一個(gè)字符串。 列表(list):按照插入順序存儲(chǔ)多個(gè)字符串。 集合(set):存儲(chǔ)多個(gè)不重復(fù)的字符串。 有序集合(sorted set):存儲(chǔ)多個(gè)不重復(fù)的字符串,并為每個(gè)字符串關(guān)聯(lián)一個(gè)分?jǐn)?shù),可以根據(jù)分?jǐn)?shù)進(jìn)行排序。 哈希表(has

    2024年02月12日
    瀏覽(37)
  • 徹底搞懂Redis持久化機(jī)制,輕松應(yīng)對(duì)工作面試

    徹底搞懂Redis持久化機(jī)制,輕松應(yīng)對(duì)工作面試

    Redis是基于內(nèi)存存儲(chǔ)的數(shù)據(jù)庫(kù),如果遇到服務(wù)重啟或者崩潰,內(nèi)存中的數(shù)據(jù)將會(huì)被清空。所以為了確保數(shù)據(jù)安全性和可靠性,我們需要將內(nèi)存中的數(shù)據(jù)持久化到磁盤(pán)上。 持久化不僅可以防止由于系統(tǒng)故障、重啟或者其他原因?qū)е碌臄?shù)據(jù)丟失。還可以用于備份、數(shù)據(jù)恢復(fù)和遷移

    2023年04月20日
    瀏覽(25)
  • 【12期】談一談redis兩種持久化機(jī)制的區(qū)別?

    RDB方案可以在規(guī)定時(shí)間間隔內(nèi)創(chuàng)建數(shù)據(jù)集的時(shí)間點(diǎn)快照。 AOF方案記錄了服務(wù)器執(zhí)行的所有寫(xiě)操作命令,并在服務(wù)器啟動(dòng)時(shí)通過(guò)重新執(zhí)行這些命令來(lái)還原數(shù)據(jù)集。AOF文件完全遵循Redis協(xié)議格式保存,新命令會(huì)被追加到文件末尾。此外,Redis還能在后臺(tái)對(duì)AOF文件重寫(xiě)以確保不超過(guò)

    2024年02月11日
    瀏覽(31)
  • Redis持久化說(shuō)明及其單臺(tái)Linux服務(wù)器搭建Redis集群架構(gòu)

    Redis持久化說(shuō)明及其單臺(tái)Linux服務(wù)器搭建Redis集群架構(gòu)

    說(shuō)明:RDB快照主要以二進(jìn)制文件的形式進(jìn)行存儲(chǔ)數(shù)據(jù),主要以文件名dump.rdb進(jìn)行存儲(chǔ),主要設(shè)置redis.conf里面設(shè)置’save 60 1000’命令可以開(kāi)啟, 表示在60秒內(nèi)操作1000次進(jìn)行一次備份數(shù)據(jù)。在客戶(hù)端執(zhí)行save(同步)和bgsave(異步操作)。 redis.conf 啟動(dòng)redis相關(guān)命令 說(shuō)明:主要把文件生

    2024年02月10日
    瀏覽(32)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包