Redis一些简单通用命令认识常用数据类型和编码方式认识Redis单线程模型
通用命令
get() / set()
这是Redis中两个最为核心的命令。
set插入
![]()
这里的key 和 value都是字符串,我们可以加双引号 或者单引号,或者不加。
get查找
![]()
如果查询的key值不存在,那么会返回一个 nil ,也就是代表空
![]()
在Redis中命令是不区分大小写的。
这就是Redis最核心的命令和它俩的使用方法了,看起来就像是一个网络版的hash map一样。这也是Redis的一个优势,使用简单 学习成本低。
keys()
在这里补充一下 Redis全局命令的概念
Redis支持很多的数据结构,从整体上来说,Redis是键值对结构,key是固定的字符串,但是value实际上会有多种类型,比如:
字符串 哈希表 列表 集合 有序集合,一般来说操作不同的数据结构就会有不同的命令。
而全局命令就是能够搭配任意一个数据结构使用的命令。
keys():用来查询当前服务器上匹配的key。
语法:
KEYS pattern
其中 pattern(模式)是包含特殊符号的字符串。
这个pattern存在的意义是为了描述另外的字符串长什么样
pattern的使用规则:

一般生产环境中是禁止使用keys的,尤其是 keys *。
注意:keys 命令的时间复杂度 O(N)的,又因为redis是单线程的,所以当数据量很大时,用 keys * 就把redis阻塞了,无法给其他客户端提供服务。
这样带来的结果往往是灾难性的,因为redis作为缓存,它是挡在mysql前,帮mysql分担请求的,如果此时redis阻塞了,那么请求突然就全打往mysql了,mysql可能会突然承受不主压力而挂掉了,如果mysql也挂了,那整个服务差不多也瘫痪了。
exists()
exists():判断key是否存在。 这里的key可以是多个。
返回值: 有效key的个数
针对多个key来说,这是挺有用的。
Redis组织这些key就是按照哈希表的方式来组织的。
关于这个命令的时间复杂度 ,官方给出的是 O(N),但是注意,这里的O(N)中的N指的是我们传入的key的个数,不是传统意义上的O(N)。
有两种写法:

如上,第一种写法查询一次,第二种解法查询两次,那么这两种写法有什么区别呢?
我们始终要记住Redis是 客户端 - 服务器结构的程序,而客户端 与 服务器之间是通过网络来通信的,因此分开的写法会产生更多的轮次的网络通信,导致效率变低。

del()
删除指定的key
可以一次删除一个或者多个
时间复杂度 : (N)跟exists一样
返回值:删掉的key的个数

而Redis删除数据的严重性要看应用场景

不过归根结底还是不要乱删数据。
expire()
给指定的key设置过期时间

语法:
EXPIRE key seconds
成功时返回1,失败时返回0
其中seconds的单位是秒。
这个key得是之前就有的,不然这个命令就会执行失败。
时间复杂度 O(1)
这个命令在有时间限制的场景下应用很广泛,比如手机验证码有效时间。
另外还有关于基于redis实现的分布式锁

补充:
一秒对于计算机来说还是很漫长的,所以还有一个命令 : pexpire ,也就是多加了个p,此时seconds的单位就是毫秒了,用法跟 expire是一样的。
ttl()
查看指定的key的过期时间。单位:秒级
这里的ttl跟网络IP协议那里的TTL是不一样的。
返回值:
返回剩余的过期时间。如果该key没有关联过期时间返回-1,如果该key不存在返回-2。

同样还有一个命令 : pttl 。用法一样,不过单位是毫秒。
补充: Redis的key过期策略
Redis的过期策略是怎么实现的呢? 这也是一道经典的面试题。
如果直接遍历所有key的方式来检查哪些key过期了,效率未免太低了。
对此Redis整体的策略有:
1.定期删除:
周期性的每次抽取一部分key,进行验证过期时间。 Redis会保证这个抽查的速度足够快。
为什么对于定期删除有明确的速度要求,只抽取一部分验证来保证抽查速度快呢?
因为Redis是单线程的程序,它的主要任务都是在单线程中执行的,如果扫描过期的key消耗的时间太多了,就有可能导致正常处理请求命令被阻塞了(产生了类似执行 key * 的效果)。
2.惰性删除:
假设这个key已经过期了,但是暂时还没有删除它,当紧接着后面的一次访问正好用到了这个key,那么服务器就触发了删除key的操作,同时再返回一个nil。
在Redis中这两种删除策略是搭配在一起使用的,但是仍然会存在很多过期的key残留在服务器上,没有及时删除掉,为此Redis还提供了一系列内存淘汰策略。
扩展:

理解定时器的实现原理
1.基于优先级队列/堆
正常的队列是先进先出,而优先级队列是按照指定的优先级,优先级高的先出。
这个优先级是可以自定义的。
在Redis过期key销毁的场景中,距离过期时间越近,那么优先级就越高。
我们把设置了过期时间的key放入到这个堆中,那么堆顶元素就是最早会过期的key。
此时定时器只要分配一个线程,去检查这个堆顶,查看堆顶的元素是否过期即可。
也就是不需要遍历所有key,而是只需要检查堆顶元素即可。
另外,检查堆顶元素的周期也不能太短, 对于下一次检查的时间可以设置为:堆顶元素距离过期的时间。在此期间就让这个线程阻塞挂起就可以了。
另外如果新来了一个元素,那么也会唤醒这个线程,会重新设置下一次的检查时间。
2.基于时间轮实现的定时器
如图,就是一个循环数组,把时间划分成很多小段,划分的粒度要看实际需求。
时间轮运行的时候有一个指针,这个指针每次会按照固定的时间间隔向前移动(这个时间间隔就是我们划分的时间粒度),每走到一个格子上,就会尝试执行这个格子上链表的所有任务,为什么是尝试呢?假设某个key的过期时间超过了这个时间轮能表示的最大时间,那么就会让这个key多转几圈,然后放到对应格子的链表上。并且在执行销毁任务时,还是会检查一下过期时间的,如果发现还没有到就不会销毁的。

type()
返回这个key对应的value的数据类型。
注意:Redis中key的类型只有string。
返回类型:
返回值为none就是没有这个key。
使用示例:

对于操作链表,插入的命令是 lpush 后面跟元素值;对于集合 插入命令是sadd;对于哈希表,插入命令是hset,可见命令都是不一样的。
常用数据结构
redis常用的数据结构有 字符串,哈希,列表,集合,有序集合。

另外Redis在底层实现这些数据结构的时候,会在源码层面针对上面的数据结构的实现进行特定的优化,来达到节省时间/空间的效果,也就是内部具体的数据结构(编码方式)还会有变数。
总结:同一个数据类型,背后的编码实现方式可能是不同的,会根据特定的场景进行优化

比如string类型,当value就是一个整数的时候,此时Redis可能直接会使用int来保存。
再比如hash表,当数据元素比较少时,会用一个ziplist来存储,以此来压缩空间,因为当元素比较少时,它遍历的速度也很快。
关于为什么要压缩?

再看看list set zset
并且在有序集合那里,底层的实现有跳表,因为有序集合里的元素是带有权值的,当需要在某个权值范围内遍历的时候,用跳表就比较合适。
并且在list和zset的ziplist那里,从Redis3.2开始,就引入了新的实现方式:quicklist。
可以使用命令
object encoding key
来查询这个key底层的编码方式


关于Redis单线程模型
Redis单线程工作过程
Redis只用一个线程来处理所有的命令请求。但是不是说Redis服务器内部真的只有一个线程,其他的多线程都是在网络部分处理IO的。
因为Redis实际处理请求是单线程,所以它保证了对收到来自不同客户端的请求的处理是串行化的,也就是不会有线程安全问题。
关于Redis能够使用单线程模型的主要原因:Redis的核心业务逻辑都是 短平快 的,这样的话就不吃CPU资源,也就不吃多核了,所以Redis使用单线程也能很好的工作。
弊端就是:Redis必须特别小心某个操作的时间过长,这样会阻塞其他命令的执行。
Redis单线程快在哪里?
Redis虽然是单线程,但是为什么效率高,速度快?(经典面试题)
首先 Redis的效率高,速度快 是参照于 数据库:MySQL, Oracle,SQL Server的。
原因:
1.Redis访问的是内存,而MySQL这样的数据库访问的是硬盘。
2.Redis的核心逻辑比那些数据库的核心功能要简单。

3.单线程模型,避免了一些不必要的线程竞争开销。
因为Redis的基本操作都是 短平快的,也就是简单操作一下内存,不是什么特别消耗CPU的操作,就算是多线程也提升不大。
4.处理网络IO的时候,用了epoll这样的多路复用机制。
IO多路复用适合交互不是很频繁,大部分时间都在等的场景,如果交互十分频繁(比如下载文件或者直播),此时还是创建一个线程来处理比较好。
相关文章:
Redis一些简单通用命令认识常用数据类型和编码方式认识Redis单线程模型
通用命令 get() / set() 这是Redis中两个最为核心的命令。 set插入 这里的key 和 value都是字符串,我们可以加双引号 或者单引号,或者不加。 get查找 如果查询的key值不存在,那么会返回一个 nil ,也就是代表空 在Redis中命令…...
使用电子模拟器 Wokwi 运行 ESP32 示例(Arduino IDE、VSCode、ESP32C3)
文章目录 Wokwi 简介安装客户端(Mac/Linux)创建 Token Arduino IDEVSCode 配置安装 wokwi 插件打开编译后目录 ESP32C3 示例Arduino IDE创建模拟器运行模拟器 Wokwi 简介 Wokwi 是一款在线电子模拟器。您可以使用它来模拟 Arduino、ESP32、STM32 以及许…...
C嘎嘎入门篇:类和对象(1)
前言: 小编在之前讲述了C的部分入门基础,读者朋友一定要掌握好那些,因为C的学习和C有点不同,C的知识都是比较连贯的,所以我们学好了前面才可以学习后面的内容,本篇文章小编将会讲述C真正的入门篇࿱…...
tomcat服务搭建部署ujcms网站
tomcat服务搭建部署ujcms网站 关闭selinux和防火墙 setenforce 0 && systemctl stop firewalld安装java环境 #卸载原有java8环境 yum remove java*#上传java软件包,并解压缩 tar -xf openjdk-11.0.1_linux-x64_bin.tar.gz && mv jdk-11.0.1 jdk11…...
unity_Occlusion_Culling遮挡剔除学习
unity_Occlusion_Culling遮挡剔除学习 文档: https://docs.unity.cn/cn/2019.4/Manual/occlusion-culling-getting-started.html没彻底搞明白,但是会用,虽然也不熟练 设置遮挡剔除 打开遮挡剔除面板 设置场景物体。设置为静态 设置场景 烘…...
vue初学随笔
Vue基础 Vue基本概念 Vue是什么 Vue是一个渐进式的JavaScript框架,它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。 渐进式:各个特性可以根据项目需要逐渐引入和…...
IDEA Dependency Analyzer 分析 maven 项目包的依赖
一、场景分析 javax.validation 是我们 SpringMVC 常用的数据校验框架。但是 javax.validation 是一个规范(Java Bean Validation,简称 JSR 380),它并没有具体的实现,它的常用实现,是hibernate-validator。…...
微信小程序 - 最新详细安装使用 Vant weapp UI 框架环境搭建详细教程
前言 自从 2024 年开始,小程序做了很多改变和升级, 导致网上很多搭建教程文章的教程失效了,本文来做最新的教程。 第一步 为了更贴合新手,我这里创建了一个纯净无任何业务代码的小程序项目。...
【C语言】手把手带你拿捏指针(完)(指针笔试、面试题解析)
文章目录 一、sizeof和strlen的对⽐1.sizeof2.strlen3.sizeof与strlen对比 二、数组和指针笔试解析1.一维数组2.字符、字符串数组和字符指针代码1代码2代码3代码4代码5代码6 3.二维数组4.总结 三、指针运算笔试题解析代码1代码2代码3代码4代码5代码6 一、sizeof和strlen的对⽐ …...
Vue中input框自动聚焦
在Vue中input自动聚焦的思路: 给需要聚焦的input设置ref <el-inputv-model"loginForm.username"ref"userNameInput"name"username"type"text"auto-complete"on"placeholder"username"keyup.enter.…...
基于Node.js+Express+MySQL+VUE实现的计算机毕业设计旅游推荐网站
猜你喜欢评论 登录注册搜索 推荐定制景点/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序 功能图如下所示: 一、设计目标 本次计算机毕业设计项目的主要目标是设计和开发一款功能完善、用户友好的旅游推荐网站。该网站旨在为广大旅游爱好者提供一个便捷、…...
已存在的Python项目使用依赖管理工具UV
1. 文档 uv文档 2. 如何转换 初始化 uv initrequirements.txt转换成pyproject.toml uv add $(cat requirements.txt)删除requirements.txt 如果更新pyproject.toml之后,使用命令 uv sync替换项目环境 如果有库没有加入依赖,自己手动加一下&am…...
JavaWeb美食推荐管理系统
目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 spring-mybatis.xml3.5 spring-mvc.xml3.5 login.jsp 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优…...
如何像专家一样修复任何 iPhone 上的“iPhone 已禁用”错误
“我忘记了密码,并且我的 iPhone 在多次输入错误密码后就被禁用了,如何再次访问我的手机?” 作为最安全的数字设备之一,iPhone 必须使用正确的密码解锁。即使您可以使用 Face ID 或 Touch ID 访问您的设备,在充电或重…...
django drf to_representation
使用场景 1.需要对结果的中的某个字段进行进一步的处理; 2.模型类中没有的字段,添加到结果中进行响应; 例子 from django.db import modelsclass TestModel(models.Model):name models.CharField(_("名称"), max_length50, nul…...
2024最新国内镜像源设置(npm、yarn、pnpm)
淘宝镜像源https://registry.npmmirror.com/ 腾讯云镜像源https://mirrors.cloud.tencent.com/npm/ cnpm是一个基于npm的中国镜像源https://r.cnpmjs.org/ # 查询当前使用的镜像源 npm get registry# 设置为淘宝镜像源 npm config set registry https://registry.npmmirror.co…...
Java线程池和原子性
文章目录 前言1 线程池1.1 线程池概述1.1.1 线程池存在的意义1.1.2 Executors默认线程池 1.2 线程状态介绍1.2.1 线程状态源码1.2.2 线程状态含义1.2.3 线程状态转换图 2 原子性2.1 volatile关键字2.2 synchronized解决2.3 原子性2.4 AtomicInteger类2.5 悲观锁和乐观锁 前言 …...
【数据评估与清洗】对数据结构和内容进行清洗
评估数据 结构方面 需要清理:乱数据不需要清理:整洁数据 每列是一个变量每行是一个观察值每个单元格是一个值 内容方面 需要清理:脏数据 丢失数据重复数据不一致数据无效或错误数据 不需要清理:干净数据 # 获取整体信息 df.in…...
机器学习和深度学习的区别
1. 基本概念 1.1 机器学习定义 机器学习是人工智能的一个核心分支,它赋予计算机系统无需明确编程即可学习和改进的能力。通过分析大量数据,机器学习算法能够识别数据中的模式和趋势,从而做出预测或决策。这种方法通常涉及统计模型和优化技术…...
UE虚幻引擎云渲染汽车动画的优势!
在汽车广告和动画制作领域,虚幻引擎(UE)结合云渲染技术正掀起一场技术革命。这项技术以其高性能、成本效益和灵活性,为创作者提供了强大的工具,以实现更加逼真和高效的汽车动画制作。 一、为什么选择UE虚幻引擎制作汽车…...
基于电子纸与ESP32的物联网桌面日历制作指南
1. 项目概述:打造一个永不掉电的桌面物联网日历如果你和我一样,喜欢在桌面上放点既实用又有科技感的小玩意儿,那么这个基于电子纸的物联网日历绝对能让你眼前一亮。它不像普通屏幕那样需要一直插着电,显示完日历后,你甚…...
BeagleBone Black设备树覆盖层实战:从原理到自定义SPI/UART配置
1. 项目概述:为什么BeagleBone Black开发者必须掌握设备树?如果你正在使用BeagleBone Black(BBB)进行嵌入式开发,并且已经不止一次地困惑于为什么某个外设(比如UART、SPI或者某个GPIO)无法按预期…...
Node.js性能预测工具nodestradamus:从监控到预警的实践指南
1. 项目概述与核心价值最近在折腾一些服务器监控和性能预测的活儿,偶然间在GitHub上发现了一个叫nodestradamus的项目,作者是ChristosGrigoras。这个名字挺有意思,结合了“Node.js”和“诺查丹玛斯”(那位著名的预言家)…...
FontForge:从零到一的免费字体设计全攻略
FontForge:从零到一的免费字体设计全攻略 【免费下载链接】fontforge Free (libre) font editor for Windows, Mac OS X and GNULinux 项目地址: https://gitcode.com/gh_mirrors/fo/fontforge 你是否曾经想过亲手设计一款属于自己的字体?也许你为…...
Nuxt.js Tailwind CSS 模块:零配置快速启动现代Web开发
Nuxt.js Tailwind CSS 模块:零配置快速启动现代Web开发 【免费下载链接】tailwindcss Tailwind CSS module for Nuxt 项目地址: https://gitcode.com/gh_mirrors/tai/tailwindcss Nuxt.js Tailwind CSS 模块是一个专为Nuxt框架设计的Tailwind CSS集成解决方案…...
AURIX Tricore TC397开发实战:基于UDE的仿真调试与问题排查指南
1. 环境准备与工具安装 第一次接触AURIX Tricore TC397的开发板时,我完全被它强大的多核架构吸引住了。这款芯片在汽车电子领域应用广泛,但调试过程确实让不少新手头疼。经过几个项目的实战,我总结出一套基于UDE的调试方法,能帮你…...
借助 Taotoken 多模型聚合能力为开源项目构建智能问答机器人
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 借助 Taotoken 多模型聚合能力为开源项目构建智能问答机器人 为开源项目添加一个智能问答助手,能显著提升社区体验&…...
AI工作效率入门:普通人必须了解的10个AI工具
AI工作效率入门:普通人必须了解的10个AI工具你不需要是程序员,也不需要懂技术,只需要会用这10个工具,你的工作效率就能翻倍。为什么普通人也需要学AI工具? 根据麦肯锡2024年的调研报告,使用AI辅助工作的员工…...
告别手动切号!全栈实战:用AI辅助编写一个「多平台海量私信秒回」系统
最近在研究全网营销和客资管理系统,看到这样两张产品宣传图,直击痛点:一个工作台,快速处理海量私信/评论(告别多个聊天窗口来回切换)。7x24小时在线,AI秒回客户(告别响应时间长、客户…...
FanControl风扇控制技术深度解析:Windows系统兼容性优化与高级温控实战指南
FanControl风扇控制技术深度解析:Windows系统兼容性优化与高级温控实战指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.co…...
