文章目錄
-
- 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,而是采用了一種簡單的貪心政策
- 從過期字典中随機20個key
- 删除這20個key中已經過期的key
- 如果過期的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機子上看看