Redis 基礎(chǔ) 一

本文主要介紹了 Redis 的簡介、安裝、常用命令和基礎(chǔ)類型。


簡介和安裝

1. NoSQL 簡介

NoSQL,泛指非關(guān)系型數(shù)據(jù)庫,NoSQL數(shù)據(jù)庫分四類

  1. 鍵值(key-value)存儲數(shù)據(jù)庫,這一類數(shù)據(jù)庫會使用一個哈希表,這個表中一個特定的鍵和一個指針指向特定的數(shù)據(jù),如Redis,Voldmort,Oracle BDB
  2. 列存儲數(shù)據(jù)庫,通常用來因?qū)Ψ植际酱鎯Φ暮A吭娋?,鍵仍然存在,但是它們的特點是指向多個列。如HBASE,Riak。
  3. 文檔型數(shù)據(jù)庫,數(shù)據(jù)模型是版本化的文檔,半結(jié)構(gòu)化的文檔以特定的格式存儲,比如JSON。文檔型數(shù)據(jù)庫可以看做是鍵值數(shù)據(jù)庫的升級版,允許之間嵌套鍵值。而且文檔數(shù)據(jù)庫比鍵值數(shù)據(jù)庫的查詢效率更高。如:CouchDB,MongoDB。
  4. 圖形數(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ù)庫的特點

  1. 數(shù)據(jù)模型比較簡單
  2. 需要靈活性更強的IT系統(tǒng)
  3. 對數(shù)據(jù)庫性能要求較高
  4. 不需要高度的數(shù)據(jù)一致性
  5. 對于給定的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)容解決方案

  1. 主從形式: 普通的一個主節(jié)點,多個從節(jié)點。當主節(jié)點掛掉的話,整個集群掛掉。
  2. 哨兵形式(redis 2.x):在主從的基礎(chǔ)上增加一個哨兵節(jié)點,來監(jiān)視主從節(jié)點的狀態(tài)。當主節(jié)點掛掉的時候,在從節(jié)點里通過選舉方式選擇一個從節(jié)點來當主節(jié)點。當主節(jié)點修復(fù),會默認變成從節(jié)點。
  3. 集群模式(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)

下載地址

安裝步驟

  1. 首先安裝 gcc,把下載好的redis-3.0.0-rc2.tar.gz放到 Linux /usr/local文件夾下;
  2. 進行解壓 tar -zxvf redis-3.0.0-rc2.tar.gz
  3. 進入到 redis-3.0.0目錄下,進行編譯 make
  4. 進入到src下進行安裝 make install ,驗證(查看 src 目錄下,有redis-server、redis-cli即可);
  5. 建立兩個文件夾存放 redis 命令和配置文件。
    • mkdir -p /usr/local/redis/etc
    • mkdir -p /usr/local/redis/bin
  6. redis-3.0.0下的redis.conf移動到/usr/local/redis/etc下。
    • cp redis.conf /usr/local/redis/etc
  7. 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
  8. 啟動時并制定配置文件=: ./redis-server /usr/local/redis/etc/redis.conf。(注意使用后臺啟動,所以修改redis.conf里的9 daemonize 改為yes)
  9. 驗證是否啟動成功
    • 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

安裝命令補充

  1. linux yum rz安裝(使可以上傳下載文件): sudo yum install lrzsz -y
  2. 上傳文件 rz(sc: 下載文件)
  3. gcc 安裝: sudo yum install gcc-c++
  4. 進入redis加壓后的文件夾,執(zhí)行make,報錯的話執(zhí)行make MALLOC=libc
  5. 啟動redis服務(wù)器:/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf;啟動客戶端/usr/local/redis/bin/redis-cli
  6. 格式解壓
.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 v2
    • mget k1 k2
  • 一次性設(shè)置和取值 getset 方法
    • getset key value
  • incrdecr方法: 對某一值進行遞增和遞減incr int_a
  • incrbydecrby方法: 對某個值進行指定長度的遞增和遞減
    • 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的值,刪除第一個值
  • 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ù)制

  1. Master可以擁有多個slave(層服務(wù)器)
  2. 多個slave可以連接同一個master外,還可以連接到其他slave
  3. 主從復(fù)制不會阻塞master,在同步時master可以繼續(xù)處理client請求
  4. 提供系統(tǒng)的伸縮性
    主從復(fù)制過程
  5. slave與master建立連接,發(fā)送sync同步命令
  6. master會開啟一個后臺進程,將數(shù)據(jù)庫快照保存到文件中,同時master主進程會開始收集新的命令并緩存。
  7. 后臺完成保存后,就將文件發(fā)送給slave
  8. slave將此文件保存到硬盤上
    主從復(fù)制配置
  9. clone 服務(wù)器之后修改 slave 的 IP 地址
  10. 修改配置文件:/usr/local/redis/etc/redis.conf
    • 第一步,slaveof<masterip><mastport>
    • 第二部,masterauth<master-password>
      使用info查看 role 角色即可知道是主服務(wù)或從服務(wù)

克隆服務(wù)器

  1. 關(guān)掉當前的虛擬機
  2. VMware 在當前服務(wù)器上右鍵『管理』--『克隆』-- 『下一步,下一步』--『創(chuàng)建完整克隆』
  3. 克隆出的新服務(wù)的『網(wǎng)絡(luò)適配器』--右邊的『高級』--『確定』

設(shè)置IP

# ifconfig eth0  192.168.149.129 netmask 255.255.255.0

其他方式資料參考


  • 更新時間:2018.01.29
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • NOSQL類型簡介鍵值對:會使用到一個哈希表,表中有一個特定的鍵和一個指針指向特定的數(shù)據(jù),如redis,volde...
    MicoCube閱讀 4,151評論 2 27
  • 1 Redis介紹1.1 什么是NoSql為了解決高并發(fā)、高可擴展、高可用、大數(shù)據(jù)存儲問題而產(chǎn)生的數(shù)據(jù)庫解決方...
    克魯?shù)吕?/span>閱讀 5,708評論 0 36
  • redis是一個以key-value存儲的非關(guān)系型數(shù)據(jù)庫。有五種數(shù)據(jù)類型,string、hashes、list、s...
    林ze宏閱讀 1,101評論 0 0
  • 天地之子具茨山, 世人祭祖如祭天。 炎黃有幸統(tǒng)華夏, 大禹治水九州連。 中華龍興五千年, 具茨山頂有偉篇。 禹州代...
    wxc天馬行空閱讀 279評論 0 0
  • 單純的字面意思是“簡單純一,不復(fù)雜”,因為暗含著人類渴望的安全感,因而數(shù)千年來被當作褒義詞。以至當閱男人無數(shù)的蒼井...
    有間書格閱讀 615評論 0 0

友情鏈接更多精彩內(nèi)容