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

解锁 Redis:探索连接策略、数据编码与性能秘诀

探索连接策略、数据编码与性能秘诀

  • 一 . Redis 常见客户端介绍
  • 二 . 认识数据类型和编码方式
    • 2.1 Redis 中的数据类型以及对应的内部编码
    • 2.2 通过命令查看具体编码方式
  • 三 . Redis 的单线程模型
    • 3.1 Redis 是否存在线程安全问题 ?
    • 3.2 单线程为什么这么快 ?

Hello , 大家好 , 这个专栏给大家带来的是 Redis 系列 ! 本篇文章是想在正式介绍 Redis 的数据结构之前 , 探讨一下 Redis 连接具体有多少种方式、怎样查看具体某个数据结构的编码规则、Redis 快的原因 , 了解了这些之后才能更好地理解 Redis 的常见数据结构 .

在这里插入图片描述

本专栏旨在为初学者提供一个全面的 Redis 学习路径,从基础概念到实际应用,帮助读者快速掌握 Redis 的使用和管理技巧。通过本专栏的学习,能够构建坚实的 Redis 知识基础,并能够在实际学习以及工作中灵活运用 Redis 解决问题 .
专栏地址 : Redis 入门实践

一 . Redis 常见客户端介绍

那我们首先要明确 , Redis 也是一个 “客户端-服务器” 结构的程序

比如 : 我们之前学习过的 MySQL , 也是一个客户端-服务器结构的程序

那他的基本结构就如下 :
在这里插入图片描述

那 Redis 的客户端也有很多种

  1. 自带的命令行客户端 : redis-cli
[root@VM-8-16-centos ~] redis-cli # 启动 Redis 客户端
[root@VM-8-16-centos ~] redis-cli -h 127.0.0.1 -p 6379 # 启动其他主机的 Redis 客户端
  1. 图形化界面的客户端
  2. 基于 Redis 的 API 自行开发的客户端

类似于 MySQL 的 JDBC

二 . 认识数据类型和编码方式

我们常见的 Redis 的数据结构如下 :
键是 string 类型的 , 而 value 有好几种类型 , 常见的有 : string、hash、list、set、zset 等
image.png
那他跟我们 Java 中的数据类型可以类比理解
字符串 <-> String
哈希 <-> HashMap
列表 <-> 类似 List
集合 <-> Set
有序集合 <-> 类似 Set , 需要额外存储一个 score (权重 / 分数)

那 Redis 底层在实现上述的数据结构的时候 , 会在源码层面针对上述实现进行特定优化 , 达到节省时间 / 节省空间的效果 , 也就是说底层的编码方式不一定就是按照该数据类型进行设计的

比如 : 官方说我们的哈希增删改查时间复杂度都是 O(1) , 但是他的底层实现就不一定通过 HashMap 去实现的 , 只是人家通过不断的操作最终让时间复杂度变成了 O(1)

那我们就先了解一下每种数据类型的内部编码方式如何

2.1 Redis 中的数据类型以及对应的内部编码

数据类型内部编码
stringraw
int
embstr
hashhashtable
ziplist
listlinkedlist
ziplist
sethashtable
intset
zsetskiplist
ziplist

Redis 中数据类型以及内层编码.png

2.2 通过命令查看具体编码方式

我们可以通过 object encoding key 的方式来去看一下 value 的实际编码方式

127.0.0.1:6379> set k1 111 # 设置 k1 为数字
OK
127.0.0.1:6379> type k1 # 查看 k1 的类型虽然是 string 类型
string
127.0.0.1:6379> object encoding k1 # 但是底层的实现是 int 来去实现的
"int"

127.0.0.1:6379> lpush k2 one # 设置 k2 为列表
(integer) 1
127.0.0.1:6379> type k2 # 查看 k2 的类型虽然是 list 类型
list
127.0.0.1:6379> object encoding k2 # 但是底层的实现是 quicklist 来去实现的
"quicklist"

127.0.0.1:6379> sadd k3 111 # 设置 k3 为集合
(integer) 1
127.0.0.1:6379> type k3 # 查看 k3 的类型虽然是 set 类型
set
127.0.0.1:6379> object encoding k3 # 但是底层的实现是 intset 来去实现的
"intset"

127.0.0.1:6379> hset k4 field1 1 # 设置 k4 为哈希
(integer) 1
127.0.0.1:6379> type k4 # 查看 k4 的类型虽然是哈希类型
hash
127.0.0.1:6379> object encoding k4 # 但是底层的实现是 ziplist 来去实现的
"ziplist"

三 . Redis 的单线程模型

3.1 Redis 是否存在线程安全问题 ?

Redis 的单线程模型指的是 Redis 只使用一个线程来去处理所有的命令请求

不是说 Redis 服务器内部只有一个线程

假设我们现在有多个客户端同时在与服务器进行交互
Redis 单线程模型是否存在线程安全问题.png

3.2 单线程为什么这么快 ?

效率高 / 速度快是与 MySQL 等数据库相比较的

  1. Redis 主要是访问内存 , 数据库则是访问硬盘的
  2. Redis 的核心功能比数据库的核心功能更加简单
  3. Redis 是单线程模型 , 他避免了一些不必要的线程竞争开销
  4. 处理网络 IO 的时候 , 使用了 IO 多路复用机制

IO 多路复用指的是一个线程 , 就可以管理多个 socket
那针对 TCP 来说 , 服务器每次要服务一个客户端 , 都需要给这个客户端安排一个 socket
那一个服务器要服务多个客户端 , 同时就有很多的 socket , 那这些 socket 都是无时无刻在传输数据吗 ?
其实很多情况下 , 每个客户端和服务器之间的通信也不是特别频繁 , 那大部分 socket 在很长一段时间都是静默的 , 是没有数据需要传输的 .
也就是说 , 同一时刻只有少数 socket 是活跃的 , 这是我们 IO 多路复用的前提 .
那我们 IO 多路复用就是让一个线程来去处理多个 socket , 那具体的处理方式如下 :
IO 多路复用.png


不知道大家吸收如何 , 如果对您有帮助的话 , 请多多支持~
在这里插入图片描述


http://www.kler.cn/a/288297.html

相关文章:

  • 【快捷入门笔记】mysql基本操作大全-SQL表
  • 【项目组件】第三方库——websocketpp
  • 工作和学习遇到的技术问题
  • SQL 注入详解:原理、危害与防范措施
  • Python 中.title()函数和.lower()函数
  • 【Excel】ToRow超级查找函数
  • Vue3项目开发——新闻发布管理系统(五)
  • 腾讯云技术深度解析:AI代码助手与微服务架构的实践应用
  • 为什么RAG应用很难落地?细说RAG系统开发关键痛点和解决方案
  • opencv图像形态学(边缘检测算法实例)
  • 论文《Generalized Focal Loss》阅读笔记
  • Java的内存模型(JMM)和锁机制
  • Unity (编辑器)数据持久化 之 ScriptableObject初识与创建
  • 微信小程序中Towxml解析Markdown及html
  • 【Eureka】搭建Eureka Server,实现服务注册和服务发现
  • 数据库约束--确保数据完整性
  • 用JS屏蔽网页中的鼠标点击
  • uniapp微信小程序开发测试获取手机号码
  • 研究生深度学习入门的十天学习计划------第七天
  • 【TiDB原理与实战详解】3、 集群升级和逻辑备份恢复~学不会? 不存在的!
  • Elasticsearch:使用 inference API 进行语义搜索
  • 微信小程序开发代码分包
  • redis单线程 ,当redis在执行lua脚本的时候,会执行其他redis操作吗?
  • 解决Springboot项目Maven下载依赖速度慢的问题
  • EmguCV学习笔记 C# 9.3 移动检测类
  • Vue(十二) Vuex、四个map方法的使用、Vuex模块化+namespace命名空间