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机子上看看
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值