首页 > 数据库 >Redis

Redis

时间:2024-03-24 22:12:28浏览次数:14  
标签:SDS Redis 集合 字符串 数据结构 ID

Redis

  1. Redis常规八股(Redis common interview questions and concepts):

    • Redis是什么?(What is Redis?):Redis是一个开源的内存数据存储系统,可以用作数据库、缓存和消息中间件。
    • Redis的特点是什么?(What are the features of Redis?):Redis具有高性能、支持多种数据结构、提供持久化选项、支持复制和高可用性、可通过插件扩展功能等特点。
    • Redis支持哪些数据结构?(What data structures does Redis support?):Redis支持字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)、位图(Bitmap)、HyperLogLog和地理空间索引(Geospatial Index)等数据结构。
  2. Redis的八种数据结构(Eight data structures in Redis):

    • 字符串(String):简单的键值对存储。
    • 哈希(Hash):键值对的集合,可以嵌套存储多个字段和对应的值。
    • 列表(List):按照插入顺序排序的字符串元素集合,可以在列表的两端进行插入和删除操作。
    • 集合(Set):不重复字符串元素的无序集合,支持集合操作(交集、并集、差集等)。
    • 有序集合(Sorted Set):类似于集合,但每个元素都关联了一个分数,可以根据分数进行排序。
    • 位图(Bitmap):由二进制位组成的数据结构,可以进行位级别的操作。
    • HyperLogLog:用于基数(cardinality)估算的数据结构,可以统计一组元素的独立数量。
    • 地理空间索引(Geospatial Index):用于存储和操作地理空间位置信息的数据结构。

• String 类型的应用场景:缓存对象、常规计数、分布式锁、共享 session 信息等。
• List 类型的应用场景:消息队列(但是有两个问题:1. 生产者需要自行实现全局唯一 ID;2. 不能以消费组形式消费数据)等。
• Hash 类型:缓存对象、购物车等。
• Set 类型:聚合计算(并集、交集、差集)场景,比如点赞、共同关注、抽奖活动等。
• Zset 类型:排序场景,比如排行榜、电话和姓名排序等。

  1. ZSet的跳表原理(Skip List principle in ZSet):

    • 有序集合(Sorted Set)在Redis中使用了跳表(Skip List)数据结构来实现。
    • 跳表是一种基于有序链表的数据结构,通过在链表中添加多级索引节点,提高了查询有序数据的效率。
    • 在有序集合中,每个元素都有一个对应的分数,通过分数来进行排序。
    • 跳表中的索引节点包含了指向下一级索引节点的指针,可以通过这些索引快速定位到目标元素的位置。
  2. 用Redis实现分布式ID(Implementing distributed ID with Redis):

    • 可以使用Redis的原子操作来实现分布式ID生成器。
    • 一种常见的实现方式是使用Redis的自增操作(INCR)来生成唯一的递增ID。
    • 在分布式环境下,可以使用Redis的分布式锁来确保ID的唯一性和一致性。
    • 通过在Redis中维护一个计数器,每次请求获取ID时,使用自增操作获取新的ID值即可。
  3. String 类型内部实现
    String 类型的底层的数据结构实现主要是 SDS(简单动态字符串)。 SDS 和我们认识的 C 字符串不太一样,之所以没有使用 C 语言的字符串表示,因为 SDS 相比于 C 的原生字符串:

SDS 不仅可以保存文本数据,还可以保存二进制数据。因为 SDS 使用 len 属性的值而不是空字符来判断字符串是否结束,并且 SDS 的所有 API 都会以处理二进制的方式来处理 SDS 存放在 buf[] 数组里的数据。所以 SDS 不光能存放文本数据,而且能保存图片、音频、视频、压缩文件这样的二进制数据。
SDS 获取字符串长度的时间复杂度是 O(1)。因为 C 语言的字符串并不记录自身长度,所以获取长度的复杂度为 O(n);而 SDS 结构里用 len 属性记录了字符串长度,所以复杂度为 O(1)。
Redis 的 SDS API 是安全的,拼接字符串不会造成缓冲区溢出。因为 SDS 在拼接字符串之前会检查 SDS 空间是否满足要求,如果空间不够会自动扩容,所以不会导致缓冲区溢出的问题。

  1. Redis 如何做内存优化?
    可以好好利用 Hash,list,sorted set,set 等集合类型数据,因为通常情况下很多小的 Key-Value 可以用更紧凑的方式存放到一起。尽可能使用散列表(hashes),散列表(是说散列表里面存储的数少)使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面。比如你的 web 系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的 key,而是应该把这个用户的所有信息存储到一张散列表里面。

  2. Redis为啥快,为啥单线程,为啥用它不用其他的,只有单线程吗?除了缓存还能干啥
    Redis之所以快速的原因有多个方面。首先,Redis将数据存储在内存中,避免了磁盘I/O的开销,提高了读写速度。
    其次,Redis采用单线程的方式处理请求,避免了多线程之间的锁竞争和上下文切换的开销。单线程模型简化了Redis的内部实现,使得它能够高效地处理请求。
    此外,Redis还通过异步的方式将数据写入磁盘,保证了数据的持久性。除了作为缓存使用外,Redis还可以用于实现消息队列、实时统计、分布式锁等功能

标签:SDS,Redis,集合,字符串,数据结构,ID
From: https://www.cnblogs.com/peterzh/p/18093187

相关文章

  • redis实际应用场景及并发问题的解决
    业务场景接下来要模拟的业务场景:每当被普通攻击的时候,有千分之三的概率掉落金币,每回合最多爆出两个金币。1.每个回合只有15秒。2.每次普通攻击的时间间隔是0.5s3.这个服务是一个集群(这个要求暂时不实现)编写接口,实现上述需求。核心问题可以想到要解决的主要问题是,1.如何......
  • linux 下安装mysql redis
    查看是否安装mysql:rpm-qa|grepmysql获取mysql版本:wget-i-chttp://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm安装:rpm-ivhmysql-community-release-el7-5.noarch.rpmyuminstallmysql-community-serversystemctlstartmysqldsystemctlrest......
  • 在Java项目中使用Redis的五大数据结构应用场景与代码实现
    在Java项目中使用Redis的五大数据结构可以应用于以下场景:1、字符串(String):1、缓存数据:将经常访问的数据存储在Redis中,以减轻数据库的负载。2、计数器:记录用户的访问次数、点赞数等。3、分布式锁:在分布式环境下实现互斥访问,防止并发问题。2、列表(List):1、消息队列:将生产......
  • MySQL 与 Redis 如何实现最终一致性的四种方案
    背景缓存是软件开发中一个非常有用的概念,数据库缓存更是在项目中必然会遇到的场景。而缓存一致性的保证,针对不同的要求,选择恰到好处的一致性方案。缓存是什么存储的速度是有区别的。缓存就是把低速存储的结果,临时保存在高速存储的技术。如图所示,金字塔上层的存储,可以作为下......
  • etcd 以及 redis分布式锁的实现优劣比较
    etcd以及redis分布式锁的实现优劣比较背景介绍在学习etcd时,对于使用etcd实现分布式锁(使用etcd来实现一个简单的分布式锁)做了一个简单的示例,同时也能想到和Redis实现的分布式锁相比,基于etcd来做有什么好处呢?技术要点底层技术比较我们必须要明白一件事情,两者的底......
  • Redis 哨兵是什么?哨兵配置详解
    Redis的主从复制模式下,一旦主节点由于故障不能提供服务,需要人工将从节点晋升为主节点,同时还要通知应用方更新主节点地址,Redis从2.8开始正式提供了RedisSentinel(哨兵)架构来解决这个问题。RedisSentinel是一个分布式架构,其中包含若干个Sentinel节点和Redis数据节点,......
  • Redis中AOF文件重写与同步
    AOF文件的写入与同步Redis服务器进程就是一个时间循环(loop),这个循环中的文件时间负责接收客户端的命令请求,以及向客户端发送命令回复,而时间事件则负责执行像serverCron函数这样需要定时运行的函数。因为服务器在处理文件事件时可能会执行些命令,使得一些内容被追加到aof_b......
  • 一触即发,全栈联动:使用Docker Compose部署Spring Boot应用+MySQL+Redis实战指南
    在云原生时代的快车道上,DockerCompose无疑是那辆助您疾驰的豪华跑车,它凭借其简洁高效的YAML配置文件,让您能够轻松部署和管理包含SpringBoot应用、MySQL数据库以及Redis缓存服务在内的完整堆栈。本文将深入浅出地引导您通过一个docker-compose.yml文件来定义和配置这些服务,实......
  • docker安装redis
    1.创建本地映射文件夹mkdir-p/docker/redis/data(自定义位置,我选择了上面的文件夹,映射文件夹一会要在redis命令中用到,如果改变请注意)可选:给当前用户加/docker文件夹的权限。sudochown-Rxxxx/docker2.下载redis默认配置文件前往redis的GitHub地址redis-github下载......
  • Redis—集群哨兵
    原理主从复用是高并发的基石,哨兵模式提供了主从架构中宕机后自动恢复能力,Gossip协议和一致性哈希协议提供了集群中新增或退出节点是数据自动重分配问题。主从复制一主多从,从节点可再有从节点,从节点拷贝主节点数据。用户操作时实现读写分离,从节点提供读功能,主节点提供写功能。......