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

Redis通用常见命令(含面试题)

核心命令

get 根据key取value

set 把key和vlaue存入进去

key和value本事上都是字符串,但在操作的时候可以不用加上引号""

Redis作为键值对的结构,key固定就是字符串,value实际上会有多种类型(字符串哈希表,列表,集合,有序集合...)

基本全局命令

keys命令

查找当前数据库中有 哪些key值, 使用keys pattern命令来查找,pattern格式如下:

?:任意匹配一个字符

*:任意匹配个字符

[ab]:只能匹配a或者b,给出固定的选项

[^a]:排除a,只有a匹配不了

[a-e]:a到e之间的字符都可以匹配

注意:keys的时间复杂度为O(N),在生产环境上一般都会禁止使用keys命令

exists命令

判断key是否存在,返回值为存在的个数。

exists key [key...] 时间复杂度O(N) 这里的N是指key的个数。

del命令

删除指定的key,返回值为存在的个数。

del key [key...] 时间复杂度O(N) 这里的N是指key的个数。

expire命令

作用是给指定的key设置过期时间。key存活时间超出这个限制,就会被自动删除。

expire key seconds 单位时间是秒

pexpire key milliseconds 单位时间为毫秒

注意:此处设定过期的时间,必须是针对已经存在的key设置,返回值为1设置成功,为0设置失败

ttl命令

ttl(time to live)查看当前key的过期时间还剩多少,返回正数表示时间,-1表示没有关联过期时间,-2表示key不存在。

ttl key 返回当前key离过期时间还剩的秒数

pttl key 返回当前key离过期时间还剩的毫秒数

type命令

一般有none(key不存在), string(字符串),list(列表),set(集合),zset(有序集合),hash(哈希表),stream(redis作为消息队列时)

type key 返回key对应的value的数据类型。

经典面试题

redis的key的过期策略是怎么实现的?

redis的整体策略是

1.定期删除

每次抽取一部分,进行验证过期时间,需要保证这个抽取检查的过程足够快,控制好抽取的数量和定期抽取时间。(抽取的数量过多导致验证时间过长容易造成堵塞)

2.惰性删除

如果当前key设置的过期时间已经到了,但是不会立刻删除它,这个key仍然存在,当接下来的访问当中用到了这个key时,于是这次访问就会让redis服务器触发删除这个key的操作,同时在返回一个nil。(类似于在小卖部中有部分过期的食品没有及时处理,当消费者选择了一个商品的时候,老板检查了一下生产日期,如果过期了就会进行处理)

通过上述策略相结合,redis任然可能存在很多过期key被残留,redis为了对这样的问题进行补充,提供了一系列的内存淘汰机制策略。(之后的文章会详细说到)

两种比较高效的定时器设计(redis并未采用)

1.优先级队列

首先设置过期时间越早的,优先级越高。

此时给定时器分配一个线程,只需检查队首元素是否过期即可。

避免检查时间过于频繁,根据当前时间和队首元素过期时间设置一个等待。

当添加一个新任务时,唤醒定时器线程,重新检查队首元素,调整等待时间。

2.时间轮

需要把时间划分成很多小段。(划分的粒度看是实际需求)

在每个小段上都挂着一串链表,每个链表都代表要执行的任务。

根据设计的时间周器,每过一段时间移动一个小段,然后检查每个链表尝试执行任务。

http://www.xdnf.cn/news/16021.html

相关文章:

  • [数据库]Neo4j图数据库搭建快速入门
  • 设备健康管理实施案例:中讯烛龙预测性维护系统的实战应用
  • 基于bert-lstm对微博评论的情感分析系统设计与实现
  • 新版 Java SE 集合框架 Map 篇
  • Pycharm的Terminal打开后默认是python环境
  • Kafka 在分布式系统中的关键特性与机制深度解析
  • 基于Pytorch的人脸识别程序
  • 1948. 删除系统中的重复文件夹
  • 定点小数与分数
  • langchain调用本地ollama语言模型和嵌入模型
  • 线程状态线程安全
  • gradle微服务依赖模版
  • 软件反调试(5)- 基于注册表实时调试器检测
  • [Python] -项目实战7- 用Python和Tkinter做一个图形界面小游戏
  • 我的世界-推理
  • 基于Event Sourcing和CQRS的微服务架构设计与实战
  • 连接语言大模型(LLM)服务进行对话
  • 随着GPT-5测试中泄露OpenAI 预计将很快发布 揭秘GPT-5冲击波:OpenAI如何颠覆AI战场,碾压谷歌和Claude?
  • [硬件电路-58]:根据电子元器件的控制信号的类型分为:电平控制型和脉冲控制型两大类。
  • 威力导演 12:革新级影音创作平台——专业特效与极致效率的完美融合
  • 算法题(176):three states
  • 100个GEO基因表达芯片或转录组数据处理27 GSE83456
  • [simdjson] 实现不同CPU调度 | 自动硬件适配的抽象
  • JAVA面试宝典 -《API设计:RESTful 与 GraphQL 对比实践》
  • Linux操作系统之线程(四):线程控制
  • RabbitMQ核心组件浅析:从Producer到Consumer
  • 【Django】DRF API版本和解析器
  • ubuntu-linux-pycharm-社区版安装与django配置
  • 高性能熔断限流实现:Spring Cloud Gateway 在电商系统的实战优化
  • Linux网上邻居局域网络共享工具Samba及Smb协议,smbd,nmbd服务,smbpasswd,pdbedit命令,笔记250720