【Redis】Redis 预备知识

目录

1. 基本全局命令 

KEYS

EXISTS

DEL

EXPIRE

TTL

TYPE

2. 数据结构和内部编码

3. 单线程架构


        Redis 提供了5种数据结构,理解每种数据结构的特点对于 Redis 开发运维非常重要,同时掌握每种数据结构的常见命令,会在使用 Redis 的时候做到游刃有余。本章内容如下:

  1. 预备知识:几个全局(generic)命令,数据结构和内部编码,单线程式机制分析。
  2. 5 种数据结构的特点、命令使用、应用场景示例。
  3. 键遍历、数据库管理。

       在正式介绍5种数据结构之前,了解一下 Redis 的一些全局命令、数据结构和内部编码、单线程命令处理机制是十分必要的,它们能为后面内容的学习打下一个良好的基础.
主要体现在两个方面:
1) Redis 的命令有上百个,如果纯靠死记硬背比较困难,但是如果理解 Redis 的一些机制,会发现这些命令有很强的通用性。
2) Redis不是万金油,有些数据结构和命令必须在特定场景下使用,一旦使用不当可能对 Redis 本身或者应用本身造成致命伤害。

1. 基本全局命令 

Redis有5种数据结构,但它们都是键值对种的值,对于键来说有一些通用的命令。

KEYS

返回所有满足样式 (pattern) 的 key。支持如下统配样式。

语法

KEYS pattern

时间复杂度:0(N)

返回值:匹配 pattern 的所有 key。

示例:

127.0.0.1:6379> keys *name*
1) "lastname"
2) "firstname"
127.0.0.1:6379> keys a??
1) "age"
127.0.0.1:6379> keys *
1) "lastname"
2) "age"
3) "firstname"

EXISTS

判断某个 key 是否存在。

语法:

EXISTS key [key ...]

返回值:key存在的个数。

时间复杂度:0(1)

示例:

127.0.0.1:6379> set key1 "hello"
OK
127.0.0.1:6379> exists key1
(integer) 1
127.0.0.1:6379> exists nosuchkey
(integer) 0
127.0.0.1:6379> set key2 "world"
OK
127.0.0.1:6379> exists key1 key2 nosuchkey
(integer) 2

DEL

删除指定的 key。

语法:

DEL key [key ...]

返回值:删除掉的 key 的个数。

时间复杂度:0(1)

示例:

127.0.0.1:6379> set key1 "hello"
OK
127.0.0.1:6379> set key2 "world"
OK
127.0.0.1:6379> del key1 key2 key3
(integer) 2

EXPIRE

为指定的 key 添加秒级的过期时间(Time To Live TTL)

语法:

EXPIRE key seconds

时间复杂度:0O(1)

返回值:1表示设置成功。0表示设置失败。

示例:

127.0.0.1:6379> set key "hello"
OK
127.0.0.1:6379> expire key 10
(integer) 1
127.0.0.1:6379> ttl key
(integer) 8

TTL

获取指定 key 的过期时间,秒级。

语法:

TTL key

时间复杂度:0(1)

返回值:剩余过期时间。-1表示没有关联过期时间,-2 表示 key不存在。

示例:

127.0.0.1:6379> flushall
OK
127.0.0.1:6379> set key "hello"
OK
127.0.0.1:6379> expire key 10
(integer) 1
127.0.0.1:6379> ttl key
(integer) 9
127.0.0.1:6379> ttl nokey
(integer) -2

关于键过期机制,可以参考下图所示。

键的过期机制

Redis 的 key 的过期删除策略是怎样的?

惰性过期

        只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。

定期过期

       每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。
       expires字典会保存所有设置了过期时间的key的过期时间数据,其中,key是指向键空间中的某个键的指针,value是该键的毫秒精度的UNIX时间戳表示的过期时间。键空间是指该Redis集群中保存的所有键。

Redis 中同时使用了惰性过期和定期过期两种过期策略:

  • 每隔 100ms 就随机抽取一定数量的key来检查和删除的。
  • 在获取某个key的时候,redis 会检查一下,这个key如果设置了过期时间并且已经过期了,此时就会删除。 

 

TYPE

返回 key 对应的数据类型。

语法:

TYPE key

时间复杂度:0(1)

返回值: none,string,list, set,zset,hash,stream

示例:

127.0.0.1:6379> set key1 "value"
OK
127.0.0.1:6379> lpush key2 value
(integer) 1
127.0.0.1:6379> sadd key3 value
(integer) 1
127.0.0.1:6379> type key1
string
127.0.0.1:6379> type key2
list
127.0.0.1:6379> type key3
set

本小结只是抛砖引玉,给出几个通用的命令,为5种数据结构的使用做一个热身,后续章节将对
键管理做一个更为详细的介绍。

2. 数据结构和内部编码

type 命令实际返回的就是当前键的数据结构类型,它们分别是:string(字符串)、list(列
表)、hash(哈希)、set(集合)、zset(有序集合),但这些只是Redis 对外的数据结构,如图所示。

Redis的5种数据类型

实际上 Redis 针对每种数据结构都有自己的底层内部编码实现,而且是多种实现,这样 Redis 会
在合适的场景选择合适的内部编码.

Redis 数据结构和内部编码

可以看到每种数据结构都有至少两种以上的内部编码实现,例如 list 数据结构包含了 linkedlist 和
ziplist 两种内部编码。同时有些内部编码,例如 ziplist,可以作为多种数据结构的内部实现,可以通过 object encoding 命令查询内部编码:

127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> lpush mylist a b c
(integer) 3
127.0.0.1:6379> object encoding hello
"embstr"
127.0.0.1:6379> object encoding mylist
"quicklist"

可以看到 hello 对应值的内部编码是 embstr,键 mylist 对应值的内部编码是 ziplist。

Redis 这样设计有两个好处:

1) 可以改进内部编码,而对外的数据结构和命令没有任何影响,这样一旦开发出更优秀的内部编码,无需改动外部数据结构和命令,例如 Redis 3.2 提供了 quicklist,结合了 ziplist 和 linkedlist 两者的优势,为列表类型提供了一种更为优秀的内部编码实现,而对用户来说基本无感知。
2) 多种内部编码实现可以在不同场景下发挥各自的优势,例如 ziplist 比较节省内存,但是在列表元素比较多的情况下,性能会下降,这时候 Redis 会根据配置选项将列表类型的内部实现转换为
linkedlist,整个过程用户同样无感知。

3. 单线程架构

Redis 使用了单线程架构来实现高性能的内存数据库服务,本节首先通过多个客户端命令调用的例
子说明 Redis 单线程命令处理机制,接着分析 Redis 单线程模型为什么性能如此之高,最终给出为什么理解单线程模型是使用和运维 Redis 的关键。

引出单线程模型

现在开启了三个 redis-cli 客户端同时执行命令。

客户端1设置一个字符串键值对:

127.0.0.1:6379> set hello world

客户端2 对 counter 做自增操作:

127.0.0.1:6379> incr counter

客户端3对 counter 做自增操作:

127.0.0.1:6379> incr counter

我们已经知道从客户端发送的命令经历了:发送命令、执行命令、返回结果三个阶段,其中我们
重点关注第2步。我们所谓的 Redis 是采用单线程模型执行命令的是指: 虽然三个客户端看起来是同时要求 Redis 去执行命令的,但微观角度,这些命令还是采用线性方式去执行的,只是原则上命令的执行顺序是不确定的,但一定不会有两条命令被同步执行,如图 2-3、2-4、2-5 所示,可以想象 Redis内部只有一个服务窗口,多个客户端按照它们达到的先后顺序被排队在窗口前,依次接受 Redis 的服务,所以两条 incr 命令无论执行顺序,结果一定是2,不会发生并发问题,这个就是 Redis 的单线程执行模型。

2.为什么单线程还能这么快

通常来讲,单线程处理能力要比多线程差,例如有 10000 公斤货物,每辆车的运载能力是每次
200 公斤,那么要 50 次才能完成;但是如果有 50 辆车,只要安排合理,只需要依次就可以完成任
务。那么为什么 Redis 使用单线程模型会达到每秒万级别的处理能力呢? 可以将其归结为三点:

a. 纯内存访问。Redis 将所有数据放在内存中,内存的响应时长大约为 100纳秒,这是 Redis 达到每秒万级别访问的重要基础。

b. 非阻塞 IO。Redis 使用 epoll 作为 I/O 多路复用技术的实现,再加上 Redis 自身的事件处理模型
将 epoll 中的连接、读写、关闭都转换为事件,不在网络 I/O  上浪费过多的时间,如图 2-6所示。

c. 单线程避免了线程切换和竞态产生的消耗。单线程可以简化数据结构和算法的实现,让程序
型更简单: 其次多线程避免了在线程竞争同一份共享数据时带来的切换和等待消耗。

虽然单线程给 Redis 带来很多好处,但还是有一个致命的问题: 对于单个命令的执行时间都是有
要求的。如果某个命令执行过长,会导致其他命令全部处于等待队列中,迟迟等不到响应,造成客户端的阻塞,对于 Redis 这种高性能的服务来说是非常严重的,所以 Redis 是面向快速执行场景的数据库。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Facebook广告无法投放是什么原因?

Facebook作为全球知名的社媒平台,同时也成为许多知名海外企业的广告首选。但很投手在投放过程中也发现,Facebook 广告投放失败或者被拒投,那到底为什么呢? 其实Facebook广告有着非常严格的审核制度,通常投放失败可能是…

【uniapp】轮播图

前言 Uniapp的swiper组件是一个滑块视图容器组件&#xff0c;可以在其中放置多个轮播图或滑动卡片。它是基于微信小程序的swiper组件进行封装&#xff0c;可以在不同的平台上使用&#xff0c;如微信小程序、H5、App等。 效果图 前端代码 swiper组件 <template><vi…

【JavaEE】多线程(3)

首先回顾一下线程不安全的原因&#xff1a; 线程是随机调度&#xff0c;抢占式执行的修改共享数据&#xff0c;多个线程修改同一个变量多个线程修改共享数据的操作不是原子性&#xff0c;&#xff08;count是3个CPU指令&#xff0c;但是赋值操作就是原子性的&#xff09;内存可…

(0基础保姆教程)-JavaEE开课啦!--12课程(Spring MVC注解 + Vue2.0 + Mybatis)-实验10

一、常见的SpringMVC注解有哪些&#xff1f; 1.Controller&#xff1a;用于声明一个类为 Spring MVC 控制器。 2.RequestMapping&#xff1a;用于将 HTTP 请求映射到特定的处理方法上。可以指定请求类型&#xff08;GET、POST等&#xff09;和URL路径。 3.GetMapping&#xff…

20241124 Typecho 视频插入插件

博文免不了涉及到视频插入这些,网上的插件都或多或少的比较重,和Typecho的风格不搭配 后面就有了DPlay插件精简而来的VideoInsertion插件 VideoInsertion: Typecho 视频插入插件 目录结构 rockhinlink-ht2:/var/www/html/typecho/usr/plugins/VideoInsertion$ tree -h [4.…

网络地址转换

NAT概述 解决公有地址不足&#xff0c;并且分配不均匀的问题 公有地址&#xff1a;由专门的机构管理、分配&#xff0c;可以在因特网上直接通信 私有地址&#xff1a;组织和个人可以任意使用&#xff0c;只能在内网使用的IP地址 A、B、C类地址中各预留了一些私有IP地址 A&…

H5流媒体播放器EasyPlayer.js网页直播/点播播放器如果H.265视频在播放器上播放不流畅,可以考虑的解决方案

随着流媒体技术的迅速发展&#xff0c;H5流媒体播放器已成为现代网络视频播放的重要工具。其中&#xff0c;EasyPlayer.js网页直播/点播播放器作为一款功能强大的H5播放器&#xff0c;凭借其全面的协议支持、多种解码方式以及跨平台兼容性&#xff0c;赢得了广泛的关注和应用。…

以达梦为数据库底座时部署的微服务页面报乱码,调整兼容模式

1.问题描述 部署微服务&#xff0c;文件、代码是延用的mysql类型的&#xff0c;部署前做了部分适配&#xff0c;但是在使用dm数据库进行安装的服务在页面上查询出的数据却都是乱码 2.查询官网&#xff0c;注意到一个参数COMPATIBLE_MODE兼容模式的配置 考虑是延用mysql&…

【RL Base】强化学习核心算法:深度Q网络(DQN)算法

&#x1f4e2;本篇文章是博主强化学习&#xff08;RL&#xff09;领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅…

Spring Boot【三】

自动注入 xml中可以在bean元素中通过autowire属性来设置自动注入的方式&#xff1a; <bean id"" class"" autowire"byType|byName|constructor|default" /> byName&#xff1a;按照名称进行注入 byType&#xff1a;按类型进行注入 constr…

软件报错:找不到vcomp140.dll的原因分析,总结六种解决vcomp140.dll的方法

vcomp140.dll是一个与MicrosoftVisualCRedistributableforVisualStudio2015相关的动态链接库文件&#xff0c;主要用于支持并行编程。这个DLL文件是VisualC库的一部分&#xff0c;用来处理并行计算&#xff0c;特别是那些利用OpenMP(OpenMulti-Processing)技术编写的程序。分析…

android 项目多电脑共用github及github项目迁移

背景&#xff1a;最新需要将公司的项目在本地电脑进行使用&#xff0c;将项目迁移到本地电脑。 操作步骤&#xff1a; ssh 公钥绑定github上 : https://blog.csdn.net/mo_sss/article/details/137910910 用github进行克隆时无法下载&#xff08;已将本地创建的公钥上传gith…

常用元器件使用方法18:单节锂电池充电管理芯片XT4052的使用方法

文章目录 一、产品概述二、产品特点三、典型应用电路图四、引脚分配五、应用电路六、PCB应用建议一、产品概述 XT4052 是一个完善的单片锂离子电池恒流/恒压线形电源管理芯片。它薄的尺寸和小的外包装使它便于便携应用。更值得一提的是,XT4052专门设计适用于USB的供电规格。得…

java八股-分布式服务的接口幂等性如何设计?

文章目录 接口幂等token Redis分布式锁 原文视频链接&#xff1a;讲解的流程特别清晰&#xff0c;易懂&#xff0c;收获巨大 【新版Java面试专题视频教程&#xff0c;java八股文面试全套真题深度详解&#xff08;含大厂高频面试真题&#xff09;】 https://www.bilibili.com/…

python的字体如何调整

首先打开pycharm&#xff0c;新建一个Python文件&#xff0c;点击“File”&#xff0c;在下拉菜单栏中选择“New”。 然后点击“File”&#xff0c;输入我们的Python文件名称&#xff0c;后缀一定要填写“.py”&#xff0c;要不会出错&#xff0c;单击“OK”。 在新文件中输入代…

【Linux系列】Chrony时间同步服务器搭建完整指南

1. 简介 Chrony是一个用于Linux系统的高效、精准的时间同步工具&#xff0c;通常用于替代传统的NTP&#xff08;Network Time Protocol&#xff09;服务。Chrony不仅在系统启动时提供快速的时间同步&#xff0c;还能在时钟漂移较大的情况下进行及时调整&#xff0c;因此广泛应…

Ubuntu问题 -- 使用scp将本机文件传输至ubuntu服务器中

目的 临时没有文件传输工具使用一条命令快速传输指定文件或文件夹 使用scp命令 传输指定文件 scp -P 22 D:\Storage\myCache\UE\Linux_ue_demo.zip txl10.1.112.93:/home/txl-P是远程机器的ssh端口号, SCP&#xff08;安全复制协议&#xff09;使用和SSH&#xff08;安全外壳…

Web 毕设篇-适合小白、初级入门练手的 Spring Boot Web 毕业设计项目:电影院后台管理系统(前后端源码 + 数据库 sql 脚本)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 项目介绍 2.0 用户登录功能 3.0 用户管理功能 4.0 影院管理功能 5.0 电影管理功能 6.0 影厅管理功能 7.0 电影排片管理功能 8.0 用户评论管理功能 9.0 用户购票功…

PHP 函数的未来发展有哪些变化呢

PHP 8.0 引入了一些新特性&#xff0c;比如 JIT 编译器、联合类型、nullsafe 运算符等。 JIT 编译器 (Just-In-Time Compiler)&#xff1a;PHP 8.0 引入了实验性的 JIT 编译器&#xff0c;可以显著提高代码执行速度。联合类型&#xff08;Union Types&#xff09;&#xff1a;…

Java文件遍历那些事

文章目录 一、简要概述二、文件遍历几种实现1. java实现2. Apache common-io3. Spring 三、最终结论 一、简要概述 文件遍历基本上是每个编程语言具备的基本功能&#xff0c;Java语言也不例外。下面我们以java原生实现&#xff0c;Apache common-io、spring框架实现为例来比较…