从hiredis使用出core谈谈redis多线程的使用

在实际工作中,我需要使用redis的客户端去连接redis,于是选择了hiredis客户端(公司强推)。  hiRedis 是 Redis 官方指定的 C 语言客户端开发包,支持 Redis 完整的命令集、管线以及事件驱动编程。

1、情景描述

1.1 使用场景

一个epool模型的服务器不断接受外界请求,这个服务器框架给用户预留一个回调函数(多线程),回调函数为用户自己去实现的业务逻辑,其中redis的使用就需要在这个回调函数内部实现。

1.2 初步实现方案

在程序启动的时候,我就初始化redis的连接,获得hiredis句柄。然后把hiredis句柄传入到线程函数里面。让其做相应的业务逻辑。

1.3 结果

很不幸,一次请求都没问题,做压力测试,同时开20个线程访问,程序立即出core。

线上出core如下:

01 (gdb) bt
02 #0  0x000000302af2e2ed in raise () from /lib64/tls/libc.so.6
03 #1  0x000000302af2fa3e in abort () from /lib64/tls/libc.so.6
04 #2  0x000000302af62db1 in __libc_message () from /lib64/tls/libc.so.6
05 #3  0x000000302af6888e in _int_free () from /lib64/tls/libc.so.6
06 #4  0x000000302af6a12d in _int_realloc () from /lib64/tls/libc.so.6
07 #5  0x000000302af6b39c in realloc () from /lib64/tls/libc.so.6
08 #6  0x0000000000dc2269 in sdscatlen (s=Variable "s" is not available.
09 ) at sds.c:97
10 #7  0x0000000000dc1d40 in __redisAppendCommand (c=0x16fa1d0, cmd=Variable "cmd" is not available.
11 ) at hiredis.c:1186
12 #8  0x0000000000dc1d97 in redisvAppendCommand (c=0x16fa1d0, format=Variable "format" is not available.
13 ) at hiredis.c:1206
14 #9  0x0000000000dc1eed in redisvCommand (c=0x16fa1d0, format=Variable "format" is not available.
15 ) at hiredis.c:1267
16 #10 0x0000000000dc1fb6 in redisCommand (c=Variable "c" is not available.
17 ) at hiredis.c:1276
18 #11 0x0000002b1a8e6310 in Default_Handler::get_batch_redis (this=0x1ff41f0, redis_ins=0x175a7d0, dataid=6202, buf_num=12, res_num=6, key_sign=0x2bd67cb3c8,
19     res_lens=0x2bd5f54208, res_buf=0x2bd5f54398 "") at default_handler.cpp:659
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net

原文地址:https://www.cnblogs.com/sjwudhwhhw/p/10442917.html

时间: 2024-11-29 02:44:19

从hiredis使用出core谈谈redis多线程的使用的相关文章

从hiredis使用出core谈谈redis多线程的使用【转】

在实际工作中,我需要使用redis的客户端去连接redis,于是选择了hiredis客户端(公司强推).  hiRedis 是 Redis 官方指定的 C 语言客户端开发包,支持 Redis 完整的命令集.管线以及事件驱动编程. 1.情景描述 1.1 使用场景 一个epool模型的服务器不断接受外界请求,这个服务器框架给用户预留一个回调函数(多线程),回调函数为用户自己去实现的业务逻辑,其中redis的使用就需要在这个回调函数内部实现. 1.2 初步实现方案 在程序启动的时候,我就初始化redi

asp.net core 使用 Redis 和 Protobuf

asp.net core 使用 Redis 和 Protobuf 前言 上篇博文介绍了怎么样在 asp.net core 中使用中间件,以及如何自定义中间件.项目中刚好也用到了Redis,所以本篇就介绍下怎么样在 asp.net core 中使用 Redis 进行资源缓存和Session缓存. 如果你觉得对你有帮助的话,不妨点个[推荐]. 目录 Redis 介绍 asp.net core Session 介绍 Redis & Session 实例讲解 Session的使用 使用 Protobuf

.net core下Redis帮助类

原文:.net core下Redis帮助类   0.引入.net core环境下Redis的NuGet包,StackExchange.Redis,现目前最新的2.0.519. 帮助类Code: 1 using System; 2 using System.Collections.Generic; 3 using StackExchange.Redis; 4 using Newtonsoft.Json; 5 using YJT.Web.lib; 6 using YJT.Common.Log; 7

谈谈redis,memcache的区别和具体应用场景

时间:2016 十月 12 1. Memcached简介 Memcached是以LiveJurnal旗下Danga Interactive公司的Bard Fitzpatric为首开发的高性能分布式内存缓存服务器.其本质上就是一个内存key-value数据库,但是不支持数据的持久化,服务器关闭之后数据全部丢失.Memcached使用C语言开发,在大多数像Linux.BSD和Solaris等POSIX系统上,只要安装了libevent即可使用.在Windows下,它也有一个可用的非官方版本(http

转载---谈谈redis,memcache的区别和具体应用场景

转载地址:http://www.cnblogs.com/Hondsome/p/5962144.html 1. Memcached简介 Memcached是以LiveJurnal旗下Danga Interactive公司的Bard Fitzpatric为首开发的高性能分布式内存缓存服务器.其本质上就是一个内存key-value数据库,但是不支持数据的持久化,服务器关闭之后数据全部丢失.Memcached使用C语言开发,在大多数像Linux.BSD和Solaris等POSIX系统上,只要安装了lib

Asp.Net Core 轻松学-多线程之取消令牌

前言 ????取消令牌(CancellationToken) 是 .Net Core 中的一项重要功能,正确并合理的使用 CancellationToken 可以让业务达到简化代码.提升服务性能的效果:当在业务开发中,需要对一些特定的应用场景进行深度干预的时候,CancellationToken 将发挥非常重要的作用. 1. 多线程请求合并数据源 在一个很常见的业务场景中,比如当请求一个文章详细信息的时候,需要同时加载部分点赞用户和评论内容,这里一共有 3 个任务,如果按照常规的先请求文章信息,

谈谈redis的热key问题如何解决

引言 讲了几天的数据库系列的文章,大家一定看烦了,其实还没讲完...(以下省略一万字).今天我们换换口味,来写redis方面的内容,谈谈热key问题如何解决.其实热key问题说来也很简单,就是瞬间有几十万的请求去访问redis上某个固定的key,从而压垮缓存服务的情情况.其实生活中也是有不少这样的例子.比如XX明星结婚.那么关于XX明星的Key就会瞬间增大,就会出现热数据问题.ps:hot key和big key问题,大家一定要有所了解.本文预计分为如下几个部分 热key问题 如何发现 业内方案

初步谈谈 C# 多线程、异步编程与并发服务器

多线程与异步编程可以达到避免调用线程异步阻塞作用,但是两者还是有点不同. 多线程与异步编程的异同: 1.线程是cpu 调度资源和分配的基本单位,本质上是进程中的一段并发执行的代码. 2.线程编程的思维符合正常人的思维习惯,线程中的处理程序依然是顺序执行,所以编程起来比较方便,但是缺点也是明显的,多线程的使用会造成多线程之间的上下文切换带来系统花销,并且共享变量之间也是会造成死锁的问题. 3.因为异步操作无须额外的线程负担,并且使用回调的方式进行处理,在设计良好的情况下,处理函数可以不必使用共享变

谈谈Java多线程(面试)

多线程的目的是为了最大限度的利用CPU资源. Java编写程序都运行在在Java虚拟机(JVM)中,在JVM的内部,程序的多任务是通过线程来实现的.每用java命令启动一个java应用程序,就会启动一个JVM进程.在同一个JVM进程中,有且只有一个进程,就是它自己.在这个JVM环境中,所有程序代码的运行都是以线程来运行. Java 虚拟机允许应用程序并发地运行多个执行线程.Java语言提供了多线程编程的扩展点,并给出了功能强大的线程控制API. 在Java中,多线程的实现有两种方式: 扩展jav