美文网首页
Redis内部编码与单线程

Redis内部编码与单线程

作者: 若兮缘 | 来源:发表于2019-02-15 08:59 被阅读125次

数据结构与内部编码

Redis对外主要提供了5种数据结构,分别是string、hash、list、set、sorted set
并且对于每一种数据结构redis都提供了至少2种相应的内部编码实现以应对不同的使用场景。

这么做的目的
  1. 对于用户的数据存储选择合适的处理策略以达到内存最优使用的目的,即采用以空间换取时间还是以时间换取空间策略
  2. 采用面向接口编程思想以达到很好的扩展性,比如对于list类型又完成了一种针对特定场景使用的内部编码实现,那么只需要将内部编码集成到list类型之中,而用户无需关心实际内部编码的使用情况,仍然使用list类型即可

redisObject

在Redis源码内部有一个redisObject这样的对象或者说结构体,redis使用redisObject表示所有的key-value。
它里面有很多属性,比较重要的就是数据类型type和编码方式encoding,如图所示。

单线程

redis在一个瞬间只会执行一条命令,所有命令以串行方式进行排列,等待顺序执行。如图所示当第一个get命令执行完成之后才会执行第二个get命令,其实这就是redis单线程最简单的一个表现。
理解redis单线程非常重要,同时这也是redis设计的精髓所在。

单线程为什么这么快?

1.纯内存

redis会将所有数据放在内存中,而内存的响应速度是非常快的。所以redis之所以能达到如此高性能是依赖于内存的。
其实无论你做了很多优化或者说代码的优化实际它的本质是数据放在内存当中。

2.非阻塞IO

redis使用了epoll模型作为IO多路复用的实现,redis自身也实现了事件处理,将epoll的连接、读写、关闭转换为自身的事件,不在网络IO上浪费过多的时间。

3.避免线程切换和竞态消耗

这其实也是单线程的特性,很多时候如果多线程没有达到一个合理的使用时,它甚至比单线程还要慢。

单线程注意事项

  1. 一次只运行一条命令
  2. 拒绝长(慢)命令(keys, flushall, flushdb, slow lua script, mutil/exec, operatebig value(collection))
  3. 其实不是真正的单线程,在执行fysnc file descriptorclose file descriptor操作时也会单独开一个线程,了解即可

相关文章

  • Redis内部编码与单线程

    数据结构与内部编码 Redis对外主要提供了5种数据结构,分别是string、hash、list、set、sort...

  • Redis知识集锦

    Redis键各个类型的内部编码

  • Redis内部编码

    ziplist可以有效减少内存的使用。

  • Redis基础

    1)Redis提供5种数据结构,每种数据结构都有多种内部编码实现 2)纯内存存储、IO多路复用和单线程架构是造就R...

  • Redis存储总是心里没底?你大概漏了这些数据结构原理

    一、Redis内存数据结构与编码 想要弄清楚Redis内部如何支持5种数据类型,也就是要弄清Redis到底是使用什...

  • Redis命令总结与使用

    ​ Redis的一些全局命令、数据结构和内部编码、单线程命令处理机制是十分有必要的,主要体现在两个方面:第一、...

  • redis学习

    [toc] redis 数据结构 字符串 setnx可以作为分布式锁的实现方法; 内部编码 哈希表 内部编码 zi...

  • Redis终极整理

    一、 Redis简介 redis的优点● 数据间没有必然的关联关系● 内部采用单线程机制● 高性能● 多数据类型支...

  • redis高性能-线程模型

    Redis 为什么用单线程 Redis单线程指的什么 Redis 是单线程,主要是指 Redis 的网络 IO 和...

  • Redis学习笔记:数据类型的内部编码与单线程架构

    前言:最近实习工作比较忙,业余时间在看付磊的《Redis开发与运维》,并结合以前的学习总结,整理这一系列学习笔记,...

网友评论

      本文标题:Redis内部编码与单线程

      本文链接:https://www.haomeiwen.com/subject/epqceqtx.html