前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Redis通用命令&&过期策略的优化(定时器策略)

Redis通用命令&&过期策略的优化(定时器策略)

作者头像
阑梦清川
发布2025-02-24 22:24:48
发布2025-02-24 22:24:48
810
举报
文章被收录于专栏:学习成长指南学习成长指南

1.get和set的使用

下面的这个就是我自己在这个Redis的客户端下面使用这个set和het进行操作的这个场景:

其实这个就是设置键值对,使用这个get查看这个键对应的value数值;

当我们查询的这个键值对存在的时候,是可以看到这个返回结果的,但是如果不存在,这个时候就会打印这个nil表示的意思和我们之前学习的这个null意思是差不多的;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.keys使用

查看符合要求的这个key值:

?匹配一个字符;

*表示0个或者任意多个字符;

[a,s,d,f]表示只能匹配这几个选项;

[^e]表示出了e之外的就可以(排除答案);

[a-b]其实和第三个是一样的,就是两个都可以;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

keys就是获取这个符合这个通配符的所有的键的内容,get表示获取这个key对应的这个value数值;

keys *表示获取这个所有的key内容,但是这个强烈不建议使用,因为如果因为这个卡住,就会造成这个mysql的隐患(因为这个时候我们的redis无法正常运行了,就会启用这个mysql)

3.exists的使用

判断我们的这个键值是不是存在的,如果是存在的,就会返回这个存在的个数:

1)因为我的这个第一次是一次性输入两个,因此这个显示的就是2,也就是说两个都是存在的;

2)但是这个后面的两次的这个输入都是一个,也就是说这个也是存在的,只不过就是一个;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.del的使用

1)keys *表示的就是显示出来这个所有的键值对里面的这个值的数目和具体内容;

2)del就是delete缩写呗,表示的就是删除的意思,后面加的就是我们的这个值的内容,再次检查就会发现这个确认时被删除掉了,我们的这个操作是生效的;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

5.expire使用

给指定的key设置过期的时间:这个后面的参数有两个,一个就是我们的指定的key的名字,一个就是过期的时间,这个是以ms作为单位的;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

6.ttl的使用

对于这个键值对的过期的时间进行查询操作:我们可以设置之后多次操作,这个时候我们就可以发现这个时间的变化,但是到了-2之后就不会继续减少了;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

7.Redis的过期策略

这个里面Redis自身的这个整体的策略就是下面的两种:

1)定期删除:这个就是在固定的时间进行删除;

2)惰性删除:假设我们的这个key已经达到了过期的时间,但是我们暂时没有删除,后面用到的时候发现这个key已经过期了,这个时候我们的这个访问就会触发这个Redis服务器删除这个key的操作,同时返回这个nil;

8.定时器的策略

为什么需要引入下面的这个定时器的策略,一句话:就是上面的这个Redis自己的这个策略不够好,但是下面的这个定时器的策略只是为了为我们提供这个借鉴和思考,这个定时器策略是没有被Redis使用的;

8.1优先级队列

1)首先对于这个过期的问题里面:过期的时间越早,这个键值对的优先级就越高;

2)如果很多的这个键值对都设置了这个过期的时间,这个时候我们就把这些内容存储到这个优先级队列里面去,并且制定这个规则:过期时间越早,优先级越高;

3)这样的设计之后,我们的这个队首元素就是这个最早过期的元素,我们这个时候只需要定期检查这个队首元素,如果这个元素没过期,后面的优先级不高的元素肯定是没有过期的;

4)这个时候,扫描线程不需要扫描这个线程,只需要看住这个队首元素即可;

5)但是这个所谓的检查不可以过于频繁,如果处理?就是在这个根据当前队列里面的这个队首元素的过期时间,设置一个等待,到达这个过期时间之后,再次唤醒这个线程;

6)如果在这个休眠等待的时候来了一个新的任务,例如我们原本是6个任务,最早过期的这个时间是12:00,这个时候我们的休眠时间本应该在12点的时候结束,12点的时候才会被唤醒这个线程,但是这个休眠的过程中来了一个11:30就要被过期的任务,这个时候应该如何应对???

7)我们解决方案就是:如果在这个休眠的过程中有新的任务的加入。我们会唤醒这个刚才的线程~~重新检查这个队首元素,再根据这个时间的差距调整这个阻塞队列的阻塞时间即可;

8.2时间轮策略

1)时间轮,就是像下面的这个样子一样,设置一个时间大转盘,我这个就是简单的画了一下,一共是9个格子(这个格子的数量是不确定的,我这个就是举个例子);

2)每一个格子上面悬挂这个链表,例如我们这个时候想要添加这个300ms之后过期的这个任务,这个时候这个任务就会找到这个3格子的位置,添加到这个格子的链表的后面;

3)如果这个各自的数量不够,例如我们的这个格子只有9个,这个时候来了一个1000ms的任务,这个时候就会在这个时间轮上面循环,也就是这个1000ms的任务挂到这个1所在这个链表的后面;

4)这样的处理之后,我们的这个每一个格子上面的这个链表悬挂的这个任务要么是一样的时间之后过期,要么就是相差一个周期,这个时候我们就可以每隔一段时间,处理一个格子上面的这个任务,这样也是可以实现这个定时器的效果的;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

9.typed的使用

type key1表示查看这个key1对应的这个value的数据类型;

下面的这个lpush和sadd和hset就是往这个对应的数据结构里面进行这个数据的插入,我们后面还有这些指令的具体的说明,lpush就是向list里面去插入数据,因此这个打印结果就是list,其他的这个类似;

唯一需要进行说明的就是我们的这个field,因为这个是我们的hash结构,我们的这个firld主要是为了把这个外层的键值对里面的键和内层的这个键区分开来;

这个打印结果就是list,其他的这个类似;

唯一需要进行说明的就是我们的这个field,因为这个是我们的hash结构,我们的这个firld主要是为了把这个外层的键值对里面的键和内层的这个键区分开来;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-02-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.get和set的使用
  • 2.keys使用
  • 3.exists的使用
  • 4.del的使用
  • 5.expire使用
  • 6.ttl的使用
  • 7.Redis的过期策略
  • 8.定时器的策略
    • 8.1优先级队列
    • 8.2时间轮策略
  • 9.typed的使用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档