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

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

延伸 · 阅读

精彩推荐
  • Redis如何使用Redis锁处理并发问题详解

    如何使用Redis锁处理并发问题详解

    这篇文章主要给大家介绍了关于如何使用Redis锁处理并发问题的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Redis具有一定的参考学习...

    haofly4522019-11-26
  • Redis详解三分钟快速搭建分布式高可用的Redis集群

    详解三分钟快速搭建分布式高可用的Redis集群

    这篇文章主要介绍了详解三分钟快速搭建分布式高可用的Redis集群,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,...

    万猫学社4502021-07-25
  • Redis关于Redis数据库入门详细介绍

    关于Redis数据库入门详细介绍

    大家好,本篇文章主要讲的是关于Redis数据库入门详细介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览...

    沃尔码6982022-01-24
  • Redis《面试八股文》之 Redis十六卷

    《面试八股文》之 Redis十六卷

    redis 作为我们最常用的内存数据库,很多地方你都能够发现它的身影,比如说登录信息的存储,分布式锁的使用,其经常被我们当做缓存去使用。...

    moon聊技术8182021-07-26
  • RedisRedis集群的5种使用方式,各自优缺点分析

    Redis集群的5种使用方式,各自优缺点分析

    Redis 多副本,采用主从(replication)部署结构,相较于单副本而言最大的特点就是主从实例间数据实时同步,并且提供数据持久化和备份策略。...

    优知学院4082021-08-10
  • Redisredis缓存存储Session原理机制

    redis缓存存储Session原理机制

    这篇文章主要为大家介绍了redis缓存存储Session原理机制详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    程序媛张小妍9252021-11-25
  • RedisRedis 6.X Cluster 集群搭建

    Redis 6.X Cluster 集群搭建

    码哥带大家完成在 CentOS 7 中安装 Redis 6.x 教程。在学习 Redis Cluster 集群之前,我们需要先搭建一套集群环境。机器有限,实现目标是一台机器上搭建 6 个节...

    码哥字节15752021-04-07
  • RedisRedis Template实现分布式锁的实例代码

    Redis Template实现分布式锁的实例代码

    这篇文章主要介绍了Redis Template实现分布式锁,需要的朋友可以参考下 ...

    晴天小哥哥2592019-11-18