天天看點

Redis安裝 過期政策 記憶體淘汰政策

文章目錄

    • Redis安裝 過期政策 記憶體淘汰政策
      • Redis
        • Redis政策
        • Redis預設配置
        • Redis常用指令
        • 安裝過程
        • redis過期删除政策和記憶體淘汰政策
          • 過期政策
          • Redis過期政策
          • Redis淘汰政策
      • 部署LNMP+Redis

Redis安裝 過期政策 記憶體淘汰政策

Redis

Redis政策

Remote Dictionary Server 遠端字典伺服器

  • 是一款高性能的(Key/Values)分布式記憶體資料庫
  • 支援資料持久化(定期把記憶體裡資料存儲到硬碟)
  • 支援多種資料類型
  • 支援master-salve模式備份

Redis預設配置

配置 說明
端口 6379
主配置檔案 /etc/redis/6379.conf
日志檔案 /var/log/redis_6379.log
資料庫目錄 /var/lib/redis/6379
服務啟動程式 /usr/local/bin/redis-server
指令行連接配接指令 /usr/local/bin/redis-cli
管理服務腳本 /etc/init.d/redis_6379

Redis常用指令

指令 說明
set key名 key值 存儲一個key值
mset key名1 key值1 key名2 key值2… 存儲多個key值
get key名 擷取key名對應的key值
mget key名1 key名2… 擷取多個key值
select 資料庫編号0-15 切換庫 預設16個 配置檔案可改 無上限
keys * 顯示所有key名
keys a? 顯示指定key名
exists key名 測試key名是否存在
ttl key名 檢視key生存時間
type key名 檢視key類型
move key名 庫編号 移動Key到指定庫
expire key名 數字 設定Key有效時間
del key名 删除指定的key
flushall 删除記憶體裡所有key
flushdb 删除所在庫的所有key
save 儲存所有key到硬碟
shutdown 停止服務 可加nosave不儲存資料到硬碟

安裝過程

yum -y install gcc #源碼編譯
tar -zxf redis-4.0.8.tar.gz
cd redis-4.0.8/
make && make install
cd utils/  
./install_server.sh  #安裝腳本
....
Selected config:
Port           : 6379                   #端口号
Config file    : /etc/redis/6379.conf         #配置檔案目錄
Log file       : /var/log/redis_6379.log      #日志目錄
Data dir       : /var/lib/redis/6379          #資料庫目錄
Executable     : /usr/local/bin/redis-server  #啟動程式的目錄
Cli Executable : /usr/local/bin/redis-cli     #指令行的連接配接工具
Is this ok? Then press ENTER to go on or Ctrl-C to abort.  #回車完成配置
Copied /tmp/6379.conf => /etc/init.d/redis_6379    #服務啟動腳本
.....

/etc/ini.d/redis_6379 status
Redis is running (10561)

ss -nutlp | grep 6379  #檢視端口
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      10561/redis-server


redis-cli  #連接配接   -h 127.0.0.1 -a 123456 -p 6379
           

redis過期删除政策和記憶體淘汰政策

過期政策
  • 定時删除
    • 在設定key的過期時間的同時,為該key建立一個定時器,讓定時器在key的過期時間來臨時,對key進行删除
    • 優點:保證記憶體被盡快釋放
    • 缺點:若過期的key很多,删除這些key會占用很多的CPU時間
    • 缺點:若為每一個設定過期時間的key建立一個定時器(将會有大量的定時器産生),性能影響驗證
  • 惰性删除
    • 設定一個key的過期時間後,當我們需要這個key時,先檢查key是否過期,如果過期,就删除它并傳回null,如果沒過期就傳回該key
    • 優點:對CPU友好,我們隻會在使用該鍵時才會進行過期檢查。
    • 缺點:對記憶體不友好,如果一個Key已經過期,但是一直沒有使用,那麼該鍵就一直存在記憶體中,如果不使用,就永遠不會删除,可能造成記憶體洩漏
  • 定期删除
    • 每隔一段時間,我們就對一些key進行檢查,删除裡面過期的Key
    • 優點:可以通過限制删除操作的時長和頻率來減少删除操作對CPU的影響。另外定期删除,也能有效釋放過期鍵占用的記憶體
    • 缺點:難以确定删除操作執行的時長和頻率;如果執行的太頻繁,定期删除政策變得和定時删除政策一樣,對CPU會有很大負擔;如果執行的太少,會和惰性删除一個,過期Key占用的記憶體得不到及時釋放
Redis過期政策

Redis的過期删除政策是惰性删除和定期删除兩種政策配合使用

  • 惰性删除
    • Redis的惰性删除政策由db.c/expirelfNeeded函數實作,所有鍵讀寫指令執行之前都會調用expirelfNeeded函數對其進行檢查,如果過期,删除該鍵,然後執行該鍵不存在的操作;未過期則不作操作,繼續執行原有指令
  • 定期删除
    • 有redis.c/activeExpireCycle函數實作,函數以一定的頻率運作,每次運作時,都從一定數量的資料庫中取出一定數量的随機鍵進行檢查,并删除其中的過期鍵
    • 定期删除函數的運作頻率在redis2.6版本中,規定每秒運作10次,大概100ms運作一次。在redis2.8版本後,可以通過修改配置檔案redis.conf的hz選項來調整這個次數
    • 過期掃描不會周遊過期字典中所有的key,而是采用了一種簡單的貪心政策
      1. 從過期字典中随機20個key
      2. 删除這20個key中已經過期的key
      3. 如果過期的key比率超過1/4,那就重複步驟1
Redis淘汰政策

有了以上過期政策的說明後,就很容易了解為什麼需要淘汰政策了,因為不管是定期采樣删除還是惰性删除都不是一種完全精準的删除,就還是會存在key沒有被删除掉的場景,是以就需要記憶體淘汰政策進行補充。

maxmemory xxxmb 設定redis最大占用記憶體大小

maxmemory-policy參數值如下

記憶體淘汰政策 說明
noeviction 當記憶體使用超過配置的時候會傳回錯誤,不會驅逐任何鍵
allkeys-lru 加入鍵時,如果過限,首先通過LRU算法驅逐最久沒有使用的鍵
volatile-lru 加入鍵時,如果過限,首先從設定了過期時間的鍵集合中驅逐最久沒有使用的鍵
allkeys-random 加入鍵時,如果過限,從所有key随機删除
volatile-random 加入鍵時,如果過限,從過期鍵的集合中随機驅逐
volatile-ttl 加入鍵時,如果過限,從配置了過期時間的鍵中驅逐馬上就要過期的鍵
volatile-lfu 加入鍵時,如果過限,從所有配置了過期時間的鍵中驅逐使用頻率最少的鍵
allkeys-lfu 加入鍵時,如果過限,從所有鍵中驅逐使用頻率最少的鍵

部署LNMP+Redis

yum -y install gcc pcre-devel zlib-devel
tar -zxvf nginx
cd nignx
./configure
make && make install

yum -y install php-fpm
vim /usr/local/nginx/conf/nginx.conf
================================
...
location ~ \.php$ {
              root           html;
              fastcgi_pass   127.0.0.1:9000;
              fastcgi_index  index.php;
              include        fastcgi.conf;
       }
......
=========================================

/usr/local/nginx/sbin/nginx -t  #測試配置檔案是否有錯

systemctl start php-fpm  #啟動php-fpm   fastCGI解析php腳本語言
ss -nutlp | grep 9000  #檢視服務端口是否存在
yum -y install php php-devel automake autoconf  #automake autoconf幫助源碼編譯的
tar -zxf php-redis-2.2.4.tar.gz  #安裝擴充包
cd phpredis-2.2.4/
phpize #生成配置檔案php-config和configure指令

./configure --with-php-config=/usr/bin/php-config #配置
make && make install #編譯安裝

vim /etc/php.ini
=====================
...
728 extension_dir="/usr/lib64/php/modules"  #子產品檔案目錄
730 extension="redis.so"   #子產品檔案名
.....
:set nu
===============================

systemctl restart php-fpm
php -m | grep -i redis  #檢視已加載的子產品
redis #有了


#确認redis服務開啟  我開在4.71

vim /usr/local/nginx/html/linkredis.php   #網站測試網頁
============================
<?php
$redis=new redis();
$redis->connect("192.168.4.71","6379");
$redis->auth("123456");
$redis->set("linux","hello redis\n");
echo $redis->("linux");
?>
===================================

curl http://localhost/linkredis.php
hello redis
#成功
#可以去4.71機子上看看