golang实现简单的redis服务4(实现过期时间功能)

仓库地址: https://github.com/dengjiayue/my-redis-v2.0-RESP-.git

为什么要做过期时间?

: 因为redis是内存数据库,空间是有限并且昂贵的,如果我们只存数据很快就会资源耗尽.
所以我们需要清理数据腾出空间储存其他的数据

redis失效时间是如何做的

redis是使用失效时间字典去存放失效时间的
key为对应数据的指针,val为失效时间戳(毫秒级)
在这里插入图片描述

redis有那些过期策略,优缺点,实现原理?
  1. 立即清除,key到过期时间立即清除
    优点:内存友好,能够快速释放出空间
    缺点: cpu消耗大,不停执行清除,如果遇到请求压力大的时候会额外增加cpu的负担
    实现方案: 使用时间轮调度器,每设置一个失效时间就加一个延时调度删除方法,到过期时间会调度删除方法删除该数据

  2. 惰性清除: 当使用key的时候检查是否过期,如果过期就清除该数据
    优点: cpu友好,不需要时刻执行清除
    缺点: 内存不友好,有一些不使用的过期数据会无法清除,浪费空间资源(redis空间很宝贵)
    实现方案: 当调用查询的时候先检查是否过期,如果过期清除数据并返回空

  3. 定时清除: 定时扫描过期字典,将过期的数据清除
    这是一个折中的方案,既不会向立即清除那样消耗太多的cpu,又不会让不使用的数据长期停留在数据库中
    实现方案: 做一个定时任务,定时扫描过期字典并清除过期数据

redis使用的什么方案

redis使用的是定时以惰性删除结合的方案

package src

import (
	"my_redis/src/timewheel"
	"strconv"
	"time"
)

//过期时间实现
//

// 扫描部分key并检查是否过期
func (s *Server) CheckExpire(num int) {
   
   
	// 遍历所有key
	for k, v := range s.Ex {
   
   
		if v < time.Now()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值