当前位置: 首页 > news >正文

吴江做企业网站网站制作基本流程

吴江做企业网站,网站制作基本流程,江苏建设网站公司,做企业网站通常哪找素材引言 Redis的过期删除策略和内存淘汰策略是经常被问道的问题,这两个机制都是做删除操作,但是触发的条件和使用的策略是不同的。今天就来深入理解一下这两个策略。 过期删除策略 Redis 是可以对 key 设置过期时间的,因此需要有相应的机制将…

引言

Redis的过期删除策略和内存淘汰策略是经常被问道的问题,这两个机制都是做删除操作,但是触发的条件和使用的策略是不同的。今天就来深入理解一下这两个策略。

过期删除策略

Redis 是可以对 key 设置过期时间的,因此需要有相应的机制将已过期的键值对删除,而做这个工作的就是过期键值删除策略。

如何设置过期时间?

Redis中,设置key过期时间的命令一共有4个:

  • expire <key> <n>:设置key在n秒后过期。
  • pexpire <key> <n>:设置key在n毫秒后过期。
  • expireat <key> <n>:设置key在某个时间戳(精确到秒)之后过期。
  • pexpireat <key> <n>:设置key在某个时间戳(精确到毫秒)之后过期。

当然,在设置字符串时,也可以同时对key设置过期时间,共有3种命令:

  • set <key> <value> ex <n>:设置键值对的时候,同时指定过期时间(精确到秒);
  • set <key> <value> px <n>:设置键值对的时候,同时指定过期时间(精确到毫秒);
  • setex <key> <n> <value>:设置键值对的时候,同时指定过期时间(精确到秒);

要想查看某个key剩余的存活时间,可以使用命令TTL <key>

# 设置键值对时,指定过期时间为60s
> set name iq50 ex 60
OK# 查看过期时间
> ttl name
(integer) 56
> ttl name
(integer) 50# 可以通过PERSIST <key>命令取消过期时间
> persist name
(integer) 1# -1表示永不过期
> ttl name
(integer) -1

如何判定key已过期了?

每当我们对一个 key 设置了过期时间时,Redis 会把该 key 带上过期时间存储到一个**过期字典(expires dict)**中,也就是说「过期字典」保存了数据库中所有 key 的过期时间。
过期字典存储在 redisDb 结构中,如下:

typedef struct redisDb {dict *dict;    /* 数据库键空间,存放着所有的键值对 */dict *expires; /* 过期字典:存储键的过期时间 */....
} redisDb;

过期字典数据结构结构如下:

  • 过期字典的 key 是一个指针,指向某个键对象;
  • 过期字典的 value 是一个 long long 类型的整数,这个整数保存了 key 的过期时间;

过期字典数据结构如下图所示:
image.png
字典实际上是哈希表,哈希表的最大好处就是让我们可以用 O(1) 的时间复杂度来快速查找。当我们查询一个 key 时,Redis 首先检查该 key 是否存在于过期字典中:

  • 如果不在,则正常读取键值;
  • 如果存在,则会获取该 key 的过期时间,然后与当前系统时间进行比对,如果比系统时间大,那就没有过期,否则判定该 key 已过期。

常见的3种过期删除策略

在介绍Redis的过期删除策略之前,来看一下常见的3种过期删除策略

  • 定时删除;
  • 惰性删除;
  • 定期删除;

接下来一张表分析一下各自的优缺点:

删除策略描述优点缺点
定时删除在设置key过期时间时,同时创建一个定时事件。当时间到达时,由事件处理器自动执行key的删除操作。对内存友好。可以保证过期key会被尽快删除,去释放内存。对CPU不友好。在过期key较多的情况下,会占用相当一部分CPU时间,这会对服务器的响应时间和吞吐量造成影响。
惰性删除不主动删除过期键,每次从数据库访问key时,都检测key是否过期,过期则删除该key。对CPU友好。只有每次访问时,才检查key,所以只会使用很少的系统资源。对内存不友好。如果一个key已经过期,但是我们一直没有去访问,它占用的内存空间就一直得不到释放。
定期删除每隔一段时间随机从数据库中取出一定数量的key进行检查,并删除其中的过期key。限制删除操作的执行时长和频率,减少对CPU的影响,也能删除过期数据减少对内存的无效占用。
  1. 内存清理方面没有定时删除好也没有惰性删除使用的系统资源少。
  2. 难以确定删除操作执行的时长和频率。

Redis的过期删除策略

基于我们上面介绍的3种过期删除策略,Redis选择了**"惰性删除+定期删除"两种策略配合使用**,以求在合理使用CPU时间和避免内存浪费之间取得平衡。
Question1:Redis是怎么实现惰性删除的呢?
Redis的惰性删除由 db.c 文件中的 expireIfNeeded 函数实现,代码如下:

int expireIfNeeded(redisDb *db, robj *key) {// 判断 key 是否过期if (!keyIsExpired(db,key)) return 0;..../* 删除过期键 */....// 如果 server.lazyfree_lazy_expire 为 1 表示异步删除,反之同步删除;return server.lazyfree_lazy_expire ? dbAsyncDelete(db,key) :dbSyncDelete(db,key);
}

Redis 在访问或者修改 key 之前,都会调用 expireIfNeeded 函数对其进行检查,检查 key 是否过期:

  • 如果过期,则删除该 key,至于选择异步删除,还是选择同步删除,根据 lazyfree_lazy_expire 参数配置决定(Redis 4.0版本开始提供参数),然后返回 null 客户端;
  • 如果没有过期,不做任何处理,然后返回正常的键值对给客户端;

Question2:Redis是怎么实现定期删除的呢?
再回忆一下,定期删除策略的做法:每隔一段时间「随机」从数据库中取出一定数量的 key 进行检查,并删除其中的过期key。
**间隔时间多长?**在 Redis 中,默认每秒进行 10 次过期检查(相当于每100ms一次),此配置可通过 Redis 的配置文件 redis.conf 进行配置,配置键为 hz 它的默认值是 hz 10。
**随机抽查的数量多少?**随机抽查的数量由 ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP 定义的,它是写死在代码中的,数值是 20。
接下来看一下定期删除的流程:

  1. 从过期字典中随机抽取 20 个 key;
  2. 检查这 20 个 key 是否过期,并删除已过期的 key;
  3. 如果本轮检查的已过期 key 的数量,超过 5 个,也就是「已过期 key 的数量」占比「随机抽取 key 的数量」大于 25%,则继续重复步骤 1;如果已过期的 key 比例小于 25%,则停止继续删除过期 key,然后等待下一轮再检查。

由此可见,定期删除是一个循环的流程。

内存淘汰策略

之前我们介绍的是Redis的过期删除策略,是删除已过期的key,而当Redis的运行内存已经超过Redis设置的最大内存之后,则会使用内存淘汰策略删除符合条件的key,以此保证Redis的高效运行。

如何设置Redis最大运行内存?

在配置文件 redis.conf 中,可以通过参数 maxmemory <bytes> 来设定最大运行内存,只有在 Redis 的运行内存达到了我们设置的最大运行内存,才会触发内存淘汰策略。 不同位数的操作系统,maxmemory 的默认值是不同的:

  • 在 64 位操作系统中,maxmemory 的默认值是 0,表示没有内存大小限制,那么不管用户存放多少数据到 Redis 中,Redis 也不会对可用内存进行检查,直到 Redis 实例因内存不足而崩溃也无作为。
  • 在 32 位操作系统中,maxmemory 的默认值是 3G,因为 32 位的机器最大只支持 4GB 的内存,而系统本身就需要一定的内存资源来支持运行,所以 32 位操作系统限制最大 3 GB 的可用内存是非常合理的,这样可以避免因为内存不足而导致 Redis 实例崩溃

Redis内存淘汰策略有哪些?

Redis 内存淘汰策略共有八种,这八种策略大体分为「不进行数据淘汰」和「进行数据淘汰」两类策略。
1、不进行数据淘汰的策略
noeviction(Redis3.0之后,默认的内存淘汰策略) :它表示当运行内存超过最大设置内存时,不淘汰任何数据,这时如果有新的数据写入,会报错通知禁止写入,不淘汰任何数据,但是如果没用数据写入的话,只是单纯的查询或者删除操作的话,还是可以正常工作。
2、进行数据淘汰的策略
针对「进行数据淘汰」这一类策略,又可以细分为「在设置了过期时间的数据中进行淘汰」和「在所有数据范围内进行淘汰」这两类策略。
在设置了过期时间的数据中进行淘汰:

  • volatile-random:随机淘汰设置了过期时间的任意键值;
  • volatile-ttl:优先淘汰更早过期的键值。
  • volatile-lru(Redis3.0 之前,默认的内存淘汰策略):淘汰所有设置了过期时间的键值中,最久未使用的键值;
  • volatile-lfu(Redis 4.0 后新增的内存淘汰策略):淘汰所有设置了过期时间的键值中,最少使用的键值;

在所有数据范围内进行淘汰:

  • allkeys-random:随机淘汰任意键值;
  • allkeys-lru:淘汰整个键值中最久未使用的键值;
  • allkeys-lfu(Redis 4.0 后新增的内存淘汰策略):淘汰整个键值中最少使用的键值。

我们可以通过命令查看当前Redis使用的内存淘汰策略:

127.0.0.1:6379> config get maxmemory-policy
1) "maxmemory-policy"
2) "noeviction"

可以看出,当前 Redis 使用的是 noeviction 类型的内存淘汰策略,它是 Redis 3.0 之后默认使用的内存淘汰策略,表示当运行内存超过最大设置内存时,不淘汰任何数据,但新增操作会报错。
怎么修改内存淘汰策略?
有两种方式可选:

  1. 通过config set maxmemory-policy <策略>命令设置。它的优点是设置之后立即生效,不需要重启 Redis 服务,缺点是重启 Redis 之后,设置就会失效。
  2. 通过修改 Redis 配置文件修改,设置“maxmemory-policy <策略>”,它的优点是重启 Redis 服务后配置不会丢失,缺点是必须重启 Redis 服务,设置才能生效。

总结

Redis 使用的过期删除策略是「惰性删除+定期删除」,删除的对象是已过期的 key。
image.png
内存淘汰策略是解决内存过大的问题,当 Redis 的运行内存超过最大运行内存时,就会触发内存淘汰策略,Redis 4.0 之后共实现了 8 种内存淘汰策略,我也对这 8 种的策略进行分类,如下:
image.png

http://www.wooajung.com/news/26259.html

相关文章:

  • 做房产网站接不到电话百度竞价客服电话
  • 如何上传网页到网站百度客服人工
  • iis7.5 部署网站seo是哪个英文的缩写
  • 电商网站开发团队东莞网络营销
  • 学院网站建设免费发布信息的网站平台
  • 盐城做百度网站又一病毒来了比新冠可怕
  • 昆明找工作哪个网站好做个网站需要多少钱
  • 专业房产网站建设公司排名在线资源链接
  • 十堰做网站的公司简易的旅游网页制作
  • 网上兼职做效果图网站有哪些代刷网站推广
  • 经常做飞机网站永久免费低代码开发平台
  • 网站主持人制作网站代言人南宁优化网站网络服务
  • 一台vps可以做几个网站怎么在百度发布自己的文章
  • 大气的网站首页郑州网络营销策划
  • 什么是企业网站营销宁波seo网络推广优化价格
  • 福州搜索优化网站百度sem代运营
  • 郑州网站推广怎么做网络广告四个特征
  • wordpress使用阿里云oss存储seo查询
  • asp网站上哪做东莞头条最新新闻
  • 如何免费做网站网页源云推广
  • 搜索引擎优化seo网站品牌营销推广要怎么做
  • 老网站删除做新站会影响收录吗做网站排名服务热线
  • 网站设计与开发专业百度关键词优化方法
  • 连锁店网站建设google搜索下载
  • 我想在购物网站做代理网站推广软件有哪些
  • 公司官网站怎么搞南平seo
  • 常州便宜的做网站服务百度手机助手最新版下载
  • 怎样做自己网站后台不被攻击全国各城市疫情搜索高峰进度
  • 网站ftp空间一个企业该如何进行网络营销
  • 阳泉推广型网站建设搜索关键词排名优化软件