当前位置:   article > 正文

Redis学习【2】之入门_字典服务

字典服务

前言

  • 学习的环境为Linux环境下的Redis

一 Redis概述

1.1 Redis简介

  • Redis(Remote Dictionary Server ):远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
  • 由意大利人 Salvatore Sanfilippo(又名 Antirez)开发
  • redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
  • Redis 之所以称之为字典服务,是因为 Redis 是一个 key-value 存储系统。支持存储的 value类型很多,包括 String(字符串)、List(链表)、Set(集合)、Zset(sorted set --有序集合)和 Hash(哈希类型)等

1.2 Redis用途

  • 总结:内存存储和持久化(RDB,AOF)
    • redis支持异步将内存中的数据写到硬盘上,同时不影响继续服务
    • 内存的弊端是断电即失,所以持久化格外重要!

  • Redis 在生产中使用最多的场景就是做数据缓存。即客户端从 DBMS 中查询出的数据首先写入到 Redis 中,后续无论哪个客户端再需要访问该数据,直接读取 Redis 中的即可,不仅减小了 RT,而且降低了 DBMS 的压力。
    在这里插入图片描述
  • 根据 Redis 缓存的数据与 DBMS 中数据的同步性划分,缓存一般可划分为两类:实时同步缓存,与阶段性同步缓存
    • 实时同步缓存:DBMS 中数据更新后,Redis 缓存中的存放的相关数据会被立即清除,以促使再有对该数据的访问请求到来时,必须先从 DBMS 中查询获取到最新数据,然后再写入到 Redis。
    • 阶段性同步缓存:Redis 缓存中的数据允许在一段时间内与 DBMS 中的数据不完全一致。而这个时间段就是这个缓存数据的过期时间。

1.3 Redis特性

  1. 多样的数据结构:Redis 是一个 key-value 存储系统。支持存储的 value 类型很多,包括String(字符串)、List(链表)、Set(集合)、Zset(sorted set --有序集合)和 Hash(哈希类型)等,还有 BitMap、HyperLogLog、Geospatial 类型。
    • BitMap:一般用于大数据量的二值性统计。
    • HyperLogLog:其是 Hyperlog Log,用于对数据量超级庞大的日志做去重统计。
    • Geospatial:地理空间,其主要用于地理位置相关的计算。
  2. 持久化:Redis 内存中的数据可以进行持久化,其有两种方式:RDB 与 AOF。
  3. 高可用集群:Redis 提供了高可用的主从集群功能,可以确保系统的安全性。
  4. 强大的功能:Redis 提供了数据过期功能、发布/订阅功能、简单事务功能,还支持 Lua脚本扩展功能。
  5. 性能极高:Redis 读的速度可以达到 11w 次/s,写的速度可以达到 8w 次/s。
  6. Redis 源码非常精细(集性能与优雅于一身)

1.4 Redis的IO模型

  • Redis 客户端提交的各种请求是如何最终被 Redis 处理的?
  • Redis 处理客户端请求所采用的处理架构,称为 Redis 的 IO 模型。
  • 不同版本的 Redis 采用的 IO 模型是不同的。

1.4.1 单线程模型

  • 对于 Redis 3.0 及其以前版本,Redis 的 IO 模型采用的是纯粹的单线程模型。即所有客户端的请求全部由一个线程处理。
    在这里插入图片描述
    • Redis 的单线程模型采用了多路复用技术
  • 补充内容:
  • 对于多路复用器的多路选择算法常见的有三种:select 模型、poll 模型、epoll 模型。
    • poll 模型的选择算法:采用的是轮询算法。该模型对客户端的就绪处理是有延迟的。
    • epoll 模型的选择算法:采用的是回调方式。根据就绪事件发生后的处理方式的不同,
      又可分为 LT 模型与 ET 模型。
  • 每个客户端若要向 Redis 提交请求,都需要与 Redis 建立一个 socket 连接,并向事件分发器注册一个事件。一旦该事件发生就表明该连接已经就绪。而一旦连接就绪,事件分发器就会感知到,然后获取客户端通过该连接发送的请求,并将由该事件分发器所绑定的这个唯一的线程来处理。如果该线程还在处理多个任务,则将该任务写入到任务队列等待线程处理。
  • 之所以称为事件分发器,是因为它会根据不同的就绪事件,将任务交由不同的事件处理器去处理。

1.4.2 混合线程模型

  • **从 Redis 4.0 版本开始,Redis 中就开始加入了多线程元素。****处理客户端请求的仍是单线程模型,但对于一些比较耗时但又不影响对客户端的响应的操作,就由后台其它线程来处理。**例如,持久化、对 AOF 的 rewrite、对失效连接的清理等。

1.4.3 多线程模型

  • Redis 6.0 版本,才是真正意义上的多线程模型因为其对于客户端请求的处理采用的是多线程模型
    在这里插入图片描述
  • 多线程 IO 模型中的“多线程”仅用于接受、解析客户端的请求,然后将解析出的请求写入到任务队列。而对具体任务(命令)的处理,仍是由主线程处理。这样做使得用户无需考虑线程安全问题,无需考虑事务控制,无需考虑像 LPUSH/LPOP 等命令的执行顺序问题。

1.4.4 Redis的IO模型优缺点总结

  1. 单线程模型
    • 优点:
      • 可维护性高,性能高。不存在并发读写情况,所以也就不存在执行顺序的不确定性,不存在线程切换开销,不存在死锁问题,不存在为了数据安全而进行的加锁/解锁开销。
    • 缺点:
      • 性能会受到影响,且由于单线程只能使用一个处理器,处理器的利用率较低。
  2. 多线程模型
    • 优点:其结合了多线程与单线程的优点,避开了它们的不足
    • 缺点:并非是一个真正意义上的“多线程”,因为真正处理“任务”的线程仍是单线程。其对性能有些影响!

1.5 相关学习网站

1.6 补充【RDB,AOF】

  • RDB
    • RDB是Redis的一种数据持久化到磁盘的策略,是一种以内存快照形式保存Redis数据的方式。所谓快照,就是把某一时刻的状态以文件的形式进行全量备份到磁盘,这个快照文件就称为RDB文件,其中RDB是Redis DataBase的缩写。
    • AOF
      声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/493167
推荐阅读
相关标签