为什么要选择 Redis?

news2024/12/26 23:03:09

文章目录

  • 前言
  • 一、选型
  • 二、协议
  • 三、客户端
    • 1、常见 java 客户端
    • 2、常见可视化工具:
  • 四、Redis 生态
    • 1、模块
    • 2、代理
    • 3、其他


前言

Redis(Remote Dictionary Server),即「远程字典服务」是一个使用 ANSI C 编写的、开源的、支持网络的、基于内存的、可选持久化的键值对存储系统。

在 2013 年 5 月之前,Redis 的开发由 VMware 赞助,2013 年 5 月至 2015 年 6 月,由 Pivotal 赞助,从 2015 年 6 月起,Redis 的开发由 Redis Labs 赞助。

根据数据库使用排行网站 db-engines.com 上的排名,Redis 是目前最流行的键值对存储系统。

Redis 由 Salvatore Sanfilippo 在 2009 年发布初始版本,开源后不断发展壮大,目前的最新版为 Redis 7.0


一、选型

目前业内主要的缓存组件有:redis、memcached,主要特点如下:

在这里插入图片描述

用一句话总结:在性能相差不大的情况下,Redis 提供了更丰富的数据类型,同时,对可靠性以及扩展性也提供了较好的支持。

二、协议

全称:Redis Serialization Protocol,即 Redis 序列化协议,有以下三个显著特点:

  • 人类易读
  • 简单实现
  • 快速解析

RESP2 协议如下:
Redis Serialization Protocol
是不是非常简单?

Redis6.0 版本开始,协议进行了升级,即 支持 RESP3 协议,相较于 RESP2 提供了更「语义化」能力,比如支持 doubleboolean 等类型。

值得注意的是,在 Redis6.x 版本中同时支持 RESP2 和 RESP3,但在 Redis7.0 及之后的版本将不再支持 RESP2,届时,所有的客户端将进行全面升级(如果你需要使用7.0及之后的版本)

三、客户端

支持 RESP 协议、封装 Redis 命令的 SDK,其主要作用是帮助我们与服务端进行通信,目前已经提供了非常多的开源客户端实现,支持 C、Java、Python … 等多种语言。

在这里插入图片描述

笔者工作中主要用 Java 进行开发,这里主要列举 Java 相关的客户端 SDK。

1、常见 java 客户端

1)目前常见的 Java 客户端工具库有:

  • jedis:老牌 java 客户端,redis 命令的 java 版“翻译”
  • lettuce:底层依赖 netty 组件进行网络通信,支持异步、响应式编程
  • redisson:高级客户端,实现了一些常用的 redis 工具,如 分布式锁、限流器、布隆过滤器等,底层也依赖 netty 组件。

2)Spring 体系:

  • spring-data-redis:按 spring 风格,对接口进一步封装、抽象。底层依赖jedis/lettuce/redisson 提供能力,默认使用 lettuce。
  • spring-cache:Spring 提供的 cache 抽象层,对应用提供注解支持,底层支持 Caffeine、EhCache、Redis 等多种缓存实现。

例如:当你想用 spring-cache 注解能力并且底层要依赖 redis 时,你可以先添加依 spring-data-redis 包依赖,然后 spring 进行自动扫描就可以了。

3)其他:

  • jetCache:阿里提供的缓存解决方案,相当于 SpringCache 提供更有效的注解支持,支持原生TTL、二级缓存、自动刷新等。目前底层实现有 RedisCache、TairCache、CaffeineCache 以及 LinkedHashMapCache。

这么多该如何选择?

工具不在于多,关键看你自身的场景下是否够用,比如你的项目可以只使用 jedis,当然,后面你可能还想使用「分布式锁」「限流器」等支持,可以再使用 redisson 。(搞懂核心问题,不迷路~

2、常见可视化工具:

Redis Desktop Manager(RDM):一款好用的 Redis 桌面管理工具,支持命令控制台操作,以及常用查询 key、rename、delete 等操作:

在这里插入图片描述

RedisInsight:官方提供可视化工具,可用于查询、修改和分析数据。

在这里插入图片描述

选择一款用的顺手的可视化工具,提升效率~

四、Redis 生态

1、模块

Module 模块:Redis 提供的可自定义扩展的能力,支持灵活编写适用于自身场景的功能。

目前一些常见开源模块实现:RedisJson、RedisSearch、RedisBloom 等,使用其他和 Redis 命令风格一致,如:

在这里插入图片描述

如何实现自定义模块并使用?

  • Redis 的模块采用的是动态链接库的方式,可以启动的时候加载,也可以在运行时加载。
  • 要实现分离,首先需要的是初始化,以便让框架可以找到对应的方法,这就需要进行注册,Redis 通过 RedisModule_Init 方法进行注册模块,使用 RedisModule_CreateCommand 注册自定义方法。
  • Redis 提供了 redismodule.h 头文件,通过实现该头文件相关 API 函数,然后编译为 so 动态库,可以在配置文件中使用 loadmodule 指明,也可以在运行时使用命令动态加载。

最简单的例子:

#include "redismodule.h"
#include <stdlib.h>

int HelloworldRand_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
    RedisModule_ReplyWithLongLong(ctx,rand());
    return REDISMODULE_OK;
}

int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
    if (RedisModule_Init(ctx,"helloworld",1,REDISMODULE_APIVER_1)
        == REDISMODULE_ERR) return REDISMODULE_ERR;

    if (RedisModule_CreateCommand(ctx,"helloworld.rand",
        HelloworldRand_RedisCommand, "fast random",
        0, 0, 0) == REDISMODULE_ERR)
        return REDISMODULE_ERR;

    return REDISMODULE_OK;
}

该案例提供两个方法,其中 HelloworldRand_RedisCommand 是我们自定义的命令,用以输出随机数,实现了 redismodule.h 中的 RedisModule_ReplyWithLongLong 方法。

而 RedisModule_OnLoad 方法则是通过 RedisModule_Init 和 RedisModule_CreateCommand 将我们自定义的命令注册到 Redis。

两种加载方式:

  • 配置化:即在 redis.config 文件中配置 loadmodule /path/to/mymodule.so
  • 运行时:执行 MODULE LOAD /path/to/mymodule.so

另外我们还可以使用命令查看模块列表:

MODULE LIST

也可以卸载模块:

MODULE UNLOAD mymodule

2、代理

目前代理有两种主要用途:

  • 集群能力:需要在 proxy 做路由,因此也需要维护元数据信息
  • 客户端能力:将客户端的部分能力移至 proxy,比如哨兵或集群信息变更通知客户端等,proxy 对客户端提供访问 IP,后续 redis 服务任何变更都不需要通知客户端,对客户端十分友好。

1)社区早期集群方案:Codis、Temproxy

在这里插入图片描述
特点:redis 服务节点间无交流、代理层做路由、需要单独部署高可用(如哨兵)

2)predixy:支持多种 redis 运行模式,对客户端友好

在这里插入图片描述
这种 proxy 便是代理「客户端能力」,将「与 redis 服务交互的部分能力」移到代理层处理。

对客户端来说,直接访问代理层,redis 服务如何变化无需感知,这是目前大多数云服务厂商常用的方式,对客户端十分友好。

3、其他

工具:

  • 解析:python 版RDB文件解析工具:Redis-rdb-tools
  • 迁移:C 版本的 redis-migrate-tool 迁移工具

在这里插入图片描述
可以看到,目前已经提供了多种语言的开源客户端、支持多种系统、同时也支持容器化部署 … ,其生态俨然十分强大了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/63880.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【电力系统】基于YALMIP 的微网(光伏+风电+蓄电池+微电网+柴油机)优化调度模型附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

Unity—UGUI

每日一句&#xff1a;读数、学习 去更远的地方&#xff0c;才能摆脱那些你不屑一顾的圈子 目录 InputFiled输入框 例&#xff1a;用户名和密码 Toggle组件 案例&#xff1a;冷却效果 InputFiled输入框 Text Component 输入文本组件 Text输入内容 Character Limit 输入字符…

宝塔后渗透-添加用户_反弹shell

更新时间&#xff1a;2022年11月21日 1. 背景介绍 对于想拿到bt后台来说&#xff0c;非常的艰难&#xff1a;无非是通过bypass之后提权&#xff0c;直接拿到服务器的root权限&#xff0c;然后再去宝塔后台。 当然&#xff0c;还有一种运气十分爆棚的方法&#xff1a;发现了b…

Qt的Q_UNUSED()函数的功能

目录Qt Assistant&#xff08;Qt 助手&#xff09;构建场景其他一些平替方法参考Qt Assistant&#xff08;Qt 助手&#xff09; 函数名直译过来是【不用的&#xff1b;从未用过的】。 碰到陌生的函数不要慌&#xff0c;直接Qt Assistant查一哈。 Q_UNUSED(name) Indicates to …

负载均衡器 OpenELB ARP 欺骗技术解析

作者&#xff1a;大飞哥&#xff0c;视源电子运维工程师&#xff0c;KubeSphere 用户委员会广州站站长&#xff0c;KubeSphere Ambassador。 K8S 对集群外暴露服务有三种方式&#xff1a;NodePort&#xff0c;Ingress 和 Loadbalancer。NodePort 用于暴露 TCP 服务(4 层)&#…

基于5G智能网关的水泵远程监控系统方案

方案背景 水泵作为一种常见的水务设备&#xff0c;在日常的生产、生活中发挥重要的作用。为了保证生产、生活用水&#xff0c;也为了预防异常天气带来的过度降水&#xff0c;水泵具备的供水、排水作用都是不可忽视的。然而&#xff0c;很多地区的水泵管理模式依然停留在专人看…

毕业设计-基于机器视觉的手写字识别系统

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…

变焦镜头内参数如何获得?

很多时候,我们是使用相应的棋盘格标定进行相机内参数的获取,但是对于相机而言,如果要是焦距范围是测量比较远的物体,那么我们要进行注意相应的内参数就是不能够使用棋盘格标定法进行获取,因为不准. 由于项目的需要,这里我就是需要进行探究一下,如何通过自己调试直接设定内参数…

CSS 实现卡片边框渐变动画

前言 &#x1f44f;CSS实现卡片边框渐变动画&#xff0c;速速来Get吧~ &#x1f947;文末分享源代码。记得点赞关注收藏&#xff01; 1.实现效果 2.实现步骤 父容器添加背景渐变色 <div class"card"></div>.card {background: linear-gradient(0deg, …

Tensorboader图片和模型可视化

非常简单&#xff0c;10分钟搞懂1 Tensorboader介绍2 进行写入和运行&#xff08;共2步&#xff09;3 图像显示3.1 显示图片3.2 显示模型3.3 动态显示学习率等参考文献1 Tensorboader介绍 它就是1个可视化工具&#xff0c;需要用pip进行下载&#xff1b; 下载以后进行显示&a…

SpringCloud框架(三):微服务优化,Feign的最佳实现方案

SpringCloud环境搭建&#xff1a;生产和消费 RestTemplate Spring章节复习已经过去&#xff0c;新的章节SpringCloud开始了&#xff0c;这个章节中将会回顾微服务相关 主要依照以下几个原则 每一个组件的Demo和Coding上传到我的代码仓库在原有基础上加入一些设计模式&#xf…

数据结构与算法之图的应用

一.树之习题选讲-Tree Traversals Again 树习题-TTA.1 题意理解 非递归中序遍历的过程 1. Push的顺序为先序遍历(pre)2. Pop的顺序给出中序遍历(in) 树习题-TTA.2 核心算法 上图分别是先序、中序、后序遍历通过规律我们可以看到他们之间的位置分配 //伪代码 void solve(int …

Zabbix在X86服务器上的部署流程

服务器资源:Centos7、X86架构 部署zabbix服务端 #设置SELinux 成为permissive模式临时关闭selinux防火墙 setenforce 0 #获取zabbix的下载源和更换阿里源 https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm #解压zabbix包 …

探花交友_第4章_MongoDB基础(新版)

探花交友_探花交友_第4章_MongoDB基础(新版) 文章目录探花交友_探花交友_第4章_MongoDB基础(新版)课程介绍1. 通用设置1.1 需求分析1.1.1 需求分析1.1.2 数据库表1.1.3 实体类SettingsQuestionBlackList1.2 查询通用设置1.2.1 接口文档1.2.2 代码实现vo对象tanhua-app-serverSe…

易知微11月更新速递 | 预案集如何实现“一屏多端”联动指挥体系

伴随着“2022Easy Future秋季产品发布会”的举行&#xff0c;易知微也迎来了EasyV6.0的全新升级&#xff0c;通过新产品、新服务&#xff0c;助力实现一个能“数智视融合&#xff0c;虚实人联动”的数字增强世界。近一个月我们依旧奋力于产品迭代优化&#xff0c;又给大家带来了…

留学生Paper写作怎么进行深度解析?

对于留学生Paper而言&#xff0c;要想文章显得井井有条&#xff0c;逻辑结构在这个时候就显得很重要&#xff01;为什么这样说呢&#xff1f;首先我们要认识到一点&#xff0c;就是Paper必须做到内容和形式上统一。内容就是文章的主题和材料&#xff0c;形式是指逻辑结构和语言…

视觉小目标检测论文速读

视觉小目标检测论文速读 本文主要针对三篇文章典型文章。 一. SuperYOLO Super Resolution Assisted Object Detection in Multimodal Remote Sensing Imagery 1. 主要工作: 首先去掉Focus模块取保持HR特征, 避免分辨率下降&#xff0c;有效克服小目标空间损失的减少。利…

(一) SpringCloud+Security+Oauth2微服务授权初步认识

一 引言 再前面的security专题中 我们学习了单体架构基于SpringSecurity实现的授权方案,这种在业务量较小及业务的复杂度较低时比较实用,随着业务的复杂度越来越高,微服务架构也越来越被更多的公司使用&#xff0c;本文就微服务中的主流授权方案及oauth2中基本概念做简要概述。…

厨神之蛋糕制作

失败了7次&#xff0c;成功了6次。成功的6次里有好有坏&#xff0c;总结一下蛋糕制作的过程与要点。 原料 低筋面粉&#xff08;筋度越高越偏向包子馒头的口感&#xff0c;松软度越低&#xff09;、白糖、鸡蛋、水&#xff08;也可以用牛奶或其他含水的物质&#xff09;、食用…

多目slam论文阅读系列一:MULTICOL-SLAM论文阅读

论文地址&#xff1a;https://arxiv.org/pdf/1610.07336.pdf 代码&#xff1a;GitHub - urbste/MultiCol-SLAM: This repository contains a multi-fisheye camera SLAM. The underlying SLAM system is based on ORB-SLAM.参考文档&#xff1a;【算法】跑MultiCol-SLAM遇到的效…