【第二章】redis 簡(jiǎn)介&部署

redis 基礎(chǔ)

Redis官網(wǎng)

Redis和 Memcached是\color{blue}{非關(guān)系型數(shù)據(jù)庫(kù)} 也稱(chēng)為 \color{blue}{NoSQL數(shù)據(jù)庫(kù)}。相對(duì)的,MySQL、Mariadb、SQL Server、PostgreSQL、Oracle 數(shù)據(jù)庫(kù)屬于關(guān)系型數(shù)據(jù)(RDBMS, Relational Database Management System)

1. redis 簡(jiǎn)介

Redis(Remote Dictionary Server) 于2009 年發(fā)布, 開(kāi)發(fā)者 Salvatore Sanfilippo 是意大利開(kāi)發(fā)者, 他本想為自己的公司開(kāi)發(fā)一個(gè)用于替換 MySQL 的產(chǎn)品, 但是沒(méi)有想到他把 Redis 開(kāi)源后大受歡迎,短短幾年,Redis 就有了很大的用戶(hù)群體,目前國(guó)內(nèi)外使用的公司有知乎網(wǎng)、新浪微博、 GitHub 等。

Redis是一個(gè)開(kāi)源的、遵循 BSD協(xié)議的基于內(nèi)存的、而且目前比較流行的鍵值型數(shù)據(jù)庫(kù)(key-value database),是一個(gè)非關(guān)系型數(shù)據(jù)庫(kù)。redis 提供將內(nèi)存通過(guò)網(wǎng)絡(luò)遠(yuǎn)程共享的一種服務(wù)。

提供類(lèi)似功能的還有memcache,但相比 memcache, redis 還提供了易擴(kuò)展、高性能、 具備數(shù)據(jù)持久性等功能。Redis 在高并發(fā)、低延遲環(huán)境要求比較高的環(huán)境使用量非常廣泛, 目前 redis 在 DB-Engine 月排行榜 中一直比較靠前,而且一直是鍵值型存儲(chǔ)類(lèi)的首位。

DB-Engine 月排行榜

2. redis 對(duì)比 memcached

支持?jǐn)?shù)據(jù)的持久化:可以將內(nèi)存中的數(shù)據(jù)保持在磁盤(pán)中,重啟 redis 服務(wù)或者服務(wù)器之后可以從備份文件中恢復(fù)數(shù)據(jù)到內(nèi)存繼續(xù)使用。

支持更多的數(shù)據(jù)類(lèi)型:支持 string(字符串)、 hash(哈希數(shù)據(jù))、 list(列表)、 set(集合)、 zet(有序集合)

支持?jǐn)?shù)據(jù)的備份:可以實(shí)現(xiàn)類(lèi)似于數(shù)據(jù)的 master-slave 模式的數(shù)據(jù)備份,另外也支持使用快照+AOF。

支持更大的 value 數(shù)據(jù): memcache 單個(gè) key value 最大只支持 1MB,而 redis 最大支持 512MB。

Redis 是單線(xiàn)程, 而 memcache 是多線(xiàn)程, 所以單機(jī)情況下沒(méi)有 memcache 并發(fā)高, 但 redis 支持分布式集群以實(shí)現(xiàn)更高的并發(fā), 單 Redis 實(shí)例可以實(shí)現(xiàn)數(shù)萬(wàn)并發(fā)。

支持集群橫向擴(kuò)展:基于 redis cluster 的橫向擴(kuò)展,可以實(shí)現(xiàn)分布式集群,大幅提升性能和數(shù)據(jù)安全性。

都是基于C 語(yǔ)言開(kāi)發(fā)。

3. redis 典型應(yīng)用場(chǎng)景

Session 共享:常見(jiàn)于 web 集群中的 Tomcat 或者 PHP 中多 web 服務(wù)器 session 共享

消息隊(duì)列: ELK 的日志緩存、 部分業(yè)務(wù)的訂閱發(fā)布系統(tǒng)

計(jì)數(shù)器: 訪(fǎng)問(wèn)排行榜、商品瀏覽數(shù)等和次數(shù)相關(guān)的數(shù)值統(tǒng)計(jì)場(chǎng)景

緩存: 數(shù)據(jù)查詢(xún)、 電商網(wǎng)站商品信息、 新聞內(nèi)容

微博/微信社交場(chǎng)合: 共同好友、 點(diǎn)贊評(píng)論等

Redis 安裝及使用

官方下載地址: http://download.redis.io/releases/

1. yum 安裝 redis

在 centos 系統(tǒng)上需要安裝 epel 源。

1.1 查看 yum 倉(cāng)庫(kù) redis 版本

查看 yum 倉(cāng)庫(kù) redis 版本

1.2 安裝 redis

[root@node1 ~]# yum install redis -y
[root@node1 ~]# systemctl start redis && systemctl enable redis
[root@node1 ~]# redis-cli 
127.0.0.1:6379> info
# Server
redis_version:3.2.12
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:7897e7d0e13773f
redis_mode:standalone
os:Linux 3.10.0-514.el7.x86_64 x86_64
arch_bits:64

2. 編譯安裝 redis

下載當(dāng)前最新 release 版本 redis 源碼包:http://download.redis.io/releases/

redis 源碼包

2.1 編譯安裝命令

官方的安裝命令:https://redis.io/download

[root@node1 ~]# cd /usr/local/src/
[root@node1 src]# tar zxvf redis-5.0.8.tar.gz 
[root@node1 src]# cd redis-5.0.8/
[root@node1 redis-5.0.8]# make PREFIX=/apps/redis install
[root@node1 redis-5.0.8]# ll /apps/redis/
total 0
drwxr-xr-x. 2 root root 134 Apr  9 23:37 bin
[root@node1 redis-5.0.8]# mkdir -pv /apps/redis/etc
[root@node1 redis-5.0.8]# cp redis.conf /apps/redis/etc/

2.2 前臺(tái)啟動(dòng) redis

[root@node1 ~]# /apps/redis/bin/redis-server /apps/redis/etc/redis.conf 
image

2.3 解決當(dāng)前的警告提示

2.3.1 tcp-backlog

# 告警詳情:
34395:M 09 Apr 2020 23:41:55.542 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

backlog 參數(shù)控制的是三次握手的時(shí)候 server 端收到 client ack 確認(rèn)號(hào)之后的隊(duì)列值。

The backlog argument defines the maximum length to which the queue of pending connections for sockfd may grow. If a connection request arrives when the queue is full, the client may receive an error with an indication of ECONNREFUSED or, if the underlying protocol supports retransmission, the reque be ignored so that a later reattempt at connection succeeds.

解決辦法:

# 配置kernel參數(shù)net.core.somaxconn

# 命令行配置(立刻生效,但重啟后失效)
# 查看net.core.somaxconn的值
[root@node1 ~]# sysctl -a | grep net.core.somaxconn
# 修改參數(shù)值的語(yǔ)法 
[root@node1 ~]# sysctl -w net.core.somaxconn=512
net.core.somaxconn = 512

# 修改配置文件(永久生效)
[root@node1 ~]# grep -v '#' /etc/sysctl.conf
[root@node1 ~]# vim /etc/sysctl.conf
[root@node1 ~]# grep -v '#' /etc/sysctl.conf      
net.core.somaxconn=512
[root@node1 ~]# sysctl -p
net.core.somaxconn = 512

2.3.2 vm.overcommit_memory

# 告警詳情:
43659:M 10 Apr 2020 14:10:49.627 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

0:表示內(nèi)核將檢查是否有足夠的可用內(nèi)存供應(yīng)用進(jìn)程使用;如果有足夠的可用內(nèi)存,內(nèi)存申請(qǐng)?jiān)试S;否則,內(nèi)存申請(qǐng)失敗,并把錯(cuò)誤返回給應(yīng)用進(jìn)程。

1:表示內(nèi)核允許分配所有的物理內(nèi)存,而不管當(dāng)前的內(nèi)存狀態(tài)如何。

2:表示內(nèi)核允許分配超過(guò)所有物理內(nèi)存和交換空間總和的內(nèi)存。

解決辦法:

# 配置kernel參數(shù)vm.overcommit_memory 

# 命令行配置(立刻生效,但重啟后失效)
# 查看vm.overcommit_memory 的值
[root@node1 ~]# sysctl -a | grep vm.overcommit_memory 
# 修改參數(shù)值的語(yǔ)法 
[root@node1 ~]# sysctl -w vm.overcommit_memory=1
vm.overcommit_memory = 1

# 修改配置文件(永久生效)
[root@node1 ~]# grep -v '#' /etc/sysctl.conf
[root@node1 ~]# vim /etc/sysctl.conf
[root@node1 ~]# grep -v '#' /etc/sysctl.conf      
vm.overcommit_memory=1
[root@node1 ~]# sysctl -p
vm.overcommit_memory=1

2.3.3 transparent hugepage

開(kāi)啟大頁(yè)內(nèi)存動(dòng)態(tài)分配,需要關(guān)閉讓 redis 負(fù)責(zé)內(nèi)存管理。

[root@node1 ~]# echo never > /sys/kernel/mm/transparent_hugepage/enabled

2.3.4 再次啟動(dòng) redis

無(wú)告警

2.4:創(chuàng)建 redis 服務(wù)啟動(dòng)腳本:

[root@node1 redis]# vim /usr/lib/systemd/system/redis.service
[Unit]
Description=Redis persistent key-value database
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
#ExecStart=/usr/bin/redis-server /etc/redis.conf --supervised systemd
ExecStart=/apps/redis/bin/redis-server /apps/redis/etc/redis.conf --supervised systemd
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
Type=notify
User=root
Group=root
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target

2.5 創(chuàng)建 redis 用戶(hù)和數(shù)據(jù)目錄

[root@node1 redis]# groupadd -g 1000 redis && useradd -u 1000 -g 1000 redis -s /usr/sbin/nologin
[root@node1 redis]# mkdir -pv /apps/redis/{etc,logs,data,run}
[root@node1 redis]# chown redis.redis -R /apps/redis/

2.2.6 驗(yàn)證 redis 啟動(dòng)

image

2.7 使用客戶(hù)端連接 redis

/apps/redis/bin/redis-cli -h IP/HOSTNAME -p PORT -a PASSWORD

2.8 創(chuàng)建命令軟連接

ln -sv /apps/redis/bin/redis-* /usr/bin/

2.9 編譯安裝后的命令

[root@node1 redis]# ll /apps/redis/bin/
total 32768
-rwxr-xr-x. 1 redis redis 4365480 Apr 10 14:36 redis-benchmark #redis 性能測(cè)試工具
-rwxr-xr-x. 1 redis redis 8124472 Apr 10 14:36 redis-check-aof #AOF 文件檢查工具
-rwxr-xr-x. 1 redis redis 8124472 Apr 10 14:36 redis-check-rdb #rdb 文件檢查工具
-rwxr-xr-x. 1 redis redis 4806592 Apr 10 14:36 redis-cli  #redis 客戶(hù)端工具
lrwxrwxrwx. 1 redis redis      12 Apr 10 14:36 redis-sentinel -> redis-server #哨兵,軟連接到server
-rwxr-xr-x. 1 redis redis 8124472 Apr 10 14:36 redis-server #redis 服務(wù)端

3. 連接到 Redis

主要分為運(yùn)維人員的連接和程序的連接

3.1 本機(jī)非密碼連接

 redis-cli

3.2 跨主機(jī)非密碼連接

redis-cli -h HOSTNAME/IP -p PORT

3.3 跨主機(jī)密碼連接

redis-cli -h HOSTNAME/IP -p PORT -a PASSWORD

3.4 python 連接方式

import redis
import time

pool = redis.ConnectionPool(host='<redis_bind_ip>', port=6379, password='')
r = redis.Redis(connection_pool=pool)
for i in range(100):
    r.set("k%d" % i, "v%d" % i)
    time.sleep(1)
    data = r.get("k%d" % i)
    print(data)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 1、memcache的概念? Memcache是一個(gè)高性能的分布式的內(nèi)存對(duì)象緩存系統(tǒng),通過(guò)在內(nèi)存里維護(hù)一個(gè)統(tǒng)一的巨...
    桖辶殤閱讀 2,361評(píng)論 2 12
  • NOSQL類(lèi)型簡(jiǎn)介鍵值對(duì):會(huì)使用到一個(gè)哈希表,表中有一個(gè)特定的鍵和一個(gè)指針指向特定的數(shù)據(jù),如redis,volde...
    MicoCube閱讀 4,166評(píng)論 2 27
  • 5/15/2017 7:06:35 PM 縱觀(guān)各大組件,配置文件占據(jù)極其重要的地位??膳渲没彩钱?dāng)下開(kāi)發(fā)的一流行趨...
    愛(ài)做夢(mèng)的胖子閱讀 4,541評(píng)論 0 8
  • Nosql概述 在介紹Redis之前,首先先要介紹Nosql的概念。 互聯(lián)網(wǎng)架構(gòu)發(fā)展 在90年代的時(shí)候,計(jì)算機(jī)訪(fǎng)問(wèn)...
    COKIDCC閱讀 759評(píng)論 0 1
  • Redis 配置文件示例 注意:想要讀取配置文件,Redis的第一個(gè)參數(shù)必須是文件的路徑 ./redis-serv...
    起個(gè)名忒難閱讀 1,360評(píng)論 0 1

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