本文主要介紹了 Redis 的簡介、安裝、常用命令和基礎(chǔ)類型。
簡介和安裝
1. NoSQL 簡介
NoSQL,泛指非關(guān)系型數(shù)據(jù)庫,NoSQL數(shù)據(jù)庫分四類
- 鍵值(key-value)存儲數(shù)據(jù)庫,這一類數(shù)據(jù)庫會使用一個哈希表,這個表中一個特定的鍵和一個指針指向特定的數(shù)據(jù),如Redis,Voldmort,Oracle BDB
- 列存儲數(shù)據(jù)庫,通常用來因?qū)Ψ植际酱鎯Φ暮A吭娋?,鍵仍然存在,但是它們的特點是指向多個列。如HBASE,Riak。
- 文檔型數(shù)據(jù)庫,數(shù)據(jù)模型是版本化的文檔,半結(jié)構(gòu)化的文檔以特定的格式存儲,比如JSON。文檔型數(shù)據(jù)庫可以看做是鍵值數(shù)據(jù)庫的升級版,允許之間嵌套鍵值。而且文檔數(shù)據(jù)庫比鍵值數(shù)據(jù)庫的查詢效率更高。如:CouchDB,MongoDB。
- 圖形數(shù)據(jù)庫,與其他行列以及剛性結(jié)構(gòu)的SQL數(shù)據(jù)庫不同,它是使用靈活的圖形模型,能夠擴展到過個服務(wù)器上。
NoSQL數(shù)據(jù)庫沒有表中的查詢語言(SQL),因此進行數(shù)據(jù)查詢需要定制數(shù)據(jù)模型。許多NoSQL數(shù)據(jù)庫都有TEST式的數(shù)據(jù)接口或者API。如:Neo4J,InfoGrid,Infinite Graph。
2. 非關(guān)系型數(shù)據(jù)庫的特點
- 數(shù)據(jù)模型比較簡單
- 需要靈活性更強的IT系統(tǒng)
- 對數(shù)據(jù)庫性能要求較高
- 不需要高度的數(shù)據(jù)一致性
- 對于給定的key,比較容易映射復(fù)雜值得環(huán)境
Redis 簡介
是以key-value形式存儲,data structure service 數(shù)據(jù)結(jié)構(gòu)服務(wù)器。鍵可以包含:(String) 字符串,哈希,(list)鏈表,(set)集合,(zset)有序集合。這些數(shù)據(jù)集合都支持push/pop、add/remove級取交集、并集已經(jīng)更復(fù)雜的操作。Redis支持各種不同的方式排序。為了保證效率,數(shù)據(jù)都是緩存在內(nèi)存中,它可以周期性的把更新的數(shù)據(jù)寫入磁盤或者把修改的操作追加到文件中。
- 優(yōu)點
- 對數(shù)據(jù)高并發(fā)讀寫
- 對海量數(shù)據(jù)的高效率存儲和訪問
- 對數(shù)據(jù)的可擴展性和高可用性
- 缺點
- redis 無法做到太復(fù)雜的關(guān)系數(shù)據(jù)庫模型
3. 一些特性
- 擴展性
- 水平擴展。在原有的主(可讀可寫)從(只讀)服務(wù)器集群(讀寫分離的),橫向的擴充,增加主從節(jié)點
- 垂直擴展。把原有的主從服務(wù)器上加硬件來增加容量
- 高可用:在原來的主節(jié)點掛掉時,從節(jié)點連接到其他的主節(jié)點。
- 可靠性:持久化后的數(shù)據(jù)不丟失(同步到硬盤)
- RDB: 周期性的把內(nèi)存中的數(shù)據(jù)同步到硬盤上
- 只要DML操作,把持久化操作記錄到日志
appendonly.aof中(相當于Oracle中的undo的概念)。主要。
4. Redis 的三種內(nèi)容解決方案
- 主從形式: 普通的一個主節(jié)點,多個從節(jié)點。當主節(jié)點掛掉的話,整個集群掛掉。
- 哨兵形式(redis 2.x):在主從的基礎(chǔ)上增加一個哨兵節(jié)點,來監(jiān)視主從節(jié)點的狀態(tài)。當主節(jié)點掛掉的時候,在從節(jié)點里通過選舉方式選擇一個從節(jié)點來當主節(jié)點。當主節(jié)點修復(fù),會默認變成從節(jié)點。
- 集群模式(redis 3.x):多主多從,可以做數(shù)據(jù)的分布(把數(shù)據(jù)均攤到多臺機器)
5. 關(guān)于Redis的面試問題
1. Redis 慢
原因:在寫入的時候,redis 使用AOF模式來維持高可用,因此要不斷的記錄日志。導(dǎo)致寫慢讀快(讀自內(nèi)存)。
解決方法:2.0時候可以調(diào)節(jié)虛擬機的參數(shù);3.0集群后參數(shù)不可調(diào),多加服務(wù)器;增加結(jié)合SSDB,來增加寫的速度。
2. 如何綜合的解決高并發(fā)問題
前端:lvs(負載兼容器) + nginx(業(yè)務(wù)拆分)
后臺:數(shù)據(jù)庫的分表分庫 / redis緩存(提高性能,給數(shù)據(jù)庫降壓)
3. 業(yè)務(wù)場景
不需要實時返回數(shù)據(jù),不需要強一致性
- 緩存(應(yīng)用最多,功能是秒殺,搶購,搶紅包)
- 任務(wù)隊列(聊天多條消息)
- 應(yīng)用排行榜
- 網(wǎng)站訪問統(tǒng)計
- 投票數(shù)、微博轉(zhuǎn)發(fā),評論、瀏覽量
- 數(shù)據(jù)過期處理
- 分布式集群架構(gòu)中的session 分離
Redis 安裝和常用命令
1. Linux 系統(tǒng)
下載地址
安裝步驟
- 首先安裝 gcc,把下載好的
redis-3.0.0-rc2.tar.gz放到 Linux/usr/local文件夾下; - 進行解壓
tar -zxvf redis-3.0.0-rc2.tar.gz; - 進入到
redis-3.0.0目錄下,進行編譯make; - 進入到
src下進行安裝make install,驗證(查看 src 目錄下,有redis-server、redis-cli即可); - 建立兩個文件夾存放 redis 命令和配置文件。
mkdir -p /usr/local/redis/etcmkdir -p /usr/local/redis/bin
- 把
redis-3.0.0下的redis.conf移動到/usr/local/redis/etc下。cp redis.conf /usr/local/redis/etc
- 把
redis-3.0.0/src里的以下文件移動到bin下。mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server /usr/local/redis/bin
- 啟動時并制定配置文件=:
./redis-server /usr/local/redis/etc/redis.conf。(注意使用后臺啟動,所以修改redis.conf里的9 daemonize改為yes) - 驗證是否啟動成功
-
ps -ef | grep redis或查看端口號netstat -tunpl | grep 6379 - 進入redis客戶端
redis-cli,退出客戶端quit - 退出redis服務(wù)
pkill redis-server,或kill進程號,或/usr/local/redis/bin/redis cli shutdown
-
安裝命令補充
-
linux yum rz安裝(使可以上傳下載文件):sudo yum install lrzsz -y - 上傳文件
rz(sc: 下載文件) - gcc 安裝:
sudo yum install gcc-c++ - 進入redis加壓后的文件夾,執(zhí)行
make,報錯的話執(zhí)行make MALLOC=libc - 啟動redis服務(wù)器:
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf;啟動客戶端/usr/local/redis/bin/redis-cli - 格式解壓
.tar.gz 格式解壓為 tar -zxvf xx.tar.gz
.tar.bz2 格式解壓為 tar -jxvf xx.tar.bz2
2. Mac 系統(tǒng)
使用Homebrew安裝 Redis
安裝命令
brew install redis
安裝完成后的提示信息
To have launchd start redis at login:
ln -sfv /usr/local/opt/redis/*.plist ~/Library/LaunchAgents
Then to load redis now:
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
Or, if you don’t want/need launchctl, you can just run:
redis-server /usr/local/etc/redis.conf
3. 常用命令
開機啟動 Redis 命令
$ ln -sfv /usr/local/opt/redis/*.plist ~/Library/LaunchAgents
檢查服務(wù)是否啟動
$ redis-cli ping 返回 PONG 啟動
$ ps aux | grep redis // 查看redis進程
使用配置文件啟動 Redis 命令
$ redis-server /usr/local/etc/redis.conf
或 $ redis-server
另 $ redis-server & // 后臺程序式運行
停止 Redis 服務(wù)
$ redis-cli shutdown
// Redis收到命令后,服務(wù)端會斷開所有客戶端的連接,然后根據(jù)配置執(zhí)行持久化,最后退出
啟動客戶端
// 1. 按照默認配置連接Redis(127.0.0.1:6379)
$ redis-cli
// 2. 指定地址和端口號
redis-cli -h 127.0.0.1 -p 6379
停止客戶端
ctrl + c 或 quit
redis 配置文件的位置
/usr/local/etc/redis.conf
卸載redis和它的文件
brewuninstall redis rm ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
4. 其他命令
-- 修改為守護模式
daemonize yes
-- 設(shè)置進程鎖文件
pidfile /usr/local/redis/redis.pid
-- 端口
port 6379
-- 客戶端超時時間
timeout 300
-- 日志級別
loglevel debug
-- 日志文件位置
logfile /usr/local/redis/log-redis.log
-- 設(shè)置數(shù)據(jù)庫的數(shù)量,默認數(shù)據(jù)庫為16,可以使用SELECT 命令在連接上指定數(shù)據(jù)庫id
databases 16
-- 指定在多長時間內(nèi),有多少次更新操作,就將數(shù)據(jù)同步到數(shù)據(jù)文件,可以多個條件配合
-- save
-- Redis默認配置文件中提供了三個條件:
save 900 1
save 300 10
save 60 10000
-- 指定存儲至本地數(shù)據(jù)庫時是否壓縮數(shù)據(jù),默認為yes,Redis采用LZF壓縮,如果為了節(jié)省CPU時間,
-- 可以關(guān)閉該#選項,但會導(dǎo)致數(shù)據(jù)庫文件變的巨大
rdbcompression yes
-- 指定本地數(shù)據(jù)庫文件名
dbfilename dump.rdb
-- 指定本地數(shù)據(jù)庫路徑
dir /usr/local/redis/db/
-- 指定是否在每次更新操作后進行日志記錄,Redis在默認情況下是異步的把數(shù)據(jù)寫入磁盤,如果不開啟,可能
-- 會在斷電時導(dǎo)致一段時間內(nèi)的數(shù)據(jù)丟失。因為 redis本身同步數(shù)據(jù)文件是按上面save條件來同步的,所以有
-- 的數(shù)據(jù)會在一段時間內(nèi)只存在于內(nèi)存中
appendonly no
-- 指定更新日志條件,共有3個可選值:
-- no:表示等操作系統(tǒng)進行數(shù)據(jù)緩存同步到磁盤(快)
-- always:表示每次更新操作后手動調(diào)用fsync()將數(shù)據(jù)寫到磁盤(慢,安全)
-- everysec:表示每秒同步一次(折衷,默認值)
appendfsync everysec
Redis 基礎(chǔ)類型講解
redis 一共5種基本數(shù)據(jù)類型: String、Hash、List、Set、ZSet
-
flushdb,直接清空
1. String 類型
String 類型是包含很多種類型的特殊類型,并且是二進制安全的。比如序列化對象進行存儲,比如一張二進制圖片進行二進制存儲,比如一個簡單的字符串、數(shù)值等。
- 設(shè)置值
set name zcq - 取值
get name(設(shè)置name多次會覆蓋) - 刪除值
del name -
setnx(not exist) name: 如果不存在進行設(shè)置,就不需要設(shè)置了,返回零 -
setex(expired),setex color 10 red設(shè)置color的有效期為10秒,10秒后返回nil(redis中nil表示空) - 使用
setrange替換字符串set email 123456789@qq.com-
setrange email 10 ww(表示從第10位開始替換,后面跟上替換的字符串)
- mset 、mget 一次性設(shè)置和獲取多個值
mset k1 v1 k2 v2mget k1 k2
- 一次性設(shè)置和取值
getset方法- getset key value
-
incr和decr方法: 對某一值進行遞增和遞減incr int_a -
incrby和decrby方法: 對某個值進行指定長度的遞增和遞減incrby int_a 4
-
append key value: 為某個值追加方法append name chuanqiang
-
strlen key獲取字符串的長度
2. Hash 類型
Hash 類型是 String 類型的 field 和 value 的映射,或者說一個 String 幾何,適合存儲對象,會比把一個對象類型存儲到String 中更減少空間,并方便存儲整個對象。
-
hset myhash field1 hello存儲值 -
hget myhash field1獲取內(nèi)容 -
hmset myhash field1 v1 field v2批量存儲多個鍵值對 -
hmget myhash field1 field2批量獲取鍵值對 -
hincrby、hdecrby幾何遞增和遞減 -
hexists是否存在 key,如果存在返回,不存在返回 0 -
hlen返回 Hash 集合里所有的鍵數(shù)值 -
hdel刪除指定 hash 里所有的字段 -
hkeys返回 Hash 里所有的字段 -
hvals返回 Hash 的所有 value -
hgetall返回 Hash 里所有的 key 和 value
3. List 類型
List 類型是一個鏈表結(jié)構(gòu)的集合,其主要功能有 push、pop、獲取元素等。List類是一個雙端鏈表結(jié)構(gòu)。我們可以進行集合的頭部和尾部添加或刪除元素。List 可以作為棧,又可以作為隊列。
-
lpush: 從頭部加入元素(棧),先進后出lpush list1 "hello"; lpush list1 "world"-
lrange list1 0 -1: 表示從頭取到尾。結(jié)果是world hello
-
rpush: 從尾部加入元素(隊列),先進先出rpush list2 "one; rpush list2"-
lrange list2 0 -1結(jié)果是hello world
-
linsert方法: 插入元素linsert list3 before[集合的元素][插入的元素]- 如
linsert list2 before "world" "hi",結(jié)果是hello hi world
-
lset方法: 將指定下標的元素替換掉-
lset list1 0 "aaa",把list1 的第一個數(shù)據(jù)替換為 aaa
-
-
lrem方法: 刪除元素,返回刪除的個數(shù)-
lrem list1 2 aaa,刪除兩個 aaa
-
-
ltrim方法: 保留指定 key 的值范圍內(nèi)的數(shù)據(jù)- eg
ltrim list1 1 5,保留第2到第6的值,刪除第一個值
- eg
-
lpop: 從list 的頭部刪除元素,并返回刪除元素lpop list1 -
rpop: 從list 的尾部刪除元素,并返回刪除元素rpop list1 -
rpoplpush: 移除列表的最后一個元素,并將該元素添加到另一個列表并返回 -
lindex: 通過索引獲取列表中的元素。也可以使用負數(shù)下標,以 -1 表示列表的最后一個元素, -2 表示列表的倒數(shù)第二個元素,以此類推。 -
llen: 返回元素的個數(shù)
4. Set 類型和 Zset 類型
set 集合是 String 類型的無序集合,set 是通過hashtable實現(xiàn)的,對集合我們可以取交集、并集、差集。
set 類型
-
sadd set1 name: 向集合中添加元素。 -
smembers set:查看set集合中的元素 -
srem set name: 刪除set中name元素 -
spop set:隨機返回刪除的key -
sdiff set1 set2:返回兩個集合的不同元素(以前面的集合為標準) -
sdiffstore set3 set1 set2: 將返回的不同元素存儲到set3中 -
sinter set1 set2: 返回集合的交集 -
sinterstroe set3 set1 set2: 返回交集結(jié)果,存儲到set3中 -
sunion set1 set2: 取并集 -
sunionstore set3 set1 set2: 取并集,存到set3中 -
smove set1 set2 a: 將set1中的元素移動到set2中去 -
scard set: 查看集合里面的元素個數(shù) -
sismember set name: 判斷某元素是否為集合中的元素。返回1代表是,0代表否 -
srandmember set: 隨機返回一個元素
zset 類型
-
zadd向有序集合中添加一個元素,該元素如果存在,則更新順序。
zadd zset1 3 five;
zadd zset1 1 one;
zadd zset1 2 two;
zrange zset1 0 -1 withscores; -- 展示所有元素
zset可以做搜索排行
-
zrem zset1 one: 刪除名稱為key的zset中的元素 -
zincrby: 以指定去自動遞增或減少 -
zrangebyscore: 找到指定區(qū)間范圍的拘束進行返回 -
zremrangebyrank: 只刪除索引1 -
zremrangebyscore: 刪除指定序列號 -
zrank zset1 three: 升序排序后再找到索引值返回 -
zrevrank zset1 tow: 降序排序后再找到索引值返回 -
zrangebyscore zset1 2 3 withscores: 找到指定區(qū)間范圍的數(shù)據(jù)盡興返回 -
zcard zset: 返回集合里所有的元素個數(shù) -
zcount zset1 1 4: 返回集合中給定區(qū)間中的數(shù)量 -
zremrangebyrank zset1 0 1:刪除索引從0到1的元素 - [x]
zremrangebyscore zset1 5 5: 刪除指定序號
Redis 高級命令
1. Redis高級命令及特性
-
keys *: 返回滿足的所有鍵(可以模糊匹配) -
exists key: 是否存在指定的key -
expire name 5: 設(shè)置過期時間 -
persist name: 取消過期時間 -
move name 1: 將當前數(shù)據(jù)庫中的key轉(zhuǎn)移到其他數(shù)據(jù)庫中 -
randomkey: 隨機返回數(shù)據(jù)庫的一個key -
rename: 重命名key -
echo: 打印命令 -
dbsize: 查看數(shù)據(jù)庫的key數(shù)量 -
info: 獲取數(shù)據(jù)庫的信息 -
config get: 實時存儲收到的請求(返回相關(guān)的配置信息-
config get *: 返回所有配置(其實就是redis.config的縮影)
-
-
flushdb: 清空當前數(shù)據(jù)庫 -
flushall: 清空所有數(shù)據(jù)庫
redis 分為16個數(shù)據(jù)庫,單只是邏輯上的概念,不是物理上的劃分
2. Redis 的安全性
因為Redis的速度相當快,一個外部用戶1秒內(nèi)可以進行15w次的密碼嘗試,這意味著需要設(shè)定非常強大的密碼來防止暴力破解。
vi編輯redis.conf文件,找到下面進行保存修改
#requirepass foobared
requirepass ****
重啟服務(wù)器pkill redis-server,再次進入keys *,會發(fā)型沒有權(quán)限進行查詢(erro)NOAUTH Authentication required。輸入密碼則能成功進入auth bhz。
每次進入的時候都需要輸入密碼,有種簡單的方式直接登錄授權(quán):#/usr/local/redis/bin/redis-cli -a bhz
3. 主從復(fù)制
主從復(fù)制
- Master可以擁有多個slave(層服務(wù)器)
- 多個slave可以連接同一個master外,還可以連接到其他slave
- 主從復(fù)制不會阻塞master,在同步時master可以繼續(xù)處理client請求
- 提供系統(tǒng)的伸縮性
主從復(fù)制過程 - slave與master建立連接,發(fā)送sync同步命令
- master會開啟一個后臺進程,將數(shù)據(jù)庫快照保存到文件中,同時master主進程會開始收集新的命令并緩存。
- 后臺完成保存后,就將文件發(fā)送給slave
- slave將此文件保存到硬盤上
主從復(fù)制配置 - clone 服務(wù)器之后修改 slave 的 IP 地址
- 修改配置文件:
/usr/local/redis/etc/redis.conf- 第一步,
slaveof<masterip><mastport> - 第二部,
masterauth<master-password>
使用info查看 role 角色即可知道是主服務(wù)或從服務(wù)
- 第一步,
克隆服務(wù)器
- 關(guān)掉當前的虛擬機
- VMware 在當前服務(wù)器上右鍵『管理』--『克隆』-- 『下一步,下一步』--『創(chuàng)建完整克隆』
- 克隆出的新服務(wù)的『網(wǎng)絡(luò)適配器』--右邊的『高級』--『確定』
設(shè)置IP
# ifconfig eth0 192.168.149.129 netmask 255.255.255.0
其他方式資料參考
- 更新時間:2018.01.29