为什么要选择 Redis?

34 篇文章 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 迁移工具

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1、什么是 Redis?简述它的优缺点? 2、Redis 相比 memcached 有哪些优势? 3、Redis 支持哪几种数据类型? 4、Redis 主要消耗什么物理资源? 5、Redis 的全称是什么? 6、Redis 有哪几种数据淘汰策略? 7、Redis 官方为什么不提供 Windows 版本? 8、一个字符串类型的值能存储最大容量是多少? 9、为什么 Redis 需要把所有数据放到内存中? 10、Redis 集群方案应该怎么做?都有哪些方案? 11、Redis 集群方案什么情况下会导致整个集群不可用? 12、MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 13、Redis 有哪些适合的场景? 14、Redis 支持的 Java 客户端都有哪些?官方推荐用哪个? 15、RedisRedisson 有什么关系? 16、Jedis 与 Redisson 对比有什么优缺点? 17、Redis 如何设置密码及验证密码? 18、说说 Redis 哈希槽的概念? 19、Redis 集群的主从复制模型是怎样的? 20、Redis 集群会有写操作丢失吗?为什么? 21、Redis 集群之间是如何复制的? 22、Redis 集群最大节点个数是多少? 23、Redis 集群如何选择数据库? 24、怎么测试 Redis 的连通性? 25、Redis 中的管道有什么用? 26、怎么理解 Redis 事务? 27、Redis 事务相关的命令有哪几个? 28、Redis key 的过期时间和永久有效分别怎么设置? 29、Redis 如何做内存优化? 30、Redis 回收进程如何工作的?
1、什么是 Redis? 2、Redis 相比 memcached 有哪些优势? 3、Redis 支持哪几种数据类型? 4、Redis 主要消耗什么物理资源? 5、Redis 的全称是什么? 6、Redis 有哪几种数据淘汰策略? 7、Redis 官方为什么不提供 Windows 版本? 8、一个字符串类型的值能存储最大容量是多少? 9、为什么 Redis 需要把所有数据放到内存中? 10、Redis 集群方案应该怎么做?都有哪些方案? 11、Redis 集群方案什么情况下会导致整个集群不可用? 12、MySQL 里有 2000w 数据,Redis 中只存 20w 的数据, 如何保证 Redis 中的数据都是热点数据? 13、Redis 有哪些适合的场景? 14、Redis 支持的 Java 客户端都有哪些?官方推荐用哪个? 15、RedisRedisson 有什么关系? 16、Jedis 与 Redisson 对比有什么优缺点? 17、Redis 如何设置密码及验证密码? 18、说说 Redis 哈希槽的概念? 19、Redis 集群的主从复制模型是怎样的? 20、Redis 集群会有写操作丢失吗?为什么? 21、Redis 集群之间是如何复制的? 22、Redis 集群最大节点个数是多少? 23、Redis 集群如何选择数据库? 24、怎么测试 Redis 的连通性? 25、Redis 中的管道有什么用? 26、怎么理解 Redis 事务? 27、Redis 事务相关的命令有哪几个? 28、Redis key 的过期时间和永久有效分别怎么设置? 29、Redis 如何做内存优化? 30、Redis 回收进程如何工作的? 31、Redis 回收使用的是什么算法? 32、Redis 如何做大量数据插入? 33、为什么要做 Redis 分区? 34、你知道有哪些 Redis 分区实现方案? 35、Redis 分区有什么缺点? 36、Redis 持久化数据和缓存怎么做扩容? 37、分布式 Redis 是前期做还是后期规模上来了再做好?为 什么? 38、Twemproxy 是什么? 39、支持一致性哈希的客户端有哪些? 40、Redis 与其他 key-value 存储有什么不同? 41、Redis 的内存占用情况怎么样? 42、都有哪些办法可以降低 Redis 的内存使用情况呢? 43、查看 Redis 使用情况及状态信息用什么命令? 44、Redis 的内存用完了会发生什么? 45、Redis 是单线程的,如何提高多核 CPU 的利用率? 46、一个 Redis 实例最多能存放多少的 keys?List、Set、 Sorted Set 他们最多能存放多少元素? 47、Redis 常见性能问题和解决方案? 48、Redis 提供了哪几种持久化方式? 49、如何选择合适的持久化方式? 50、修改配置不重启 Redis 会实时生效吗?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柏油

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值