漫话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基本数据类型和使用详解》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操作示例三

Redis中Set结构使用过程与原理说明

《Redis中Set结构使用过程与原理说明》本文解析了RedisSet数据结构,涵盖其基本操作(如添加、查找)、集合运算(交并差)、底层实现(intset与hashtable自动切换机制)、典型应用场... 目录开篇:从购物车到Redis Set一、Redis Set的基本操作1.1 编程常用命令1.2 集

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse

Redis中的AOF原理及分析

《Redis中的AOF原理及分析》Redis的AOF通过记录所有写操作命令实现持久化,支持always/everysec/no三种同步策略,重写机制优化文件体积,与RDB结合可平衡数据安全与恢复效率... 目录开篇:从日记本到AOF一、AOF的基本执行流程1. 命令执行与记录2. AOF重写机制二、AOF的

Redis高性能Key-Value存储与缓存利器常见解决方案

《Redis高性能Key-Value存储与缓存利器常见解决方案》Redis是高性能内存Key-Value存储系统,支持丰富数据类型与持久化方案(RDB/AOF),本文给大家介绍Redis高性能Key-... 目录Redis:高性能Key-Value存储与缓存利器什么是Redis?为什么选择Redis?Red

java 恺撒加密/解密实现原理(附带源码)

《java恺撒加密/解密实现原理(附带源码)》本文介绍Java实现恺撒加密与解密,通过固定位移量对字母进行循环替换,保留大小写及非字母字符,由于其实现简单、易于理解,恺撒加密常被用作学习加密算法的入... 目录Java 恺撒加密/解密实现1. 项目背景与介绍2. 相关知识2.1 恺撒加密算法原理2.2 Ja

Nginx屏蔽服务器名称与版本信息方式(源码级修改)

《Nginx屏蔽服务器名称与版本信息方式(源码级修改)》本文详解如何通过源码修改Nginx1.25.4,移除Server响应头中的服务类型和版本信息,以增强安全性,需重新配置、编译、安装,升级时需重复... 目录一、背景与目的二、适用版本三、操作步骤修改源码文件四、后续操作提示五、注意事项六、总结一、背景与

Android实现图片浏览功能的示例详解(附带源码)

《Android实现图片浏览功能的示例详解(附带源码)》在许多应用中,都需要展示图片并支持用户进行浏览,本文主要为大家介绍了如何通过Android实现图片浏览功能,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

Redis 的 SUBSCRIBE命令详解

《Redis的SUBSCRIBE命令详解》Redis的SUBSCRIBE命令用于订阅一个或多个频道,以便接收发送到这些频道的消息,本文给大家介绍Redis的SUBSCRIBE命令,感兴趣的朋友跟随... 目录基本语法工作原理示例消息格式相关命令python 示例Redis 的 SUBSCRIBE 命令用于订