我的成长磨练,每天写博客,年轻人,卷起袖子,来把手弄脏吧! ------ 博客首页

Redis-0-基本原理和特性

Redis-0-基本原理和特性


redis是什么

Redis是一个开源的使用C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

redis的优点

  • 1.1 作为一个内存服务器性能高,能支持10万每秒级别的读写操作
  • 1.2 数据类型足够丰富,可以满足各种类型数据的存储和处理
  • 1.3 单线程程序,操作均为原子性操作,并且多个操作间可以使用命令进行事务管理
  • 1.4 支持持久化,可以保证数据的安全性
  • 1.5 丰富的特性,虽然其中大部分正常情况下不作为主力使用:订阅,消息,缓存过期策略等等
  • 1.6 底层存储均为byte[]实现,在此基础上进行高度封装做出多种数据结构,所以保证其可在多个不同客户端之间的无差别交互

redis的缺点

  • 2.1 单线程操作,所以很难将多核服务器的性能发挥出来。也可以将多核机器部署多个redis实例,然后通过绑定核心的方式规避多核切换的问题。(redis6已经发布了多线程版本,IO多线程)
  • 2.2 由于它是内存数据库,其上限由部署的机器决定,并且在超出规定大小时产生不可预知的问题(可通过过期策略等等进行场景规划

redis支持的数据类型

  • 3.1 String(字符串)set get
  • 3.2 List(列表)lpush lrange
  • 3.3 Set(集合) sadd smembers
  • 3.4 Hash(哈希)hset hget hmset hgetall
  • 3.5 zset(sorted set:有序集合)zadd zrangebyscore
  • 3.6 bit操作(底层依赖的byte[]数组可以方便的实现bimap等数据结构) getbit setbit bitcount bitop_op
  • 3.7 redis同时支持事务的操作,可以通过命令进行开启 MULTI EXEC 关闭

redis的线程模型

首先我们划出两个关键的时间节点:

  • Redis v4.0(引入多线程处理异步任务)
  • Redis v6.0(正式在网络模型中实现 I/O 多线程)

Redis的核心网络模型,从Redis的1.0到6.0版本之前,Redis的核心网络模型一直是一个典型的单 Reactor 模型:利用 epoll/select/kqueue多路复用技术,在单线程的事件循环中不断去处理事件(客户端请求),最后回写响应数据到客户端。(关于Reactor模型参见Reactor模型

这也就是我们简单的将Redis作为一个单线程应用的原因。因为它的常用核心逻辑都是单线程进行处理的。但其实作者在V4.0版本的时候就已经开始使用多线程来处理一些非常耗时的应用,典型的例如del删除操作,对于一些BigKey进行删除的时候如果保持单线程操作非常可能造成阻塞,引起系统的不稳定。所以这里作者也选择了使用异步启动线程进行删除的方式进行操作。

redis为什么快?

  • C语言实现,虽然C对Redis的性能有助力,但语言并不是最核心因素。
  • 纯内存I/O,相较于其他基于磁盘的 DB,Redis 的纯内存操作有着天然的性能优势。
  • I/O 多路复用,基于epoll多路复用技术,实现高吞吐的网络I/O。
  • 单线程模型,单线程无法利用多核,但是避免了多线程频繁上下文切换,以及同步机制如锁带来的开销

redis为什么选择单线程模型

  • 避免过多的上下文切换开销。CPU需要对线程操作进行切换
  • 避免同步机制的开销。如果使用多线程方式进行实现势必需要对复杂的数据结构进行额外的线程安全封装,那么在同步的时候就需要进行各种锁操作,降低处理效率
  • 简单可维护。维持代码的简洁性,如果向上面提到的多线程实现,势必会增加代码实现的复杂度,对很多操作都需要进行额外的线程安全封装。

posted on 2023-03-28 17:59  SethMessenger  阅读(36)  评论(0)    收藏  举报

导航