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

青岛建网站广东省 网站制作

青岛建网站,广东省 网站制作,吉林省工伤保险网站,谷歌seo是做什么的文章目录 Redis内存策略过期策略DB结构惰性删除周期删除 淘汰策略 Redis内存策略 Redis是基于内存存储#xff0c;所以其性能很强。但单节点的Redis内存不宜过大#xff0c;否则会影响持久化或主从同步性能。 可以手动修改配置文件来设置Redis的最大内存 # 格式#xff1… 文章目录 Redis内存策略过期策略DB结构惰性删除周期删除 淘汰策略 Redis内存策略 Redis是基于内存存储所以其性能很强。但单节点的Redis内存不宜过大否则会影响持久化或主从同步性能。 可以手动修改配置文件来设置Redis的最大内存 # 格式 maxmemory bytes maxmemory 1gb如果内存使用达到了上限就无法存储更多的数据了。 Redis为尽量避免内存达到上限提供了两种策略过期策略、淘汰策略。 过期策略 在Redis缓存中可以通过expire命令为redis的key设置TTL(过期时间或存活时间)。 当key的TTL到期之后再次访问key是返回的值为nil(空)说明这个key就已经不存在了其对应的内存也得到了释放从而起到了内存回收的目的。 DB结构 Redis本身就是一个很经典的key-value内存存储数据库因此所有的key、value都保存在Dict结构中。不过在其database结构体中有两个Dict一个记录key-value另一个记录key-TTL。 源码 typedef struct redisDb {dict *dict; /* 存放所有key及value的地方也被称为keyspace*/dict *expires; /* 存放每一个key及其对应的TTL存活时间只包含设置了TTL的key*/dict *blocking_keys; /* Keys with clients waiting for data (BLPOP)*/dict *ready_keys; /* Blocked keys that received a PUSH */dict *watched_keys; /* WATCHED keys for MULTI/EXEC CAS */int id; /* Database ID0~15 */long long avg_ttl; /* 记录平均TTL时长 */unsigned long expires_cursor; /* expire检查时在dict中抽样的索引位置. */list *defrag_later; /* 等待碎片整理的key列表. */ } redisDb;结构流程图 惰性删除 **惰性删除**并不是在TTL到期后就立刻删除key而是在访问一个key的时候检查该key的存活时间如果已经过期才执行删除。 // 查找一个key执行写操作 robj *lookupKeyWriteWithFlags(redisDb *db, robj *key, int flags) {// 检查key是否过期expireIfNeeded(db,key);return lookupKey(db,key,flags); } // 查找一个key执行读操作 robj *lookupKeyReadWithFlags(redisDb *db, robj *key, int flags) {robj *val;// 检查key是否过期 if (expireIfNeeded(db,key) 1) {// ...略}return NULL; }int expireIfNeeded(redisDb *db, robj *key) {// 判断是否过期如果未过期直接结束并返回0if (!keyIsExpired(db,key)) return 0;// ... 略// 删除过期keydeleteExpiredKeyAndPropagate(db,key);return 1; }这种删除策略会存在一个问题如果一个key过期了就再也没有被访问过则这个key就永远不会被删除。在极端情况下当大量的key出现这种情况也会对内存造成很大的压力。 周期删除 周期删除顾明思议是通过一个定时任务周期性的抽样部分过期的key然后执行删除。执行周期有两种 Redis服务初始化函数initServer()中设置定时任务按照server.hz的频率来执行过期key清理模式为SLOW。 // server.c void initServer(void){// ...// 创建定时器关联回调函数serverCron处理周期取决于server.hz默认10aeCreateTimeEvent(server.el, 1, serverCron, NULL, NULL) }// server.c int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) {// 更新lruclock到当前时间为后期的LRU和LFU做准备unsigned int lruclock getLRUClock();atomicSet(server.lruclock,lruclock);// 执行database的数据清理例如过期key处理databasesCron(); }void databasesCron(void) {// 尝试清理部分过期key清理模式默认为SLOWactiveExpireCycle(ACTIVE_EXPIRE_CYCLE_SLOW); }Redis的每个事件循环前会调用beforeSleep()函数执行过期key清理模式为FAST。 void beforeSleep(struct aeEventLoop *eventLoop){// ...// 尝试清理部分过期key清理模式默认为FASTactiveExpireCycle(ACTIVE_EXPIRE_CYCLE_FAST); }void aeMain(aeEventLoop *eventloop){eventLoop-stop 0;while(!eventLoop-stop){// beforeSleep() -- Fast模式快速清理// n aeApiPoll()// 如果n 0FD就绪处理IO事件。// 如果到了执行时间则调用serverCron() -- SLOW模式清理} }周期清理的两种模式 SLOW模式规则 ① 执行频率受server.hz影响默认为10即每秒执行10次每个执行周期100ms。 ② 执行清理耗时不超过一次执行周期的25%.默认slow模式耗时不超过25ms。 ③ 逐个遍历db逐个遍历db中的bucket抽取20个key判断是否过期。 ④ 如果没达到时间上限25ms并且过期key比例大于10%再进行一次抽样否则结束。 FAST模式规则(过期key比例小于10%不执行) ① 执行频率受beforeSleep()调用频率影响但两次FAST模式间隔不低于2ms。 ② 执行清理耗时不超过1ms。 ③ 逐个遍历db逐个遍历db中的bucket抽取20个key判断是否过期。 ④ 如果没达到时间上限1ms并且过期key比例大于10%再进行一次抽样否则结束。 淘汰策略 内存淘汰当Redis内存使用达到设置的阈值时Redis会主动挑选部分key将其删除释放更多内存。 Redis会在处理客户端命令的方法processCommand()中尝试做内存淘汰。 int processCommand(client *c) {// 如果服务器设置了server.maxmemory属性并且并未有执行lua脚本if (server.maxmemory !server.lua_timedout) {// 尝试进行内存淘汰performEvictionsint out_of_memory (performEvictions() EVICT_FAIL);// ...if (out_of_memory reject_cmd_on_oom) {rejectCommand(c, shared.oomerr);return C_OK;}// ....} }Redis支持8种不同策略来选择要删除的key noeviction不淘汰任何key但是内存满时不允许写入新数据(默认)。volatile-ttl对设置了TTL的key比较key的剩余TTL值TTL越小越先被淘汰。allkeys-random对全体key 随机进行淘汰。也就是直接从db-dict中随机挑选。volatile-random对设置了TTL的key 随机进行淘汰。也就是从db-expires中随机挑选。allkeys-lru 对全体key基于LRU算法进行淘汰。volatile-lru 对设置了TTL的key基于LRU算法进行淘汰。allkeys-lfu 对全体key基于LFU算法进行淘汰。volatile-lfu 对设置了TTL的key基于LFI算法进行淘汰。 LRULeast Recently Used最少最近使用。用当前时间减去最后一次访问时间这个值越大则淘汰优先级越高。 LFULeast Frequently Used最少频率使用(最近最少使用)。会统计每个key的访问频率值越小淘汰优先级越高。 Redis的数据都会被封装成RedisObject结构 typedef struct redisObject {unsigned type:4; // 对象类型unsigned encoding:4; // 编码方式unsigned lru:LRU_BITS; // LRU以秒为单位记录最近一次访问时间长度24bit// LFU高16位以分钟为单位记录最近一次访问时间低8位记录逻辑访问次数int refcount; // 引用计数计数为0则可以回收void *ptr; // 数据指针指向真实数据 } robj;逻辑访问次数并不是每次key被访问都计数而是通过下面的步骤计算得来 生成一个0~1之间的随机数。计算 (旧次数 * lfu_log_factor 1)记录为P(lfu_log_factor默认为10)。如果 R P 则计数器 1且最大不超过255。访问次数会随时间衰减距离上一次访问时间每隔 lfu_decay_time 分钟(默认为1)计数器 - 1。 淘汰策略流程图
http://www.dnsts.com.cn/news/27547.html

相关文章:

  • 南京建站方案重庆网站公司设计方案
  • 三网合一网站建设系统 价格php网站制作常用代码
  • 书店网站建设镇江网站建设流程
  • 做网站要切图吗电脑维护网站模板
  • xml是用来做网站的嘛三门峡做网站优化
  • 网站建设 百度云盘公司网站建设计划书
  • 销售单页网站品牌理念设计企业网站建设
  • 织梦装修公司网站模板中国发达国家投票
  • 昆明网站建设设计民宿设计公司
  • 做网站顺序网站设计思路方案
  • 网站开发后怎么上线国外的模板网站有哪些
  • 如何做好外贸网站建设服务商名称是什么意思
  • 网站开发人员非营利组织网站建设会计分录
  • 永州企业网站建设价格深圳建站公司开发费用
  • 南通专业家纺网站建设wordpress加超链接
  • 制作的网站图片不显示网站logo用什么做
  • 优化建站seo门户怎么黑wordpress
  • 怎么怎么做网站微信 小程序 wordpress
  • 黄页推广网站下载上海企业网站模板建站费用
  • 国外网站后缀苏州做i网站的
  • 智能手表网站电子商务基础网站建设与维护单项选择题
  • 重庆网站建设公司在线联系跨境经验分享
  • 合肥网站建设多少钱网页设计的一般流程
  • 做的烂的网站卖线面网站
  • 开封市建设教育协会网站传统网站布局
  • 杭州网站网站建设网站 流程优化
  • 做网站公司 衡阳公司动地科技登录网站
  • 用自己的电脑做网站划算车贴广告设计图片
  • 深圳制作手机网站深圳网站建设与设计制作
  • 北京市建设工程造价管理处网站抚顺 网站建设