redis[1]客户端简单样例

原创 2016年06月01日 16:30:20

为了更加深入的理解redis通讯协议,写了一个简单的客户端,
注意:官方提供了客户端,一般情况下直接用官方的就可以了

以下代码采用最简单的select模型,并且没有做异常处理;
程序逻辑比较简单测试测试了下不同线程数情况下 不同写入通一个key值情况的性能

#include <stdio.h>
#include <stddef.h>
#include <stdint.h>
#include <thread>
#include <atomic>

#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")


int g_time_out_s = 30;

size_t read(SOCKET fd, char *buf, size_t count)
{
    struct timeval timeout;
    timeout.tv_sec = g_time_out_s;
    timeout.tv_usec = 0;

    fd_set readfds;
    FD_ZERO(&readfds);
    FD_SET(fd, &readfds);   
    int num = select(0, &readfds, NULL, NULL, &timeout);

    if (num > 0)
    {
        return recv(fd, buf, count, 0);
    }

    printf("读取异常\n");
    return num;
}

size_t write(SOCKET fd, char *buf, size_t count)
{
    struct timeval timeout;
    timeout.tv_sec = g_time_out_s;
    timeout.tv_usec = 0;

    fd_set writefds;
    FD_ZERO(&writefds);
    FD_SET(fd, &writefds);
    int num = select(0, NULL, &writefds, NULL, &timeout);

    if (num > 0)
    {
        return send(fd, buf, count, 0);
    }

    printf("写入异常\n");
    return num;
}

int g_MAX = 100000;

int test()
{
    SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (s == INVALID_SOCKET)
        return 0;

    int port = 10000;
    char *ip = "192.168.120.211";

    SOCKADDR_IN addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
    addr.sin_addr.S_un.S_addr = inet_addr(ip);

    int code = connect(s, (struct sockaddr FAR *) &addr, sizeof(addr));
    if (code != 0)
        return 0;

    for (int i = 0; i < g_MAX; ++i)
    {
        char write_buf[1024] = { 0 };
        char read_buf[1024] = { 0 };

        strcpy(write_buf, "*3\x0d\x0a$3\x0d\x0aset\x0d\x0a$3\x0d\x0amsg\x0d\x0a$5\x0d\x0ahello\x0d\x0a");

        write(s, write_buf, strlen(write_buf)); 

        read(s, read_buf, sizeof(read_buf));        
    }

    return 0;
}


int main(int argc, char **argv)
{
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);   

#define THRS 300
    std::thread thr_pool[THRS];

    for (int thrs = 1; thrs <= THRS; ++thrs)
    {
        long long b_time = GetCurrentTime();

        for (int i = 0; i < thrs; ++i)
        {
            std::thread thr_temp(test);
            thr_pool[i].swap(thr_temp);
        }

        for (int i = 0; i < thrs; ++i)
            thr_pool[i].join();

        long long e_time = GetCurrentTime();
        printf("[%2d]个线程下 速度:%f (笔/s)\n", thrs, (1000.0 * g_MAX * thrs) / (e_time - b_time));
    }       

    system("pause");
    return 0;
}

截图是程序跑的部分结果

同步执行set命令

美团在Redis上踩过的一些坑-1.客户端周期性出现connect timeout

转载请注明出处哈:http://carlosfu.iteye.com/blog/2254154          1. 背景:       大部分互联网公司都会有Mysql或者Ora...
  • liqfyiyi
  • liqfyiyi
  • 2016年03月15日 09:36
  • 4195

python实现简单redis客户端(1)

目的: (1)学习各种数据库客户端的原理: 连接数据库服务器的端口,发送协议,受到应答 (2)redis协议 Redis 的通信协议是基于文本的,且以行为划分,每行以 \r\n 结束。每一行都...
  • yz764127031
  • yz764127031
  • 2017年08月16日 13:22
  • 71

Redis一主两从模式客户端封装

1,redis采用的是1主2从模式,读写分离,服务端版本为3.0。 2,Java客户端使用的是jedis2.5.2 上代码----------------------- 1,封装的配置文...
  • z3pc_ooxx
  • z3pc_ooxx
  • 2016年10月25日 14:01
  • 570

redis配置文件样例(二)

原文:https://raw.githubusercontent.com/antirez/redis/2.8/redis.conf主从备份。使用slaveof创建一个Redis实例作为另一个Redis...
  • mishifangxiangdefeng
  • mishifangxiangdefeng
  • 2015年11月25日 09:18
  • 2768

Redis介绍、安装、客户端

Redis介绍、安装、客户端
  • ZJDWHD
  • ZJDWHD
  • 2016年11月16日 02:53
  • 6401

redis系列(六)客户端和服务器

这篇博客比较简单,主要是刚开始的时候不必对 redis 内部的一些有太清楚的了解。待基本上对 redis 有一个初步的了解之后,在对 redis 内部的一些原理,函数以及源码进行研究,这个我会在后续的...
  • zhihui0317
  • zhihui0317
  • 2017年03月21日 15:22
  • 503

redis 客户端连接

客户端连接 1、 用redis自带的命令行客户端 [root@notrue-centos redis]# bin/redis-cli -h localhost -p 6379 ...
  • ZuoAnYinXiang
  • ZuoAnYinXiang
  • 2015年12月11日 10:18
  • 3380

asp简单样例(1)

1.循环生成多个标题 2.使用vbscript调用javascript和vbscrip写的函数 ASP中,可以使用多种脚本语言,但是javascript和vbscri...
  • f156207495
  • f156207495
  • 2017年10月19日 15:16
  • 158

如何在linux下安装redis及客户端的连接

1.场景还原      对于缓存,我想大家并不陌生。根据项目需求对相应的数据进行缓存,这样可以不仅提供用户体验,也能减少网页请求所需的流量耗费;今天,我就来讲讲linux中如何安装redis。 2...
  • zhangxing52077
  • zhangxing52077
  • 2017年06月05日 13:53
  • 3022

个人对Redis的一些简单理解

这是个人在这边写的第二篇文章 毕业一年半了,从合肥转战来到上海,最大变化的是头发稀少了好多...... 今天写写redis,以及集群方面的东西    redis的作用百度很多,确实...
  • qq_15057147
  • qq_15057147
  • 2016年12月22日 14:31
  • 486
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:redis[1]客户端简单样例
举报原因:
原因补充:

(最多只允许输入30个字)