定義:
1.基于內(nèi)存的key-value數(shù)據(jù)庫
2.基于c語言編寫的,可以支持多種語言的api //set每秒11萬次,取get 81000次
3.支持?jǐn)?shù)據(jù)持久化
4.value可以是string,hash, list, set, sorted set
使用場景
- 去最新n個(gè)數(shù)據(jù)的操作
- 排行榜,取top n個(gè)數(shù)據(jù) //最佳人氣前10條
- 精確的設(shè)置過期時(shí)間
- 計(jì)數(shù)器
- 實(shí)時(shí)系統(tǒng), 反垃圾系統(tǒng)
- pub, sub發(fā)布訂閱構(gòu)建實(shí)時(shí)消息系統(tǒng)
- 構(gòu)建消息隊(duì)列
- 緩存
三種模式:
- 單機(jī):掛了數(shù)據(jù)就丟失了
- 主從:為了防止數(shù)據(jù)丟失,增加從節(jié)點(diǎn)備份機(jī)制,從節(jié)點(diǎn)也可以有它自己的從節(jié)點(diǎn)。但master掛了,slave不能成為新的master
- 哨兵:主從模式的升級版,增加哨兵監(jiān)控機(jī)制,master掛了,可以通過算法從slave選取新的master
- 集群:主從和哨兵特性的集合,解決機(jī)器資源利用問題,適合數(shù)據(jù)量大的,至少需要3個(gè)節(jié)點(diǎn),而且保證都有從節(jié)點(diǎn),所以要有6臺機(jī)器。
使用場景
- 去最新n個(gè)數(shù)據(jù)的操作
- 排行榜,取top n個(gè)數(shù)據(jù) //最佳人氣前10條
- 精確的設(shè)置過期時(shí)間
- 計(jì)數(shù)器
- 實(shí)時(shí)系統(tǒng), 反垃圾系統(tǒng)
- pub, sub發(fā)布訂閱構(gòu)建實(shí)時(shí)消息系統(tǒng)
- 構(gòu)建消息隊(duì)列
- 緩存
持久化方式:
RDB是Redis默認(rèn)的持久化方式。按照一定的時(shí)間周期策略把內(nèi)存的數(shù)據(jù)以快照的形式保存到硬盤的二進(jìn)制文件。即Snapshot快照存儲,對應(yīng)產(chǎn)生的數(shù)據(jù)文件為dump.rdb,通過配置文件中的save參數(shù)來定義快照的周期。( 快照可以是其所表示的數(shù)據(jù)的一個(gè)副本,也可以是數(shù)據(jù)的一個(gè)復(fù)制品。)
AOF:Redis會將每一個(gè)收到的寫命令都通過Write函數(shù)追加到文件最后,類似于MySQL的binlog。當(dāng)Redis重啟是會通過重新執(zhí)行文件中保存的寫命令來在內(nèi)存中重建整個(gè)數(shù)據(jù)庫的內(nèi)容。
當(dāng)兩種方式同時(shí)開啟時(shí),數(shù)據(jù)恢復(fù)Redis會優(yōu)先選擇AOF恢復(fù)。
搭建
https://blog.csdn.net/qq_42815754/article/details/82912130
原理
1、判斷節(jié)點(diǎn)是否健康(能否正常使用),redis-cluster有這么一個(gè)投票容錯(cuò)機(jī)制:如果集群中超過半數(shù)的節(jié)點(diǎn)投票認(rèn)為某個(gè)節(jié)點(diǎn)掛了,那么這個(gè)節(jié)點(diǎn)就掛了(fail)。
2、判斷集群是否掛了:如果集群中任意一個(gè)節(jié)點(diǎn)掛了,而且該節(jié)點(diǎn)沒有從節(jié)點(diǎn)(備份節(jié)點(diǎn)),那么這個(gè)集群就掛了。
3、為什么任意一個(gè)節(jié)點(diǎn)掛了(沒有從節(jié)點(diǎn))這個(gè)集群就掛了呢? -> 因?yàn)榧簝?nèi)置了16384個(gè)slot(哈希槽),并且把所有的物理節(jié)點(diǎn)映射到了這16384[0-16383]個(gè)slot上,或者說把這些slot均等的分配給了各個(gè)節(jié)點(diǎn)。當(dāng)需要在Redis集群存放一個(gè)數(shù)據(jù)(key-value)時(shí),redis會先對這個(gè)key進(jìn)行crc16算法,然后得到一個(gè)結(jié)果。再把這個(gè)結(jié)果對16384進(jìn)行求余,這個(gè)余數(shù)會對應(yīng)[0-16383]其中一個(gè)槽,進(jìn)而決定key-value存儲到哪個(gè)節(jié)點(diǎn)中。所以一旦某個(gè)節(jié)點(diǎn)掛了,該節(jié)點(diǎn)對應(yīng)的slot就無法使用,那么就會導(dǎo)致集群無法正常工作。
命令:
key
keys * 獲取所有的key
select 0 選擇第一個(gè)庫
move myString 1 將當(dāng)前的數(shù)據(jù)庫key移動(dòng)到某個(gè)數(shù)據(jù)庫,目標(biāo)庫有,則不能移動(dòng)
flush db 清除指定庫
randomkey 隨機(jī)key
type key 類型
set key1 value1 設(shè)置key
get key1 獲取key
mset key1 value1 key2 value2 key3 value3
mget key1 key2 key3
del key1 刪除key
exists key 判斷是否存在key
expire key 10 10過期
pexpire key 1000 毫秒
persist key 刪除過期時(shí)間
string
set name cxx
get name
getrange name 0 -1 字符串分段
getset name new_cxx 設(shè)置值,返回舊值
mset key1 key2 批量設(shè)置
mget key1 key2 批量獲取
setnx key value 不存在就插入(not exists)
setex key time value 過期時(shí)間(expire)
setrange key index value 從index開始替換value
incr age 遞增
incrby age 10 遞增
decr age 遞減
decrby age 10 遞減
incrbyfloat 增減浮點(diǎn)數(shù)
append 追加
strlen 長度
getbit/setbit/bitcount/bitop 位操作
hash
hset myhash name cxx
hget myhash name
hmset myhash name cxx age 25 note "i am notes"
hmget myhash name age note
hgetall myhash 獲取所有的
hexists myhash name 是否存在
hsetnx myhash score 100 設(shè)置不存在的
hincrby myhash id 1 遞增
hdel myhash name 刪除
hkeys myhash 只取key
hvals myhash 只取value
hlen myhash 長度
list
lpush mylist a b c 左插入
rpush mylist x y z 右插入
lrange mylist 0 -1 數(shù)據(jù)集合
lpop mylist 彈出元素
rpop mylist 彈出元素
llen mylist 長度
lrem mylist count value 刪除
lindex mylist 2 指定索引的值
lset mylist 2 n 索引設(shè)值
ltrim mylist 0 4 刪除key
linsert mylist before a 插入
linsert mylist after a 插入
rpoplpush list list2 轉(zhuǎn)移列表的數(shù)據(jù)
set
sadd myset redis
smembers myset 數(shù)據(jù)集合
srem myset set1 刪除
sismember myset set1 判斷元素是否在集合中
scard key_name 個(gè)數(shù)
sdiff | sinter | sunion 操作:集合間運(yùn)算:差集 | 交集 | 并集
srandmember 隨機(jī)獲取集合中的元素
spop 從集合中彈出一個(gè)元素
zset
zadd zset 1 one
zadd zset 2 two
zadd zset 3 three
zincrby zset 1 one 增長分?jǐn)?shù)
zscore zset two 獲取分?jǐn)?shù)
zrange zset 0 -1 withscores 范圍值
zrangebyscore zset 10 25 withscores 指定范圍的值
zrangebyscore zset 10 25 withscores limit 1 2 分頁
Zrevrangebyscore zset 10 25 withscores 指定范圍的值
zcard zset 元素?cái)?shù)量
Zcount zset 獲得指定分?jǐn)?shù)范圍內(nèi)的元素個(gè)數(shù)
Zrem zset one two 刪除一個(gè)或多個(gè)元素
Zremrangebyrank zset 0 1 按照排名范圍刪除元素
Zremrangebyscore zset 0 1 按照分?jǐn)?shù)范圍刪除元素
Zrank zset 0 -1 分?jǐn)?shù)最小的元素排名為0
Zrevrank zset 0 -1 分?jǐn)?shù)最大的元素排名為0
Zinterstore
zunionstore rank:last_week 7 rank:20150323 rank:20150324 rank:20150325 weights 1 1 1 1 1 1 1
排序:
sort mylist 排序
sort mylist alpha desc limit 0 2 字母排序
sort list by it:* desc by命令
sort list by it:* desc get it:* get參數(shù)
sort list by it:* desc get it:* store sorc:result sort命令之store參數(shù):表示把sort查詢的結(jié)果集保存起來
訂閱與發(fā)布:
訂閱頻道:subscribe chat1
發(fā)布消息:publish chat1 "hell0 ni hao"
查看頻道:pubsub channels
查看某個(gè)頻道的訂閱者數(shù)量: pubsub numsub chat1
退訂指定頻道: unsubscrible chat1 , punsubscribe java.*
訂閱一組頻道: psubscribe java.*
redis事物:
隔離性,原子性,
步驟: 開始事務(wù),執(zhí)行命令,提交事務(wù)
multi //開啟事務(wù)
sadd myset a b c
sadd myset e f g
lpush mylist aa bb cc
lpush mylist dd ff gg
服務(wù)器管理
dump.rdb
appendonly.aof
//BgRewriteAof 異步執(zhí)行一個(gè)aop(appendOnly file)文件重寫
會創(chuàng)建當(dāng)前一個(gè)AOF文件體積的優(yōu)化版本
//BgSave 后臺異步保存數(shù)據(jù)到磁盤,會在當(dāng)前目錄下創(chuàng)建文件dump.rdb
//save同步保存數(shù)據(jù)到磁盤,會阻塞主進(jìn)程,別的客戶端無法連接
//client kill 關(guān)閉客戶端連接
//client list 列出所有的客戶端
//給客戶端設(shè)置一個(gè)名稱
client setname myclient1
client getname
config get port
//configRewrite 對redis的配置文件進(jìn)行改寫
rdb
save 900 1
save 300 10
save 60 10000
aop備份處理
appendonly yes 開啟持久化
appendfsync everysec 每秒備份一次
命令:
bgsave異步保存數(shù)據(jù)到磁盤(快照保存)
lastsave返回上次成功保存到磁盤的unix的時(shí)間戳
shutdown同步保存到服務(wù)器并關(guān)閉redis服務(wù)器
bgrewriteaof文件壓縮處理(命令)