01 redis基礎

一.什麼是redis

  • 1.開源分佈式kv數據庫
  • 2.C語言編寫,單線程運行
  • 3.支持數據類型分別是key、string、list、set、hash、zset
  • 4.提供多種語言API,常見的c/java/php/python/node.js/perl/swift等
  • 5.高性能,並提供持久化機制
  • 6.支持一致性hash集羣分佈,支持主從複製高可用方案

二.優勢

  • 1.高性能,寫8W/s,讀11W/s
  • 2.易用,數據類型比MC更多
  • 3.易擴展,支持lua腳本、集羣、高可用
  • 4.數據可靠及完整性,兩種持久化方式:rdb、aof,支持部分事務
  • 5.生產實踐多
  • 6.社區活躍,培訓多,在線文檔全

三.redis與MC對比樣例

3.1測試用例說明
  • 1.key範圍:2-100字節隨機生產
  • 2.value固定100字節
  • 3.初始數據分別爲0/500w/1500w
  • 4.分別測試insert、select
  • 5.每次測試併發50線程,每一個線程處理10w記錄
  • 6.redis開啓快照持久化,300s一次
  • 7.開啓redis虛擬內存功能
  • 8.7500w-8000w存量的數據內存約13G左右
3.2測試結論
類型 MC redis
相同的數據模型 保存的熱數據量比redis高,13G內存下能保存1億條數據 保存8000w條
相同的服務器環境寫性能 寫性能比redis高,約10W條每秒 約7W條每秒
相同的服務器環境讀性能 約10W條每秒 約8W條每秒
達到內存上限的處理 插入性能在臨界點有些抖動,而後將到約7W條每秒,以後性能跟臨界點以前同樣
達到內存上限的性能 讀性能並無變化 性能急劇降低,1100條每秒,以後受子進程dump數據競爭系統資源影響而很是不穩定性能急劇降低,以後受子進程dump數據和每秒產生大量頁面錯誤影響而持續降低
單個CPU百分比 內存上限臨界點約300%,其餘穩定在150%左右 內存上限臨界前90%左右,以後受子進程dump數據和每秒產生大量頁面錯誤影響,CPU使用率不高,甚至降到1%
CPU利用率 單實例 單線程運行,只能用一顆CPU,單主機多實例
內存佔用 都隨着寫入數據的增多而增大,達到內存上限後再也不變化 受子進程dump數據競爭而持續降低
頁面錯誤 純內存操做,不產生頁面錯誤 達到內存上限後,須要將數據轉儲虛擬內存,受子進程dump數據競爭系統資源影響產生大量頁面錯誤
IO操做 純內存操做 insert時,達到內存上線前沒有明顯IO讀操做,有明顯IO寫操做,由於快照,達到內存上線後,有明顯磁盤IO讀操做,寫操做反而不明顯

四.業務場景

4.1複雜數據結構及業務場景
  • 1.利用內存的高效,基於lua業務邏輯擴展,實現基於緩存的業務邏輯計算,好比商品實時價格
  • 2.利用redis事務機制,支撐複雜的業務,保障業務完整性,如扣除庫存以及下訂單
  • 3.取罪行N個數據的操做,好比最新評論,基於list,取先後末尾
  • 4.排行榜應用,取top n操做,基於sorted set中的score排序
  • 5.查找過時數據,基於sorted set中的score,把score的值設置爲時間
  • 6.計數器,高性能,具有原子性
  • 7.uniq操做,獲取某段時間全部數據排重值
  • 8.pub/sub構建實時消息系統
  • 9.構建隊列系統
4.2 宕機時間短
  • 1.基於快照、aof、主從複製提供高可用和數據快速還原
  • 2.業務越複雜,丟失的數據恢復越困難

五.安裝redis4.0,以服務方式進行安裝部署

  • 1)下載解壓,不須要編譯
wget http://download.redis.io/releases/redis-4.0.8.tar.gz
tar -zxvf redis-4.0.8.tar.gz
cd redis-4.0.8
make && make install
  • 2)結束以後在目錄/usr/local/bin會生成以下文件
-rwxr-xr-x. 1 root root 5.5M Mar 29 10:55 redis-server
-rwxr-xr-x. 1 root root 2.4M Mar 29 10:55 redis-benchmark
-rwxr-xr-x. 1 root root 2.5M Mar 29 10:55 redis-cli
-rwxr-xr-x. 1 root root 5.5M Mar 29 10:55 redis-check-rdb
-rwxr-xr-x. 1 root root 5.5M Mar 29 10:55 redis-check-aof
lrwxrwxrwx. 1 root root   12 Mar 29 10:55 redis-sentinel -> redis-server

也能夠安裝到指定目錄make install PREFIX=/usr/local/redisphp

  • 3)從源碼目錄拷貝單獨的配置文件
mkdir -p /usr/local/redis/etc
cp /root/redis-4.0.8/*.conf /usr/local/redis/etc
  • 4)配置鏈接地址和密碼
vi /usr/local/redis/etc/redis.conf
#bind 127.0.0.1
requirepass foobared
daemonize yes
#protected-mode yes
dir /usr/local/redis/work
#slaveof 172.16.3.140 6379
# master不須要設置slaveof,只有slave才須要
  • 5)啓動腳本
cp /root/redis-4.0.8/utils/redis_init_script /etc/init.d/redis
touch /etc/init.d/redis
chmod u+x /etc/init.d/redis
vi /etc/init.d/redis
#!/bin/sh
#
# redis        Startup script for Redis Server
#
# chkconfig: - 80 12
# description: Redis is an open source, advanced key-value store.
#
# processname: redis-server
# config: /etc/redis.conf
# pidfile: /var/run/redis.pid
source /etc/init.d/functions
BIN="/usr/local/redis/bin"
CONFIG="/usr/local/redis/etc/redis.conf"
PIDFILE="/var/run/redis.pid"
### Read configuration
[ -r "$SYSCONFIG" ] && source "$SYSCONFIG"
RETVAL=0
prog="redis-server"
desc="Redis Server"
start() {
        if [ -e $PIDFILE ];then
             echo "$desc already running...."
             exit 1
        fi
        echo -n $"Starting $desc: "
        daemon $BIN/$prog $CONFIG
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
        return $RETVAL
}
stop() {
        echo -n $"Stop $desc: "
        killproc $prog
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog $PIDFILE
        return $RETVAL
}
restart() {
        stop
        start
}
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        restart
        ;;
  condrestart)
        [ -e /var/lock/subsys/$prog ] && restart
        RETVAL=$?
        ;;
  status)
        status $prog
        RETVAL=$?
        ;;
   *)
        echo $"Usage: $0 {start|stop|restart|condrestart|status}"
        RETVAL=1
esac
exit $RETVAL
  • 6)啓動驗證
/etc/init.d/redis start
[root@haproxy02 init.d]# redis-cli -h 172.16.3.141 -p 6379 -a foobared
172.16.3.141:6379>

六.啓動參數

6.1啓動
  • 1.默認啓動
src/redis-server
# 默認前臺啓動
# 默認不適用配置文件
  • 2.後臺啓動
src/redis-server &
# 不要用
參數文件 daemonize yes
  • 3.啓動參數
root@haproxy02 bin]# ./redis-server --help
Usage: ./redis-server [/path/to/redis.conf] [options]
       ./redis-server - (read config from stdin)
       ./redis-server -v or --version
       ./redis-server -h or --help
       ./redis-server --test-memory <megabytes>
#
Examples:
       ./redis-server (run the server with default conf)
       ./redis-server /etc/redis/6379.conf
       ./redis-server --port 7777
       ./redis-server --port 7777 --slaveof 127.0.0.1 8888
       ./redis-server /etc/myredis.conf --loglevel verbose
#
Sentinel mode:
       ./redis-server /etc/sentinel.conf --sentinel
6.2經常使用參數說明
  • daemonize:後臺運行,默認no
  • pidfile:pid文件位置,默認/run/redis.pid
  • port:監聽端口號,默認6379
  • bind 127.0.0.1,監聽網卡的IP,遠程被鏈接須要註釋掉
  • logfile:log文件位置,默認stdout,默認後臺模式會輸出到/dev/null
  • loglevel notice,日誌記錄級別,多到少:debug/verbose/notice/warning
6.3自啓動配置
  • 1.以端口命名參數文件
cp /root/redis-4.0.8/redis.conf /usr/local/redis/etc/redis_6379.conf
  • 2.複製到啓動腳本到/etc/init.d目錄下
[root@haproxy02 utils]# pwd
/root/redis-4.0.8/utils
[root@haproxy02 utils]# cat redis_init_script
#!/bin/sh
# chkconfig: 2345 90 10
# 增長項,linux啓動級別2345,啓動優先級90,關閉優先級10
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.
#
REDISPORT=6379
#EXEC=/usr/local/bin/redis-server
EXEC=/usr/local/redis/bin/redis-server
# 修改項
#CLIEXEC=/usr/local/bin/redis-cli
CLIEXEC=/usr/local/redis/bin/redis-cli
# 修改項
#
PIDFILE=/var/run/redis_${REDISPORT}.pid
# 配置與config文件裏的pidfile參數一致
CONF="/etc/redis/${REDISPORT}.conf"
# 修改項
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
        ;;
    stop)
        if [ ! -f $PIDFILE ]
        then
                echo "$PIDFILE does not exist, process is not running"
        else
                PID=$(cat $PIDFILE)
                echo "Stopping ..."
                $CLIEXEC -p $REDISPORT shutdown
                while [ -x /proc/${PID} ]
                do
                    echo "Waiting for Redis to shutdown ..."
                    sleep 1
                done
                echo "Redis stopped"
        fi
        ;;
    *)
        echo "Please use start or stop as first argument"
        ;;
esac
6.4客戶端命令
  • 1.默認鏈接本地6379端口
redis-cli
# 等於redis-cli -h 127.0.0.1 -p 6379
  • 2.加了密碼鏈接
redis-cli -h 127.0.0.1 -p 6379 -a foobared
相關文章
相關標籤/搜索