漫话Redis源码之七十四

2024-02-06 09:38
文章标签 源码 redis 漫话 七十四

本文主要是介绍漫话Redis源码之七十四,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

SSL大家应该很熟悉,就是为了确保安全的,openssl应该听说过吧:

/* Wrapper around redisSecureConnection to avoid hiredis_ssl dependencies if* not building with TLS support.*/
int cliSecureConnection(redisContext *c, cliSSLconfig config, const char **err) {
#ifdef USE_OPENSSLstatic SSL_CTX *ssl_ctx = NULL;if (!ssl_ctx) {ssl_ctx = SSL_CTX_new(SSLv23_client_method());if (!ssl_ctx) {*err = "Failed to create SSL_CTX";goto error;}SSL_CTX_set_options(ssl_ctx, SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3);SSL_CTX_set_verify(ssl_ctx, config.skip_cert_verify ? SSL_VERIFY_NONE : SSL_VERIFY_PEER, NULL);if (config.cacert || config.cacertdir) {if (!SSL_CTX_load_verify_locations(ssl_ctx, config.cacert, config.cacertdir)) {*err = "Invalid CA Certificate File/Directory";goto error;}} else {if (!SSL_CTX_set_default_verify_paths(ssl_ctx)) {*err = "Failed to use default CA paths";goto error;}}if (config.cert && !SSL_CTX_use_certificate_chain_file(ssl_ctx, config.cert)) {*err = "Invalid client certificate";goto error;}if (config.key && !SSL_CTX_use_PrivateKey_file(ssl_ctx, config.key, SSL_FILETYPE_PEM)) {*err = "Invalid private key";goto error;}if (config.ciphers && !SSL_CTX_set_cipher_list(ssl_ctx, config.ciphers)) {*err = "Error while configuring ciphers";goto error;}
#ifdef TLS1_3_VERSIONif (config.ciphersuites && !SSL_CTX_set_ciphersuites(ssl_ctx, config.ciphersuites)) {*err = "Error while setting cypher suites";goto error;}
#endif}SSL *ssl = SSL_new(ssl_ctx);if (!ssl) {*err = "Failed to create SSL object";return REDIS_ERR;}if (config.sni && !SSL_set_tlsext_host_name(ssl, config.sni)) {*err = "Failed to configure SNI";SSL_free(ssl);return REDIS_ERR;}return redisInitiateSSL(c, ssl);error:SSL_CTX_free(ssl_ctx);ssl_ctx = NULL;return REDIS_ERR;
#else(void) config;(void) c;(void) err;return REDIS_OK;
#endif
}/* Wrapper around hiredis to allow arbitrary reads and writes.** We piggybacks on top of hiredis to achieve transparent TLS support,* and use its internal buffers so it can co-exist with commands* previously/later issued on the connection.** Interface is close to enough to read()/write() so things should mostly* work transparently.*//* Write a raw buffer through a redisContext. If we already have something* in the buffer (leftovers from hiredis operations) it will be written* as well.*/
ssize_t cliWriteConn(redisContext *c, const char *buf, size_t buf_len)
{int done = 0;/* Append data to buffer which is *usually* expected to be empty* but we don't assume that, and write.*/c->obuf = sdscatlen(c->obuf, buf, buf_len);if (redisBufferWrite(c, &done) == REDIS_ERR) {if (!(c->flags & REDIS_BLOCK))errno = EAGAIN;/* On error, we assume nothing was written and we roll back the* buffer to its original state.*/if (sdslen(c->obuf) > buf_len)sdsrange(c->obuf, 0, -(buf_len+1));elsesdsclear(c->obuf);return -1;}/* If we're done, free up everything. We may have written more than* buf_len (if c->obuf was not initially empty) but we don't have to* tell.*/if (done) {sdsclear(c->obuf);return buf_len;}/* Write was successful but we have some leftovers which we should* remove from the buffer.** Do we still have data that was there prior to our buf? If so,* restore buffer to it's original state and report no new data was* writen.*/if (sdslen(c->obuf) > buf_len) {sdsrange(c->obuf, 0, -(buf_len+1));return 0;}/* At this point we're sure no prior data is left. We flush the buffer* and report how much we've written.*/size_t left = sdslen(c->obuf);sdsclear(c->obuf);return buf_len - left;
}/* Wrapper around OpenSSL (libssl and libcrypto) initialisation*/
int cliSecureInit()
{
#ifdef USE_OPENSSLERR_load_crypto_strings();SSL_load_error_strings();SSL_library_init();
#endifreturn REDIS_OK;
}

这篇关于漫话Redis源码之七十四的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/683875

相关文章

Redis 命令详解与实战案例

《Redis命令详解与实战案例》本文详细介绍了Redis的基础知识、核心数据结构与命令、高级功能与命令、最佳实践与性能优化,以及实战应用场景,通过实战案例,展示了如何使用Redis构建高性能应用系统... 目录Redis 命令详解与实战案例一、Redis 基础介绍二、Redis 核心数据结构与命令1. 字符

SpringBoot18 redis的配置方法

《SpringBoot18redis的配置方法》本文介绍在SpringBoot项目中集成和使用Redis的方法,包括添加依赖、配置文件、自定义序列化方式、使用方式、实际使用示例、常见操作总结以及注意... 目录一、Spring Boot 中使用 Redis1. 添加依赖2. 配置文件3. Redis 配置类

Redis中群集三种模式的实现

《Redis中群集三种模式的实现》Redis群集有三种模式,分别是主从同步/复制、哨兵模式、Cluster,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1. Redis三种模式概述2、Redis 主从复制2.1 主从复制的作用2.2 主从复制流程2

Redis的安全机制详细介绍及配置方法

《Redis的安全机制详细介绍及配置方法》本文介绍Redis安全机制的配置方法,包括绑定IP地址、设置密码、保护模式、禁用危险命令、防火墙限制、TLS加密、客户端连接限制、最大内存使用和日志审计等,通... 目录1. 绑定 IP 地址2. 设置密码3. 保护模式4. 禁用危险命令5. 通过防火墙限制访问6.

深入理解Redis线程模型的原理及使用

《深入理解Redis线程模型的原理及使用》Redis的线程模型整体还是多线程的,只是后台执行指令的核心线程是单线程的,整个线程模型可以理解为还是以单线程为主,基于这种单线程为主的线程模型,不同客户端的... 目录1 Redis是单线程www.chinasem.cn还是多线程2 Redis如何保证指令原子性2.

Docker + Redis 部署集群的实现步骤

《Docker+Redis部署集群的实现步骤》本文详细介绍了在三台服务器上部署高可用Redis集群的完整流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录一、环境准备1. 服务器规划(3 台服务器)2. 防火墙配置(三台服务器均执行)3. 安装 docke

Redis中删除策略的几种实现方式

《Redis中删除策略的几种实现方式》本文详细介绍了Redis的过期键删除策略和内存淘汰策略,过期键删除策略包括定时删除、惰性删除和定期删除,具有一定的参考价值,感兴趣的可以了解一下... 目录前言一、设计背景:为什么需要删除策略?二、第一类:过期键的 3 种核心删除策略1. 定时删除(Timed Dele

Spring Boot整合Redis注解实现增删改查功能(Redis注解使用)

《SpringBoot整合Redis注解实现增删改查功能(Redis注解使用)》文章介绍了如何使用SpringBoot整合Redis注解实现增删改查功能,包括配置、实体类、Repository、Se... 目录配置Redis连接定义实体类创建Repository接口增删改查操作示例插入数据查询数据删除数据更

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash

Redis中Hash从使用过程到原理说明

《Redis中Hash从使用过程到原理说明》RedisHash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化... 目录一、开篇:Hash就像超市的货架二、Hash的基本使用1. 常用命令示例2. Java操作示例三