首页 > 数据库 >【redis】redis的特性和主要应用场景

【redis】redis的特性和主要应用场景

时间:2024-09-08 17:24:23浏览次数:12  
标签:存储 场景 redis Redis 特性 内存 应用服务器 数据

文章目录

redis 的特性

redis 的一些特性(优点)成就了它

在内存中存储数据

  • In-memory data structures

MySQL 主要是通过“表”的方式来存储组织数据的“关系型数据
Redis 主要是通过“键值对”的方式来存储数据的“非关系型数据库

  • key 都是 String
  • value 则可以是这些数据结构(stringhasheslistssetssorted setsstreams,and more)

可编程的

  • Programmability
    针对 Redis 的操作,可以直接通过简单的交互式命令进行操作,也可以通过一些脚本的方式,批量执行一些操作(可以带有一些逻辑)
  • 主要是使用 Lua 语言

扩展能力

  • Extensibility
    可以在 Redis 原有的功能基础上,再进行扩展。Redis 提供了一组 API,可以通过 CC++Rust 这几个语言编写 Redis 扩展(本质上就是第一个动态链接库)
  • Windows 上的 .dll(动态链接库),里面包含很多的函数和代码,去给 exe 调用
  • LInux 上的动态库是 .so,虽然和 dll 格式不同,但本质是一样的

这个特性可以让我们自己去扩展 Redis 的功能。比如,Redis 自身已经提供了很多的数据结构和命名,通过扩展,让 Redis 支持更多的数据结构以及支持更多的命令

持久化

  • Persistence
    Redis 是把数据存储在内存上的,为了能更快速地访问。但内存上的数据是“易失的“(当进程退出/系统重启,数据就会丢失)

Redis 会把数据存储在硬盘上,内存为主,硬盘为辅(硬盘相当于对内存的数据备份了一下)。如果 Redis 重启了,就会在重启的时候加载硬盘中的备份数据,使 Redis 的内存回复到启动前的状态

集群

  • Clustering
    Redis 作为一个分布式系统的中间件,能够支持集群是很关键的

一个 Redis 能存储的数据是有限的(内存空间有限)。如果要存储更多的数据,就可以引入多个主机,部署多个 Redis 节点,每个 Redis 存储数据的一部分

高可用

  • High availability

核心就是“冗余/备份
Redis 自身也使支持“主从”结构,从节点就相当于主节点的备份,当主节点挂了,从节点就能顶上去,代替主节点。这样就能保证系统可用性是很高的。当主节点挂了用户也感知不到,因为在这挂的一瞬间,从节点就顶上去了

天下武功,唯快不破!但为什么 Redis 快?

  1. Redis 数据在内存中,就比访问硬盘的数据库速度要快很多

  2. Redis 核心功能都是比较简单的逻辑,功能都是比较简单的操作内存的数据结构

  3. 从网络角度上,Redis 使用了 IO多路复用 的方式(epoll
    IO多路复用 就是使用一个线程,管理多个 Socket。这样就可以在系统资源开销比较小的情况下,可以比较高效的处理比较高的并发量

  4. Redis 使用的是单线程模型(虽然更高版本的 Redis 引入了多线程)
    这样的单线程模型,减少了不必要的线程之间的竞争开销
    多线程提高效率的前提是:这是一个 CPU 密集型的任务,使用多个线程可以充分的利用多核资源。但是对于 Redis 来说,它的主要核心任务主要就是操作内存的数据结构,不会吃很多 CPU

redis 的应用场景

实时数据存储

  • Real-time data store
    Redis 当做了数据库,按照键值对存储数据。(低延迟、高吞吐情况)存的是全量数据,这里的数据不能随便丢
    大多数情况下,考虑到数据存储,优先考虑的是“”,但是仍然有一些场景,考虑的是“

缓存

  • Caching
    使用 MySQL 来存储数据,大、慢。使用二八原则,把热点数据拎出来,存储在 redis 中,把其他数据还是放在 MySQL
    redis 里面存的是部分数据,全量数据都是以 MySQL 为主的,哪怕 redis 里面的数据没有了,还可以从 MySQL 中再加载回来

  • session storage
    cookie 实现用户身份信息的保存,需要 session 配合
  • session 在服务器这里真正的存储了用户数据
  • cookie 只是在浏览器里存储了一个用户的身份标识(sessionId
    之前 session 是存储在应用服务器上的,但现在变成了分布式系统,引入了负载均衡

image.png|405
第一次客户端发出请求,负载均衡器将请求传到应用服务器 A,进行登录操作。登录成功之后,应用服务器就会生成当前用户的会话
但下次这个用户再次访问的时候,负载均衡器就可能将请求传到应用服务器 B,而这个应用服务器又没有这个用户上次进行访问产生的相关会话,难倒要再登录一次吗?
如何解决上述问题?

  1. 想办法让负载均衡器,把同一个用户的请求始终打到同一个机器上(不能轮询了,要通过 userId 之类的方式来分配机器)

  2. 把会话数据单独拎出来,放到一组独立的机器上存储image.png|447

  • 可以让应用服务器存到 redis 中,之后每一个应用服务器在读取会话或者写入会话的时候,都去访问这个 redis
  • 之后不管用户的请求打到那个应用服务器上,始终我们都是从 redis 中拿到会话,这样就能保证无论访问到哪台应用服务器上,会话数据都能被完整的拿到。
  • 万一应用程序重启了,会话也不会丢失

消息队列

  • Streaming & messaging
    此处说到的消息队列,是一个消息队列服务器。它是一个单独的服务器,起到消息队列的功能。基于这个服务器,我们就能实现一个网络版本的“生产者-消费者模型
    对分布式系统来说,服务器和服务器之间,有时候也需要使用到生产者消费者模型,因为有优势:
  1. 解耦合
  2. 削峰填谷
    业界也有很多知名的消息队列,RabbitMQ、Kafka、RocketMQ… redis 也是提供了消息队列的功能的,但一般不怎么使用。如果当前场景中,对于消息队列的功能依赖的不是很多,并且又不想引入额外的依赖,redis 可以作为一个选择

标签:存储,场景,redis,Redis,特性,内存,应用服务器,数据
From: https://blog.csdn.net/Yeeear/article/details/142028879

相关文章

  • Python中的`map()`函数和`filter()`函数及其应用场景
    在Python中,map()和filter()是两个内置的高阶函数,它们接受函数作为参数,并对序列(如列表、元组等)中的每个元素应用该函数。这两个函数虽然功能相似,但在使用目的和返回结果上有所不同。下面,我将分别详细解释map()和filter()函数的工作原理、应用场景,并探讨它们的异同点。1. map()......
  • 如何解决缓存(redis)和数据库(MySQL)数据不一致的问题?
    在使用缓存(如Redis)和数据库(如MySQL)时,数据不一致是常见的问题。通常,我们希望缓存能够提高系统的读性能,但同时也会面临缓存与数据库数据同步的问题。解决缓存与数据库数据不一致的问题有多种方法,常见的策略包括以下几种:1.缓存更新策略常用的缓存更新策略包括缓存穿透、缓存......
  • Redis访问工具
    使用Redis存储缓存数据,如何通过Java去访问Redis?防止后面看晕,先来张图。1.Redis的客户端库Redis的客户端库是Redis官方提供的,用于让Java等编程语言与Redis服务器进行通信的工具包。常见的Redis客户端库有多个,主要包括以下两种:1.1Jedis1.1.1特点Jedis是最早的JavaRedi......
  • 【C++11及其特性】智能指针——shared_ptr
    大家好,这里是国中之林!❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看←shared_ptr目录一.共享性智能指针二.shared_ptr的共享原理三.shared_ptr的构造函数1.普通的2.数组的3.带删除器......
  • C++11/14/17/20 新特性反汇编分析1
    区间for迭代类似于java中的foreach看个例子:数组的区间for迭代我们从第一行开始看,首先把数组a的地址放到eax中,再把eax的值放到[ebp-28h]中,也就是[ebp-28h]存储了元素的首地址,同理[ebp-34h]也存了a的首地址(这里猜测可能是多个变......
  • SpringBoot使用Redis
    0.导入maven依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency>1.配置ymlspring:data:redis:port:6379host:{redis.ip}......
  • 【Redis】redis5种数据类型(string)
    目录redis5种数据类型和内部编码方式redis单线程模型 string字符串类型相关命令SETGETMSETMGET SETNXSETEX​编辑PSETEXvalue值为整数,进行加减操作INCRINCRBYDECRDECRBYINCRBYFLOATAPPENDGETRANGESETRANGESTRLENstring的内部编码redis5种数据类型......
  • 常见并发工具类的使用场景
    常见并发工具类的使用场景ReentrantLockReentrantLock是一种可重入的独占锁,它允许同一个线程多次获取同一把锁而不会被阻塞。它的功能类似于synchronized是一种互斥锁,可以保证线程安全。可中断可以设置超时时间可以设置为公平锁支持多个条件变量与synchronized一样,都支......
  • 配置PHP的Session存储到Mysql / Redis / memcache 以及使用opcache以及apc缓存清除工
    一、配置PHP的Session存储到Mysql,Redis以及memcache等        PHP的会话默认是以文件的形式存在的,可以通过简单的配置到将Session存储到NoSQL中,即提高了访问速度,又能很好地实现会话共享!1.默认配置:session.save_handler=filessession.save_path=/tmp/2.配......
  • Network Policy使用场景
    Kubernetes中的NetworkPolicy是一种用于控制Pod之间网络通信的机制。它允许用户定义哪些Pod可以相互通信,从而提高集群的安全性和管理性。以下是一些常见的NetworkPolicy使用场景:1.微服务架构中的流量控制在微服务架构中,不同的服务可能需要限制对彼此的访问。通过NetworkPoli......