redis知识详解

Redis 是一种基于内存的高性能数据库,常用于缓存、消息队列和分布式锁。它支持丰富的数据类型,如 String、Hash、List、Set 和 Zset,并通过AOF和RDB实现数据持久化。Redis 采用单线程模型,通过I/O多路复用处理大量客户端请求。在主从复制、哨兵模式和切片集群模式下提供高可用性。此外,Redis 通过惰性删除和定期删除策略结合来处理过期键,以及LRU和LFU算法实现内存淘汰。
摘要由CSDN通过智能技术生成
  • 什么是reids

    • Redis 是一种基于内存的数据库,对数据的读写操作都是在内存中完成

    • 读写速度非常快,常用于缓存,消息队列、分布式锁等场景。

    • 对数据类型的操作都是原子性的,因为执行命令由单线程负责的,不存在并发竞争的问题。

    • 支持事务 、持久化、Lua 脚本、多种集群方案(主从复制模式、哨兵模式、切片集群模式)、发布/订阅模式,内存淘汰机制、过期删除机制等等

    • redis和memcached有什么区别

      • Memcached 也是基于内存的数据库

      • Redis 与 Memcached 共同点:

        • 都是基于内存的数据库,一般都用来当做缓存使用。

        • 都有过期策略。

        • 两者的性能都非常高。

      • Redis 与 Memcached 区别:

        • Redis 支持的数据类型更丰富(String、Hash、List、Set、ZSet),而 Memcached 只支持最简单的 key-value 数据类型;

        • Redis 支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用,而 Memcached 没有持久化功能,数据全部存在内存之中,Memcached 重启或者挂掉后,数据就没了;

        • Redis 原生支持集群模式,Memcached 没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据;

        • Redis 支持发布订阅模型、Lua 脚本、事务等功能,而 Memcached 不支持

    • 为什么使用redis作为mysql的缓存

      • redis具有 高性能高并发

      • 高性能

        • 用户第一次取数据,数据在硬盘上取出,会比较慢,将数据缓存到redis中,下次取数据就很快,只需要从缓存(在内存中)中取出即可。

        • Mysql更新数据,redis缓存也会更新,不存在不一致性问题。

      • 高并发

        • 单台设备的 Redis 的 QPS(Query Per Second,每秒钟处理完请求的次数) 是 MySQL 的 10 倍,Redis 单机的 QPS 能轻松破 10w,而 MySQL 单机的 QPS 很难破 1w。

        • 所以我们考虑把数据库放到缓存中,用户请求就直接访问缓存,不用访问数据库,提高性能。

  • redis数据结构

    • redis数据类型以及使用的场景分别是什么

      • String(字符串),Hash(哈希),List(列表),Set(集合)、Zset(有序集合)

      • 版本更新后新增:BitMap(2.2 版新增)、HyperLogLog(2.8 版新增)、GEO(3.2 版新增)、Stream(5.0 版新增)

      • 使用的场景

        • String 类型的应用场景:缓存对象、常规计数、分布式锁、共享 session 信息等。

        • List 类型的应用场景:消息队列(但是有两个问题:1. 生产者需要自行实现全局唯一 ID;2. 不能以消费组形式消费数据)等。

        • Hash 类型:缓存对象、购物车等。

        • Set 类型:聚合计算(并集、交集、差集)场景,比如点赞、共同关注、抽奖活动等。

        • Zset 类型:排序场景,比如排行榜、电话和姓名排序等。

        • BitMap(2.2 版新增):二值状态统计的场景,比如签到、判断用户登陆状态、连续签到用户总数等;

        • HyperLogLog(2.8 版新增):海量数据基数统计的场景,比如百万级网页 UV 计数等;

        • GEO(3.2 版新增):存储地理位置信息的场景,比如滴滴叫车;

        • Stream(5.0 版新增):消息队列,相比于基于 List 类型实现的消息队列,有这两个特有的特性:自动生成全局唯一消息ID,支持以消费组形式消费数据。

      • 五种常见的redis数据结构是怎么实现的?

        • String

          • 主要使用SDS(简单动态字符串)

          • SDS相比较于C的原生字符串:

            • SDS可以保存文本数据,也可以保存二进制数据。

            • SDS获取字符串长度的时间复杂度是O(1)。

            • Redis的SDS API是安全的,拼接字符串不会造成缓冲区溢出。

        • List

          • 底层是 双向链表或者是压缩列表 实现

            • 如果列表的元素个数小于 512 个(默认值,可由 list-max-ziplist-entries 配置),列表每个元素的值都小于 64 字节(默认值,可由 list-max-ziplist-value 配置),Redis 会使用压缩列表作为 List 类型的底层数据结构

            • 如果列表的元素不满足上面的条件,Redis 会使用双向链表作为 List 类型的底层数据结构

          • 3.2之后,底层就直接使用quicklist实现

        • Hash

          • 底层使用的压缩列表或者是哈希表

            • 如果哈希类型元素个数小于 512 个(默认值,可由 hash-max-ziplist-entries 配置),所有值小于 64 字节(默认值,可由 hash-max-ziplist-value 配置)的话,Redis 会使用压缩列表作为 Hash 类型的底层数据结构;

            • 如果哈希类型元素不满足上面条件,Redis 会使用哈希表作为 Hash 类型的底层数据结构。

          • 7.0之后,用listpack实现

        • Set

          • 哈希表或者是整数集实现

            • 如果集合中的元素都是整数且元素个数小于 512 (默认值,set-maxintset-entries配置)个,Redis 会使用整数集合作为 Set 类型的底层数据结构;

            • 如果集合中的元素不满足上面条件,则 Redis 使用哈希表作为 Set 类型的底层数据结构。

        • Zset

          • 底层用 压缩列表或者是跳表实现

            • 如果有序集合的元素个数小于 128 个,并且每个元素的值小于 64 字节时,Redis 会使用压缩列表作为 Zset 类型的底层数据结构;

            • 如果有序集合的元素不满足上面的条件,Redis 会使用跳表作为 Zset 类型的底层数据结构;

          • 7.0之后用listpack实现

  • redis线程模型

    • redis是单线程吗

      • Redis 单线程指的是「接收客户端请求->解析请求 ->进行数据读写等操作->发送数据给客户端」这个过程是由一个线程(主线程)来完成的

      • Redis 单线程指的是「接收客户端请求->解析请求 ->进行数据读写等操作->发送数据给客户端」这个过程是由一个线程(主线程)来完成的

        • 2.6版本,2个后台线程,作用是处理关闭文件,AOF刷盘

        • 4.0之后,多一个后台线程,异步释放redis内存,lazyfree线程。

        • Redis 为「关闭文件、AOF 刷盘、释放内存」这些任务创建单独的线程来处理,是因为这些任务的操作都是很耗时的

        • 把这些任务都放在主线程来处理,那么 Redis 主线程就很容易发生阻塞,这样就无法处理后续的请求了

    • redis单线程模式是怎么样的

      • redis初始化

        • 调用 epoll_create() 创建一个 epoll 对象和调用 socket() 创建一个服务端 socket

        • 调用 bind() 绑定端口和调用 listen() 监听该 socket;

        • 将调用 epoll_ctl() 将 listen socket 加入到 epoll,同时注册「连接事件」处理函数。

      • 初始化完毕之后就开始进行事件循环函数

        • 调用处理发送队列函数

        • 调用 epoll_wait 函数等待事件的到来

          • 连接事件到来,则会调用连接事件处理函数

          • 读事件到来,则会调用读事件处理函数

          • 写事件到来,则会调用写事件处理函数

    • redis采用单线程为什么还是这么快

  • 51
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值