服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Redis - Redis高效率原因及数据结构分析

Redis高效率原因及数据结构分析

2021-11-18 16:55不会编程的派大星 Redis

这篇文章主要为大家详细的介绍了Redis高效的原因以及分析了Redis高效的数据结构,有需要的朋友可以借鉴参考下,希望能够有所帮助

1、什么是redis?它主要用来干什么的?

redis,英文全称是remote dictionary server(远程字典服务),是一个开源的使用ansi c语言编写、支持网络、可基于内存亦可持久化的日志型、key-value数据库,并提供多种语言的api。

与mysql数据库不同的是,redis的数据是存在内存中的。它的读写速度非常快,每秒可以处理超过10万次读写操作。因此redis被广泛应用于缓存,另外,redis也经常用来做分布式锁。除此之外,redis支持事务、持久化、lua 脚本、lru 驱动事件、多种集群方案。

知道redis是什么后,接下来我们来说一说redis为什么这么快。

2、redis为什么这么快?

Redis高效率原因及数据结构分析

我们来一个一个说明!

基于内存存储实现

计算机专业的同学我们都知道内存读写是要比磁盘快很多的,redis是基于内存实现的数据库,相对于数据存在磁盘的mysql等数据库,省去了磁盘i/o的消耗。

高效的数据结构

我们都知道,mysql索引为了提高效率,选择了b+树的数据结构,对于一个应用场景来说合理的数据结构可以让你的应用或者程序更快。我们来看看redis的数据结构–内部编码图:

Redis高效率原因及数据结构分析

string : 动态字符串sds
list: 双端链表linkedlist+压缩链表ziplist
hash: 压缩链表ziplist+字典哈希表hashtable
set: hashtable(+inset)
zset: 压缩链表ziplist+跳表skiplist

我们来说一说这几种内部编码:

1、sds简单动态字符串

Redis高效率原因及数据结构分析
我们来和c语言中的char[ ]对比下

字符串长度处理: redis获取字符串长度,时间复杂度为o(1),而c语言中,需要从头遍历,复杂度为o(n)。

空间预分配: 字符串修改越频繁的话,内存分配就越频繁,就会很消费性能,而sds修改和空间扩充,会额外分配未使用的空间,减少性能损耗。

惰性空间释放: sds缩短时,不是回收多余的内存空间,而是free记录下多余的空间,后续有变更,直接使用free中记录的空间,减少分配。

二进制安全: redis可以存储一些二进制数据,在c语言中字符串遇到'/0'会结束,而sds中标志字符串结束的是len属性。

2、字典

redis 作为 k-v 型内存数据库,所有的键值就是用字典来存储。字典就是哈希表,比如hashmap,通过key就可以直接获取到对应的value。而哈希表的特性,在o(1)时间复杂度就可以获得对应的值。

3、跳表

Redis高效率原因及数据结构分析

跳表是redis特有的数据结构,就是在链表的基础上,增加多级索引提升查找效率。
跳表支持平均o(logn),最坏o(n)复杂度的节点查找,还可以通过顺序性操作。

合理的数据编码

redis 支持多种数据数据类型,每种基本类型,可能对多种数据结构。什么时候,使用什么样数据结构,使用什么样编码,是redis设计者总结优化的结果。

string: 如果存储数字的话,是用int类型的编码;如果存储非数字,小于等于39字节的字符串,是embstr;大于39个字节,则是raw编码。
list: 如果列表的元素个数小于512个,列表每个元素的值都小于64字节(默认),使用ziplist编码,否则使用linkedlist编码
hash: 哈希类型元素个数小于512个,所有值小于64字节的话,使用ziplist编码,否则使用hashtable编码。
set: 如果集合中的元素都是整数且元素个数小于512个,使用intset编码,否则使用hashtable编码。
zset: 当有序集合的元素个数小于128个,每个元素的值小于64字节时,使用ziplist编码,否则使用skiplist(跳跃表)编码。

合理的线程模型

1、i/o多路复用

Redis高效率原因及数据结构分析
多路i/o复用技术可以让单个线程高效的处理多个连接请求,而redis使用用epoll作为i/o多路复用技术的实现。并且,redis自身的事件处理模型将epoll中的连接、读写、关闭都转换为事件,不在网络i/o上浪费过多的时间。

2、什么是i/o多路复用?

i/o : 网络 i/o
多路 : 多个网络连接
复用: 复用同一个线程。
io多路复用其实就是一种同步io模型,它实现了一个线程可以监视多个文件句柄;一旦某个文件句柄就绪,就能够通知应用程序进行相应的读写操作;而没有文件句柄就绪时,就会阻塞应用程序,交出cpu。

3、单线程模型

redis是单线程模型的,而单线程避免了cpu不必要的上下文切换和竞争锁的消耗。也正因为是单线程,如果某个命令执行过长(如hgetall命令),会造成阻塞。redis是面向快速执行场景的数据库。,所以要慎用如smembers和lrange、hgetall等命令。

redis 6.0 引入了多线程提速,它的执行命令操作内存的仍然是个单线程。

虚拟内存机制

redis直接自己构建了vm机制,不会像一般的系统会调用系统函数处理,会浪费一定的时间去移动和请求。

redis的虚拟内存机制是啥呢?

虚拟内存机制就是暂时把不经常访问的数据(冷数据)从内存交换到磁盘中,从而腾出宝贵的内存空间用于其它需要访问的数据(热数据)。通过vm功能可以实现冷热数据分离,使热数据仍在内存中、冷数据保存到磁盘。这样就可以避免因为内存不足而造成访问速度下降的问题。

以上就是redis高效原因及数据结构分析的详细内容,更多关于redis的资料请关注服务器之家其它相关文章!

原文链接:https://blog.csdn.net/weixin_45827693/article/details/120477050

延伸 · 阅读

精彩推荐
  • Redisredis启动,停止,及端口占用处理方法

    redis启动,停止,及端口占用处理方法

    今天小编就为大家分享一篇redis启动,停止,及端口占用处理方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 ...

    澄海单挑狂5152019-11-14
  • Redis就这?Redis持久化策略——AOF

    就这?Redis持久化策略——AOF

    今天为大家介绍Redis的另一种持久化策略——AOF。注意:AOF文件只会记录Redis的写操作命令,因为读命令对数据的恢复没有任何意义...

    头发茂密的刘叔4052021-12-14
  • RedisRedis数据结构之链表与字典的使用

    Redis数据结构之链表与字典的使用

    这篇文章主要介绍了Redis数据结构之链表与字典的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友...

    白泽来了4052021-08-03
  • Redis在ssm项目中使用redis缓存查询数据的方法

    在ssm项目中使用redis缓存查询数据的方法

    本文主要简单的使用Java代码进行redis缓存,即在查询的时候先在service层从redis缓存中获取数据。如果大家对在ssm项目中使用redis缓存查询数据的相关知识感...

    caychen8962019-11-12
  • Redis聊一聊Redis与MySQL双写一致性如何保证

    聊一聊Redis与MySQL双写一致性如何保证

    一致性就是数据保持一致,在分布式系统中,可以理解为多个节点中数据的值是一致的。本文给大家分享Redis与MySQL双写一致性该如何保证,感兴趣的朋友一...

    mind_programmonkey6432021-08-12
  • RedisLinux Redis 的安装步骤详解

    Linux Redis 的安装步骤详解

    这篇文章主要介绍了 Linux Redis 的安装步骤详解的相关资料,希望大家通过本文能掌握如何安装Redis,需要的朋友可以参考下 ...

    carl-zhao3822019-11-08
  • RedisRedis分布式锁升级版RedLock及SpringBoot实现方法

    Redis分布式锁升级版RedLock及SpringBoot实现方法

    这篇文章主要介绍了Redis分布式锁升级版RedLock及SpringBoot实现,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以...

    等不到的口琴7802021-07-25
  • RedisRedis存取序列化与反序列化性能问题详解

    Redis存取序列化与反序列化性能问题详解

    这篇文章主要给大家介绍了关于Redis存取序列化与反序列化性能问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参...

    这名字已经存在9742021-02-24