Redis的使用和原理

news2024/10/6 8:34:01

目录

1.初识Redis

1.1 Redis是什么?

1.2 Redis的特性

1.2.1 速度快

1.2.2 基于键值对的数据结构服务器

1.2.3 丰富的功能

1.2.4 简单稳定

1.2.5 持久化

1.2.6 主从复制

1.2.7 高可用和分布式

1.3 Redis的使用场景

1.3.1 缓存

1.3.2 排行榜系统

1.3.3 计数器应用

1.3.4 社交网络

1.3.5 消息队列

2.Redis常见的数据类型

2.1 基本全局命令

2.1.1 KEYS

2.1.2 EXISTS

2.1.3 DEL

2.1.4 EXPIRE

2.1.5 TTL

2.1.6 TYPE

2.2 数据结构和内部编码


1.初识Redis

1.1 Redis是什么?

Redis是一个在内存中存储数据的中间件,用于作为数据库,用于作为数据缓存,在分布式系统中有很大的用处,由于Redis将所有的数据存储在内存中,所以Redis的读写性能非常高效

1.2 Redis的特性

1.2.1 速度快

1)Redis数据存储在内存中,所以就比访问硬盘的数据库快很多

2)Redis的核心功能都是比较简单的操作内存的数据结构

3)从网络的角读看,Redis使用了IO多路复用的方式,一个线程管理多个socket

4)Redis使用了单线程模型,减少了不必要的线程之间的竞争开销

1.2.2 基于键值对的数据结构服务器

Redis是一种基于键值对的NoSQL数据库,与很多键值对数据库不同的是,Redis中的值可以是由String、hash、list、set、zset(有序集合)、Bitmaps(位图)等多种数据结构和算法组成,因此Redis可以满足很多的应用场景

1.2.3 丰富的功能

除了5中数据结构,Redis海提供了许多额外的功能:

1)提供了键过期功能,可以用来实现缓存

2)提供了发布订阅功能,可以用来实现消息系统

3)支持Lua脚本功能,可以利用Lua创建出新的Redis命令

4)提供了简单的事务功能,能在一定程度上保证事务特性

5)提供了流水线功能,客户端能将一批命令一次性传到Redis,减少了网络的开销

1.2.4 简单稳定

Redis的简单主要表现在三个方面,首先,Redis的源码很少,相对于很多NoSQL数据库来说代码量相对要少很多。其次,Redis使用单线程模型,使得Redis服务端处理模型变得简单。最后,Redis不需要依赖其他操作系统中的类库,自己实现了事件处理的相关功能

1.2.5 持久化

通常看,将数据放在内存中不安全,一旦发生断电,重要的数据可能就会丢失,因此Redis提供了两种持久化的方式:RDB和AOF,使用两种策略将内存的数据保存到硬盘中,这样就保证了数据的可持久化

1.2.6 主从复制

Redis提供了复制功能,实现了多个相同的Redis副本,复制功能是分布式Redis的基础

1.2.7 高可用和分布式

Redis提供了高可用实现的Redis哨兵(Redis Sentinel),能够保证Redis结点的故障发现和故障自动转移,也提供了Redis集群(Redis Cluster),是真正的分布式实现,提供了高可用、读写和容量的扩展性

1.3 Redis的使用场景

1.3.1 缓存

缓存机制几乎在所有的网站都有使用,合理的使用缓存可以加速数据的访问速度,Redis提供了键值对过期时间设置,并且也提供了灵活控制最大内存和内存溢出后的淘汰策略

1.3.2 排行榜系统

Redis提供了列表和有序集合的结构,合理地使用这些数据结构可以很方便地构建各种排行榜系统

1.3.3 计数器应用

在视频网站中,每播放一次视频播放量就加1,如果并发量很大对于传统关系型数据的性能是⼀种挑战,Redis天然支持计数功能而且计数的性能也非常好,可以说是计数器系统的重要选择

1.3.4 社交网络

由于社交网站访问量通常比较大,而且传统的关系型数据不太合适保存这种类型的数据,Redis提供的数据结构可以相对比较容易地实现这些功能

1.3.5 消息队列

消息队列系统可以说是一个大型网站的必备基础组件,因为其具有业务解耦、非实时业务削峰等特性。Redis提供了发布订阅功能和阻塞队列的功能,对于一般的消息队列功能基本可以满足

2.Redis常见的数据类型

2.1 基本全局命令

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

2.1.1 KEYS

返回所有满足样式的key,例如

h?llo匹配hello,hallo和hxllo,?匹配任意一个字符

h*llo匹配hllo,hello,heeeello,*匹配0个或者多个任意字符

h[ae]llo匹配hello和hallo,[ae]只能匹配a和e

h[^e]匹配hallo,hxllo,[^e]排除e,其他都能匹配

h[a-b]llo匹配hallo和hbllo,只匹配a-b之间的范围,包含两侧边界

keys的时间复杂度是O(N),其中keys *(查询redis中的所有key)

2.1.2 EXISTS

判断某个key是否存在

时间复杂度:O(1)

返回值:key存在的个数

2.1.3 DEL

删除指定的key

时间复杂度:O(1)

返回值:删除掉key的个数

2.1.4 EXPIRE

为指定的key添加秒级的过期时间,key存活时间超过指定的值就会被自动删除

时间复杂度:O(1)

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

2.1.5 TTL

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

时间复杂度:O(1)

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

2.1.6 TYPE

返回key对应的数据类型,Redis的所有key都是String,key对应的value可能会存在多种类型

时间复杂度:O(1)

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

总结:

keys:用来查看匹配规则的key

exists:用来判定指定key是否存在

del:删除指定的key

expire:给key设置过期时间

ttl:查询key的过期时间

type:查询key对应的value的类型

2.2 数据结构和内部编码

type命令实际返回的就是当前键的数据结构类型,它们分别是:String、list、hash、set、zest,这些只是Redis对外的数据结构

Redis数据结构和内部编码

String

raw:最基本的字符串

int:redis通常也可以用来实现一些"计数"功能,当value是一个整数的时候,此时可能redis会直接使用int来保存

embstr:针对短字符串进行的特殊优化

hash

hashtable:最基本的哈希表

ziplist:压缩列表,当哈希表里面的元素比较少时,可能就优化成ziplist,从而节省空间

list

linkedlist:链表

ziplist:压缩列表

从Redis3.2开始,引入新的实现方式quicklist,它同时兼顾了linkedlist和ziplist的优点,其中quicklist就是一个链表,每个元素又是一个ziplist,兼顾到时间和空间

set

intset:集合中存的都是整数

zset

skiplist:跳表

上述每种数据结构都有至少两种以上的内部编码实现,其中可以通过object encoding命令来查询内部编码

hello对应值的内部编码时embstr,mylist对应值的内部编码时ziplist

Redis这样设计有两个好处:

1)可以改进内部编码,而对外的数据结构和命令没有任何影响,因此一旦开发出更优秀的内部编码,无需改动外部数据结构和命令,形成了高内聚低耦合,例如Redis3.2提供了quicklist,它是结合了ziplist和linkedlist两者的优点,为列表类型提供了一种更为优秀的内部编码实现,用户是感知不到的

2)多种内部编码实现可以在不同场景下发挥各自的优势,例如ziplist比较节省内存,但是在列表元素比较多的情况下,性能会下降,这时候Redis会根据配置选项将列表类型的内部实现转换为
linkedlist,整个过程用户也感知不到

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

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

相关文章

Firefox 编译指南2024 Windows10-使用Git 管理您的Firefox(五)

1. 引言 在现代软件开发中,版本控制系统(VCS)是不可或缺的工具,它不仅帮助开发者有效管理代码的变化,还支持团队协作与项目管理。Mercurial 是一个高效且易用的分布式版本控制系统,其设计目标是简洁、快速…

第二十三课,再识字符串

前言,再识字符串 字符串是我们学习python编程第一眼见到的东西,一行print(“hello world”)可谓是太亲切了,但在此之前我们对字符串的认知也仅局限于如何用单引号、双引号、三引号去定义字符串并打印,今天开始我们就更深入地去理…

详细介绍MySQL的索引(下)

索引的使用 同一条数据在未创建索引的情况下耗时: nick字段是未创建索引的 select * from t_user WHERE nick 邹丽;SHOW PROFILES; 耗时为: user_account字段创建了唯一索引 select * from t_user WHERE user_account 13781945844;SHOW PROFILES;…

重温react-06(初识函数组件和快速生成格式的插件使用方式)

开始 函数组件必然成为未来发展的趋势(个人见解),总之努力的去学习,才能赚更多的钱.加油呀! 函数组件的格式 import React from reactexport default function LearnFunction01() {return (<div>LearnFunction01</div>) }以上是函数式组件的组基本的方式 快捷生…

前端优化:首屏加载速度的实践

目录 目录 前言 多图片的懒加载 避免用户多次点击请求 骨架屏原理 结束语 前言 随着互联网技术的飞速发展&#xff0c;前端网页逐渐取代了传统客户端成为用户获取信息、进行交互的重要渠道&#xff0c;但是网页也有常见的弊端&#xff0c;比如网页首屏加载速度的快慢直接…

大模型压缩量化方案怎么选?无问芯穹Qllm-Eval量化方案全面评估:多模型、多参数、多维度

基于 Transformer架构的大型语言模型在各种基准测试中展现出优异性能&#xff0c;但数百亿、千亿乃至万亿量级的参数规模会带来高昂的服务成本。例如GPT-3有1750亿参数&#xff0c;采用FP16存储&#xff0c;模型大小约为350GB&#xff0c;而即使是英伟达最新的B200 GPU 内存也只…

5G NR PUSCH物理层过程

物理层过程 加扰 假设要在单个码字q上传输的bit块为 b ( q ) ( 0 ) , . . . , b ( q ) ( M b i t ( q ) − 1 ) b^{(q)}(0),...,b^{(q)}(M_{bit}^{(q)} - 1) b(q)(0),...,b(q)(Mbit(q)​−1) &#xff0c;其中 M b i t ( q ) M_{bit}^{(q)} Mbit(q)​是总比特数&#xff0c;加…

MySQL高级-MVCC-隐藏字段

文章目录 1、介绍2、测试2.1、进入服务器中的 /var/lib/mysql/atguigu/2.2、查看有主键的表 stu2.3、查看没有主键的表 employee2.3.1、创建表 employee2.3.2、查看表结构及其其中的字段信息 1、介绍 ---------------- | id | age | name | ---------------- | 1 | 1 | Js…

云计算与 AI 融合:Amazon Connect 开创客户服务智能时代

在亚马逊云科技 re:Invent 2023 大会上&#xff0c;Amazon Connect 引入生成式人工智能功能&#xff0c;标志着客户服务迎来了智能化的新时代。云计算作为提供弹性、可靠、高效服务的基础&#xff0c;与人工智能的融合为客户服务注入了新的活力。这次推出的新功能不仅仅是技术的…

Python和MATLAB粘性力接触力动态模型半隐式欧拉算法

&#x1f3af;要点 &#x1f3af;运动力模型计算制作过程&#xff1a;&#x1f58a;相机捕捉网球运动图&#xff0c;制定运动数学模型&#xff0c;数值微分运动方程 | &#x1f58a;计算运动&#xff0c;欧拉算法离散积分运动&#xff0c;欧拉-克罗默算法微分运动方程 &#…

神经网络实战2-损失函数和反向传播

其实就是通过求偏导的方式&#xff0c;求出各个权重大小 loss函数是找最小值的&#xff0c;要求导&#xff0c;在计算机里面计算导数是倒着来的&#xff0c;所以叫反向传播。 import torch from torch.nn import L1Lossinputstorch.tensor([1,2,3],dtypetorch.float32) targe…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 灰度图像恢复(100分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

Android 根证书管理与证书验证

大部分的安卓应用都免不了与后端服务器进行通信。在通信过程中&#xff0c;主要面临两方面的风险&#xff1a;1、中间人攻击。当通信使用 HTTP 等明文协议&#xff0c;通信内容可被嗅探甚至篡改。2、通信内容被攻击者分析。使用加密的协议&#xff0c;虽然避免了中间人攻击&…

RocketMQ 顺序消息和事务消息及其原理

RocketMQ 顺序消息和事务消息 1、Spring Cloud Alibaba RocketMq 架构图2、RocketMQ 顺序消息2.1、RockerMQ 实现顺序消费2.1.1、顺序发消息2.1.2、顺序收消息 2.2、顺序发送的技术原理2.3、顺序消费的技术原理 3、RocketMQ 的事务消息3.1、RocketMQ 事务消息流程3.2、事务消息…

查看Windows启动时长

&#xff08;附图片&#xff09;电脑自带检测开机时长---查看方式_电脑开机时长命令-CSDN博客 eventvwr - Windows日志 - 系统 - 查找 - 6013.jpg

如何借助 LLM 设计和实现任务型对话 Agent

1 引言 在人工智能的快速发展中&#xff0c;任务型对话 Agent 正成为提升用户体验和工作效率的关键技术。这类系统通过自然语言交互&#xff0c;专注于高效执行特定任务&#xff0c;如预订酒店或查询天气。尽管市场上的开源框架如 Rasa 和 Microsoft Bot Framework 在对话理解…

使用ioDraw,AI绘图只需几秒钟!

只需几秒钟&#xff0c;就能将文字或图片转化为精准的思维导图、流程图、折线图、柱状图、饼图等各种图表&#xff01; 思维导图 思维导图工具使用入口 文字转思维导图 将文本大纲或想法转换成可视化的思维导图&#xff0c;以组织和结构化您的想法。 图片转思维导图 从现有…

汽车电子工程师入门系列——AUTOSAR通信服务框架(下)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

垃圾回收与算法

目录 一、判断对象已经 "死亡" 1、引用计数法 2、可达性分析 二、垃圾收集算法 1、标记清楚算法 2、复制算法 3、标记整理算法 4、分代收集算法 4.1、新生代与复制算法 4.2老年代与标记复制算法 一、判断对象已经 "死亡" 1、引用计数法 在 Java 中&#…

基于STM32的温湿度检测TFT屏幕proteus恒温控制仿真系统

一、引言 本文介绍了一个基于STM32的恒温控制箱检测系统&#xff0c;该系统通过DHT11温湿度传感器采集环境中的温湿度数据&#xff0c;并利用TFT LCD屏幕进行实时显示。通过按键切换页面显示&#xff0c;通过按键切换实现恒温控制箱的恒温控制。为了验证系统的可靠性和稳定性&…