初識 Redis
《 Redis 開發(fā)與運維》的學(xué)習(xí)筆記眨唬,希望大家多多指導(dǎo)猎贴。
什么是 Redis
- Redis 的全稱是 Remote Dictionary Server, 遠(yuǎn)程字典服務(wù)器第队。
- Redis是一個開源的使用ANSI C 語言編寫冀惭、支持網(wǎng)絡(luò)轩勘、可基于內(nèi)存亦可持久化的日志型栈雳、Key-Value數(shù)據(jù)庫,并提供多種語言的API蝉娜,是一種 NoSQL 數(shù)據(jù)庫唱较。
- 相關(guān)網(wǎng)站
Redis 的特點
-
- 速度快
- 為什么快 ?
- Redis 的所有數(shù)據(jù)都是存放在內(nèi)存中的(最主要的原因)
- Redis 是用 C 語言實現(xiàn)的, 一般來說 C 語言實現(xiàn)的程序“距離”操作系統(tǒng)更近召川,執(zhí)行速度相對會更快
- Redis 使用了單線程架構(gòu)南缓,預(yù)防了多線程可能產(chǎn)生的競爭問題
- Redis 源代碼優(yōu)良,集性能和優(yōu)雅于一身
- 基于鍵值對的數(shù)據(jù)結(jié)構(gòu)服務(wù)器
-
- 豐富的功能
- 5 種數(shù)據(jù)結(jié)構(gòu)
- 字符串
- Bitmaps
- HyperLogLog
- GEO , 地理信息定位 ( 3.2 版本 )
- 哈希
- 列表
- 集合
- 有序集合
- 提供了鍵過期功能荧呐,可以用來實現(xiàn)緩存汉形。
- 提供了發(fā)布訂閱功能纸镊,可以用來實現(xiàn)消息系統(tǒng)。
- 支持 Lua 腳本功能概疆,可以利用 Lua 創(chuàng)造出新的 Redis 命令逗威。
- 提供了簡單的事務(wù)功能,能在一定程度上保證事務(wù)特性岔冀。
- 提供了流水線(Pipeline)功能庵楷,這樣客戶端能將一批命令一次性傳到 Redis,減少了網(wǎng)絡(luò)的開銷楣颠。
-
- 簡單穩(wěn)定
- 簡單
- Redis 的源碼很少
- Redis 使用單線程模型
- Redis 不需要依賴于操作系統(tǒng)中的類庫
-
- 客戶端語言多
- Redis 提供了簡單的 TCP 通信協(xié)議
-
- 持久化
- RDB
- AOF
-
- 主從復(fù)制
- Redis 提供了復(fù)制功能尽纽,實現(xiàn)了多個相同數(shù)據(jù)的 Redis 副本,復(fù)制功能是分布式 Redis 的基礎(chǔ)
-
- 高可用和分布式
- 2.8 版本童漩,高可用實現(xiàn) Redis Sentinel,它能夠保證 Redis 節(jié)點的故障發(fā)現(xiàn)和故障自動轉(zhuǎn)移
- 3.0 版本弄贿, 分布式實現(xiàn) Redis Cluster, 它是 Redis 真正的分布式實現(xiàn),提供了高可用矫膨、讀寫和容量的擴展性差凹。
Redis 使用場景
Redis 可以做什么
- 緩存
-
- 排行榜系統(tǒng)
- 列表和有序集合數(shù)據(jù)結(jié)構(gòu)
- 3.計數(shù)器應(yīng)用
- 視頻播放數(shù)
- 4.社交網(wǎng)絡(luò)
- 贊/踩,粉絲侧馅,共同好友/喜好危尿, 推送,下拉刷新
-
- 消息隊列系統(tǒng)
- Redis 提供了發(fā)布訂閱通能和阻塞隊列的功能馁痴,基本可以滿足簡單的消息隊列功能
Redis 不可以做什么
- 數(shù)據(jù)規(guī)模
- 基于內(nèi)存谊娇,不適合大規(guī)模數(shù)據(jù),經(jīng)濟(jì)成本非常高罗晕;適用于小規(guī)模數(shù)據(jù)
- 數(shù)據(jù)冷熱
- 熱數(shù)據(jù)
- 指需要頻繁操作的數(shù)據(jù)
- 冷數(shù)據(jù)
- 熱數(shù)據(jù)適合放到 Redis 中加速讀寫济欢,冷數(shù)據(jù)不適合
- 熱數(shù)據(jù)
用好 Redis 的建議
- 切勿當(dāng)作黑盒使用,開發(fā)與運維同樣重要
- 閱讀源碼
Redis 的基礎(chǔ)操作
安裝
- Linux 系統(tǒng)
# 下載 Redis 制定版本的源碼壓縮包到當(dāng)前目錄
wget http://download.redis.io/releases/redis-3.0.7.tar.gz
# 解壓縮
tar xzf redis-3.0.7.tar.gz
# 建立 redis 目錄的軟連接小渊,為了不把 redis 目錄固定到指定版本上法褥,利于未來升級
ln -s redis-3.0.7 redis
cd redis
# 將相關(guān)運行文件放到 /usr/local/bin/ 下,編譯之前確保操作系統(tǒng)已經(jīng)安裝gcc
make
# 安裝
make install
# 安裝結(jié)束后酬屉,驗證
redis-cli -v
- Windows 下
配置半等、啟動、操作呐萨、關(guān)閉 Redis
-
src 和 /usr/local/bin 目錄下可執(zhí)行文件說明
可執(zhí)行文件 作用 redis-server 啟動 Redis redis-cli Redis 命令行客戶端 redis-benchmark Redis 基準(zhǔn)測試工具 redis-check-aof Redis AOF 持久化文件檢測和修復(fù)工具 redis-check-dump Redis RDB 持久化文件檢測和修復(fù)工具 redis-sentinel 啟動 Redis Sentinel -
啟動 Redis
-
默認(rèn)配置
# 按照默認(rèn)配置啟動 redis-server
-
運行啟動
redis server --configName1 configValue --configName2 configValue2 # 例如, 以 6666 作為端口啟動 Redis redis-server --port 6666
-
配置文件啟動
-
默認(rèn)配置文件位置: redis 文件夾下 redis.conf
配置名 配置說明 port 端口 logfile 日志文件 dir Redis 工作目錄(粗放持久化文件和日志文件) daemonize 是否以守護(hù)進(jìn)程的方式啟動 Redis (后臺啟動) redis-server /opt/redis/redis.conf
-
-
Redis 命令行客戶端
# 兩種連接方式
## 第一種 redis-cli -h {host} -p {port}
redis-cli -h 127.0.0.1 -p 6379
# 取值
get hello
## 第二種 redis-cli -h ip{host} -p {port} {command}
redis-cli -h 127.0.0.1 -p 6379 get hello
- 停止 Redis 服務(wù)
# 關(guān)閉過程: 斷開與客戶端的連接杀饵、持久化文件生成
`redis-cli shutdown
# 帶參數(shù)關(guān)閉
## 關(guān)閉前不生成持久化文件
redis-cli shutdown nosave
## 關(guān)閉前生成持久化文件
redis-cli shutdown save
# 使用殺死進(jìn)程的方法關(guān)閉
kill redis進(jìn)程號
# 注意:不能粗暴的使用 kill -9 強制殺死進(jìn)程,這樣不會持久化操作垛吗,同時有可能不能正常關(guān)閉和丟失數(shù)據(jù)
- 卸載 Redis
- 關(guān)閉 Redis 服務(wù)
- 刪除相關(guān)文件或文件夾
- 安裝目錄文件夾
- /usr/local/bin 下的啟動文件
設(shè)置 Redis 開機自啟動 ( Linux )
-
init.d 方式 ( CentOS 6 之前版本凹髓,包括 CentOS6 )
- 基本原理
- 系統(tǒng)開機啟動時會去加載 /etc/init.d/ 下面的腳本,通常而言每個腳本文件會自定義實現(xiàn)程序的啟動怯屉;若想將新的程序開機自啟動蔚舀,只需在該目錄下添加一個自定義啟動程序的腳本,然后設(shè)置相應(yīng)規(guī)則即可锨络。
- 步驟
-
編寫自啟動腳本 redis
# chkconfig: 2345 10 90 # description: Start and Stop redis PATH=/usr/local/bin:/sbin:/usr/bin:/bin REDISPORT=6379 #實際環(huán)境而定 EXEC=/usr/local/bin/redis-server #實際環(huán)境而定 REDIS_CLI=/usr/local/bin/redis-cli #實際環(huán)境而定 PIDFILE=/var/run/redis.pid CONF="/opt/redis/redis.conf" #實際環(huán)境而定 case "$1" in start) if [ -f $PIDFILE ] then echo "$PIDFILE exists, process is already running or crashed." else echo "Starting Redis server..." $EXEC $CONF fi if [ "$?"="0" ] then echo "Redis is running..." fi ;; stop) if [ ! -f $PIDFILE ] then echo "$PIDFILE exists, process is not running." else PID=$(cat $PIDFILE) echo "Stopping..." $REDIS_CLI -p $REDISPORT SHUTDOWN while [ -x $PIDFILE ] do echo "Waiting for Redis to shutdown..." sleep 1 done echo "Redis stopped" fi ;; restart|force-reload) ${0} stop ${0} start ;; *) echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2 exit 1 esac
-
設(shè)置權(quán)限并測試
# 設(shè)置可執(zhí)行權(quán)限 chmod 755 redis # 啟動測試 /etc/init.d/redis start
-
設(shè)置開機自啟動并測試
# 設(shè)置開機自啟動 chkconfig redis on # 關(guān)機重啟并驗證 reboot redis-cli
-
- 注意
- redis 服務(wù)名稱可以自定義
- redis_6666, redis_666.service
- redis 服務(wù)名稱可以自定義
- 基本原理
-
systemctl 方式 ( CentOS7 )
- 基本原理
- 使用 systemctl 進(jìn)行服務(wù)管理
- 步驟
- 創(chuàng)建systemctl 服務(wù)
# 在/lib/systemd/system 目錄下創(chuàng)建一個腳本文件redis.service # 腳本內(nèi)容 # 基本信息 [Unit] ## 描述信息 Description=Redis ## 在哪個服務(wù)之后啟動 After=network.target # 服務(wù)信息 [Service] Type=forking ## 啟動服務(wù)的命令 ExecStart=/usr/local/bin/redis-server /opt/redis/redis.conf ## 重啟服務(wù)的命令 ExecReload=/usr/local/bin/redis-server -s reload ## 停止服務(wù)的命令 ExecStop=/usr/local/bin/redis-server -s stop PrivateTmp=true # 安裝相關(guān)信息 [Install] ## 以何種方式啟動赌躺,當(dāng)系統(tǒng)以多用戶方式(默認(rèn)的運行級別)啟動時,這個服務(wù)需要被自動運行 WantedBy=multi-user.target
- 刷新配置并設(shè)置為開機啟用
# 刷新配置 systemctl daemon-reload # 啟動服務(wù) systemctl start redis.service # 重新啟動 systemctl restart redis.service # 停止服務(wù) systemctl stop redis.service # 開機啟用 systemctl enable redis.service # 禁止開機啟動 systemctl disable redis.service # 當(dāng)前狀態(tài) systemctl status redis.service
- 創(chuàng)建systemctl 服務(wù)
- 基本原理