Redis之乱七八糟

news2024/11/15 8:15:45

redis过期时间

注意事项

  1. DEL/SET/GETSET等命令会清除过期时间
      在使用 DEL、SET、GETSET 等会覆盖key对应value的命令操作一个设置了过期时间的key的时候,会导致对应的key的过期时间被清除。

  2. INCR/LPUSH/HSET等命令则不会清除过期时间
      而在使用 INCR/LPUSH/HSET 这种只是修改一个key的value,而不是覆盖整个value的命令,则不会清除key的过期时间。

  3. PERSIST命令会清除过期时间

  4. 使用RENAME命令,老key的过期时间将会转到新key上
      例如: RENAME KEY A KEY B 命令将KEYA重命名为KEYB,不管KEYB有没有设置过期时间,新的key KEYB将会继承KEY_A的所有特性。

这里篇幅有限,我就不一一将keya重命名到keyb的各个情况列出来,大家可以在自己电脑上试一下keya设置了过期时间,keyb没设置过期时间这种情况。

  1. 使用EXPIRE/PEXPIRE设置的过期时间为负数或者使用EXPIREAT/PEXPIREAT设置过期时间戳为过去的时间会导致key被删除

EXPIRE:

EXPIREAT:

  1. EXPIRE命令可以更新过期时间

对一个已经设置了过期时间的key使用expire命令,可以更新其过期时间。

在Redis2.1.3以下的版本中,使用expire命令更新一个已经设置了过期时间的key的过期时间会失败。并且对一个设置了过期时间的key使用LPUSH/HSET等命令修改其value的时候,会导致Redis删除该key。

过期策略

Redis的过期策略

那你有没有想过一个问题,Redis里面如果有大量的key,怎样才能高效的找出过期的key并将其删除呢,难道是遍历每一个key吗?假如同一时期过期的key非常多,Redis会不会因为一直处理过期事件,而导致读写指令的卡顿。

这里说明一下,Redis是单线程的,所以一些耗时的操作会导致Redis卡顿,比如当Redis数据量特别大的时候,使用keys * 命令列出所有的key。

实际上Redis使用 懒惰删除+定期删除 相结合的方式处理过期的key。

懒惰删除

所谓 懒惰删除 就是在客户端访问该key的时候,redis会对key的过期时间进行检查,如果过期了就立即删除。

这种方式看似很完美,在访问的时候检查key的过期时间,不会占用太多的额外CPU资源。但是如果一个key已经过期了,如果长时间没有被访问,那么这个key就会一直存留在内存之中,严重消耗了内存资源。

定期删除

定期删除的原理是,Redis会将所有设置了过期时间的key放入一个字典中,然后每隔一段时间从字典中随机一些key检查过期时间并删除已过期的key。

Redis默认每秒进行10次过期扫描:

1、从过期字典中随机20个key

2、删除这20个key中已过期的

3、如果超过25%的key过期,则重复第一步

同时,为了保证不出现循环过度的情况,Redis还设置了扫描的时间上限,默认不会超过25ms。

redis实现频率限制

1)方案1 - Lua脚本
思路
把限制逻辑封装到一个Lua脚本中,调用时只需传入:key、限制数量、过期时间,调用结果就会指明是否运行访问
在这里插入图片描述

local notexists = redis.call(\"set\", KEYS[1], 1, \"NX\", \"EX\", tonumber(ARGV[2]))
if (notexists) then
  return 1
end
local current = tonumber(redis.call(\"get\", KEYS[1]))
if (current == nil) then
  local result = redis.call(\"incr\", KEYS[1])
  redis.call(\"expire\", KEYS[1], tonumber(ARGV[2]))
  return result
end
if (current >= tonumber(ARGV[1])) then
  error(\"too many requests\")
end
local result = redis.call(\"incr\", KEYS[1])
return result

(2)方案2 - 扩展模块
Redis4 中开放了模块系统,大家可以开发自己的模块插入到 redis 中,redis 官方已经推荐了一个访问限制模块 redis-cell,只需要一条命令就可以实现需求

示例

CL.THROTTLE user123 15 30 60
复制
user123 是 key
15 是最大配额数量
30 是可以访问次数
60 是时间周期,单位秒
综合起来的意思是,user123 的最大资源配额是15,60秒内最多可以访问30次

返回结果:

  1. (integer) 0 # 0 允许; 1 拒绝
  2. (integer) 16 # 总配额
  3. (integer) 15 # 剩余配额
  4. (integer) -1 # 几秒后可以重试,-1 表示不限制,第一条为0时,此处为-1
  5. (integer) 2 # 几秒后恢复最大值
    复制
    每次执行这个命令时,剩余配额都会减1,当配额不足,或者访问次数超限时,都会被拒绝

项目地址

https://github.com/antirez/neural-redis

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/141407.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Git】 常用命令速查

一、 Git 常用命令速查git branch 查看本地所有分支git status 查看当前状态 git commit 提交 git branch -a 查看所有的分支git branch -r 查看远程所有分支git commit -am "init" 提交并且加注释 git remote add origin git192.168.1.119:ndshowgit push origin ma…

人工智能 - 朴素贝叶斯、案例:文本情感分析

朴素贝叶斯:用概率去预测 1、朴素贝叶斯介绍 朴素:指的是,特征之间相互独立 拉普拉斯平滑系数,每个种类都加k,避免条件概率出现0 区分情书与作业的例子,用关键词: 是情书的概率更高&#xf…

基于Transformer的多变量风电功率预测TF2

Transformer目前大火,作为一个合格的算法搬运工自然要跟上潮流,本文基于tensorflow2框架,构建transformer模型,并将其用于多变量的风电功率负荷预测。 实验结果表明,相比与传统的LSTM,该方法精度更高&…

干货 | 背熟这些 Docker 命令,面试再也不怕啦~

我们下载 Docker 镜像的时候,默认会访问 Docker 网站,而 Docker 网站是在国外部署的,距离比较远下载速度特别慢。我们可以通过设置加速器的方式来加速 Docker 镜像下载的速度。下面将描述一下使用加速器的步骤:1.我们这里选择的是…

ORB-SLAM2 --- MapPoint::Replace函数

目录 1.函数作用 2.code 3.函数解析 1.函数作用 替换地图点,更新观测关系。 2.code void MapPoint::Replace(MapPoint* pMP) {// 同一个地图点则跳过if(pMP->mnIdthis->mnId)return;//要替换当前地图点,有两个工作:// 1. 将当前地图点的观测数据等其他数…

数据报告:[数字健康]如何引发美国医疗深度变革

本文由前嗅数据研究院出品 在美国,全球疫情的不断发展扩大,促进了其医疗行业的变革与创新,以“Digital Health”(数字健康)为关键词的医疗领域正在发⽣⾰命性的变化。本文着重介绍“Digital Health”的特点及其在各领域…

【博学谷学习记录】超强总结,用心分享|kafka如何保证数据不丢失

文章目录数据在Kafka中的流转阶段一:生产者如何保证数据不丢失ACK机制阶段二:Broker端如何保证数据不丢失磁盘副本阶段三:消费者如何保证数据不丢失消费者提交偏移量数据在Kafka中的流转 阶段一:生产者如何保证数据不丢失 ACK机制 生产者将数据生产到Broker后,Broker需要给一个…

学习python之——python入门

欢迎来到 Python 入门的学习之旅! Python 是一种高级编程语言,它是一种解释型语言,有着丰富的库和大量的第三方模块,能够用于许多不同的编程任务。无论你是想要学习 Python 进行 Web 开发,还是想用它来进行数据分析和…

Windows 远程桌面 Ubuntu

参考 Windows远程桌面工具连接Ubuntu系统使用总结_CHH3213的博客-CSDN博客_远程连接ubuntu 开启ssh服务(非必须 查看ssh是否已经开启 sudo ps -e | grep ssh 如果最后返回是sshd,证明ssh已经开启,跳到第四步 第二步,如果没有…

excel处理时间数据

目录excel中的日期中同时提取年月,可使用YEAR函数提取年份,MONTH函数提取月份,然后使用合并函数“&”将年月合并即可。方法步骤如下: 1、打开需要操作的EXCEL表格,在任意空白单元格上面的函数编辑框中输入“YEAR&…

自动化 HR 流程,实现人力资源部门无纸化

自动化 HR 流程,实现人力资源部门无纸化 如果公司使用手动流程,人力资源部门则可能是纸张最密集的部门之一。使用像Google Docs或Dropbox这样的免费文件共享应用程序可能会感觉比使用纸张更上一层楼。但是,这些应用程序旨在在某个时间点启用…

python居然还能画出这么精美的魔法少女,惊我一整年

前言 大家早好、午好、晚好吖 ❤ ~ 对于上面漫小姐姐图,大家觉得好不好看呢 这种极简的线条画出超具魅力的小姐姐图 简直不要太击中小心脏 接下来,我们就用python来实现一下,画出一个好看的少女~ 代码展示 导入模块 import turtle as te…

VIVADO异步时钟域约束(groups)

异步时钟域约束 VIVADO异步时钟约束之实例演示 操作方法: 1、先在synthesis 中打开 report clock interaction ,可以看到没有约束的异步时钟之间用红色标记; 2、在synthesis中打开edit timing constraints 设置异步时钟; 3、异…

QGroundControl 添加自定义FactGroup

基于QGC4.1.2版本进行添加,首先由于QGC的原来对FactGroup定义均写在Vehicle.h和Vehicle.cc两个文件中,个人感觉都写在Vehicle文件下回导致文件过大,所以将FactGroup定义进行分离,写在各自的.h和.cc文件下,然后在Vehicl…

运动无线耳机哪个品牌比较好、运动效果最好的运动耳机推荐

近几年,运动耳机愈发获得消费者的认可。它拥有着更牢固的佩戴方式,即便是长时间佩戴、也拥有更舒适的体验。因此,运动耳机也受到运动、健身人群的喜爱。但是不少小伙伴跟我反映如何选择一款体验出色的运动耳机,也成为了当前不少运…

计算机sci期刊拒稿两次,重新投稿接受的概率大吗? - 易智编译EaseEditing

重新投稿需要修改的幅度很大,而且就算能接受,时间也会非常久。 要是不着急用可以试试: 根据审稿意见一条条的来修改; 增加新的参考文献; 如果是“修改后重投”,可能需要注意以下问题: 1. 与…

数据可视化,2022A股正式收官,这么特别的一年,你挣钱了吗?

“A股年线止步三连阳!深成指全年累计下跌25.85%;创业板指全年累计下跌累计29.37%;上证50指数累计下跌19.52%;科创50指数累计下跌31.35%。其中,创业板指、深成指仅跑赢俄罗…

循环神经网络-高级篇RNN Classifier

循环神经网络-高级篇RNN Classifier 本篇实现一个循环神经网络的分类器RNN Classifier 我们使用一个数据集包含Name,Country,其中名字有几千个,来自18个不同的国家,我们的目标是训练一个模型,可以实现输入一个名字&a…

cad绘图:AutoCAD 2023 中文

Autodesk AutoCAD 2023是计算机辅助设计(CAD)软件,是世界领先的2D和3D CAD工具。它将允许您使用其强大而灵活的功能来设计和塑造您周围的世界。在3D中加速文档制作,无缝地分享想法,更直观地探索想法。AutoCAD使用户能够从桌面、Web和移动设备…

http 模块

1、什么是 http 模块 http 模块是 Node.js 官方提供的、用来创建 web 服务器的模块。通过 http 模块提供的http.createServer() 方法,就能方便的把一台普通的电脑,变成一台 Web 服务器,从而对外提供Web 资源服务。 如果要希望使用 http 模块…