Redis是一个非常高效的基于内存的NOSQL数据库,它提供非常高效的数据读写效能.在实际应用中往往是带宽和CLIENT库读写损耗过高导致无法更好地发挥出Redis更出色的能力.下面结合一些redis本身的特性和一些client操作上的改变来提高整个redis操作的交通.

上图是反映平常操作redis的情况,每个线程都独立的发起相应连接对redis的网络读写.虽然我们可以通过批操作的方式来把当前多个操作合并成一个,但这种方式只能针对当单线程,而多线程相互合并则设计上很少关注.从redis的协议来说其实并没有限制,只是在client库的设计一般没有考虑进去.

如果在多线程操作REDIS的同时如果能够合并网络操作,那意味着可以降低操作网络读写的情况把处理能力提升到最大化.这样Client总体的性能都会有所提升,而REDIS也因表层的网络读取减少而达到更好的利用率.

以上是设计图,原理并不复杂,其实就是把每个请求的操作放到一个队列中,后面开启一个线程来把前面的指令进行一个合并操操作.一个线程在高并发下可以无法更快速地合并起来,可以根据需要进行合理的操作线程应用.

这种设计的效果是否真的比较理想呢,以一上是一个简单的测试

            public void AnycSet()
{ CodeTimer.Time("beetle.redis asynset", () =>
{
Parallel.For(0, Count, x =>
{
ProtobufKey key = x.ToString();
key.AsynSet(new User() { UserId = x, NickName = "sdffffffffffffffffffffffffffffffffffffffffsdffffffffffffffffffffffffffffffffffffffffbeetlesdffffffffffffffffffffffffffffffffffffffffsdffffffffffffffffffffffffffffffffffffffff" + x }); });
});
}
public void Set()
{ CodeTimer.Time("beetle.redis set", () =>
{
Parallel.For(0, Count, x =>
{
ProtobufKey key = x.ToString();
key.Set(new User() { UserId = x, NickName = "sdffffffffffffffffffffffffffffffffffffffffsdffffffffffffffffffffffffffffffffffffffffbeetlesdffffffffffffffffffffffffffffffffffffffffsdffffffffffffffffffffffffffffffffffffffff" + x }); });
});
}

测试结果如下

以上是10W次的操作测试结果,由于redis在本机所以交互非常可观.

虽然在多线程高并发下这样的设计可以把吞吐能力和效能有一个非常不错的效果,但其也存在缺陷因为每次操作都经过不同线程的调处理,如果并发线程不多操作密集度不高.那效果并不理想;因为网络操作密集度不高,可得到并合的数量不多,这方面的损耗有可能低于操作跨线程调度所带来的损耗.

更高效地提高redis client多线程操作的并发吞吐设计的更多相关文章

  1. C语言数组操作和指针操作谁更高效

    在上一篇博文  代码优化小技巧(持续更新......) 第三条关于数组和指针谁更高效, 意犹未尽, 决定单独拉出一篇来讲 1. 数组和指针操作对比 #include <stdio.h> i ...

  2. 这些小工具让你的Android 开发更高效

    在做Android 开发过程中,会遇到一些小的问题.尽管自己动手也能解决.可是有了一些小工具,解决这些问题就得心应手了,今天就为大家推荐一下Android 开发遇到的小工具,来让你的开发更高效. Vy ...

  3. Redis进阶实践之十八 使用管道模式提高Redis查询的速度

    原文:Redis进阶实践之十八 使用管道模式提高Redis查询的速度 一.引言             学习redis 也有一段时间了,该接触的也差不多了.后来有一天,以为同事问我,如何向redis中 ...

  4. 如何高效地向Redis插入大量的数据

    最近有个哥们在群里问,有一个日志,里面存的是IP地址(一行一个),如何将这些IP快速导入到Redis中. 我刚开始的建议是Shell+redis客户端. 今天,查看Redis官档,发现文档的首页部分( ...

  5. python之redis和memcache操作

    Redis 教程 Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理.Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据 ...

  6. 如何高效地向Redis插入大量的数据(转)

    最近有个哥们在群里问,有一个日志,里面存的是IP地址(一行一个),如何将这些IP快速导入到Redis中. 我刚开始的建议是Shell+redis客户端. 今天,查看Redis官档,发现文档的首页部分( ...

  7. 通过多线程处理提高Redis性能

    Redis通常被称为单进程单线程模型. 这不是真的! Redis还运行多个后端线程来执行后端清理工作,例如清理脏数据和关闭文件描述符.在Redis中,主线程负责主要任务,包括但不限于:接收来自客户端的 ...

  8. redis和memcached有什么区别?redis的线程模型是什么?为什么单线程的redis比多线程的memcached效率要高得多(为什么redis是单线程的但是还可以支撑高并发)?

    1.redis和memcached有什么区别? 这个事儿吧,你可以比较出N多个区别来,但是我还是采取redis作者给出的几个比较吧 1)Redis支持服务器端的数据操作:Redis相比Memcache ...

  9. Redis篇之操作、lettuce客户端、Spring集成以及Spring Boot配置

    Redis篇之操作.lettuce客户端.Spring集成以及Spring Boot配置 目录 一.Redis简介 1.1 数据结构的操作 1.2 重要概念分析 二.Redis客户端 2.1 简介 2 ...

随机推荐

  1. ng2收获

    1.devDependencies下只有在开发应用时才用得到这个我是知道的. 但是我不知道的事要想达到这个效果是要在生产环境安装包的时候必须要加个这个才行"--production" ...

  2. PHP数组合并 array_merge 与 + 的差异

    在PHP数组合并出过几次问题都没记住,写下来加强一点记忆 PHP数组在合并时,使用 array_merge 与 + 的差异: 1.array_merge(array $array1 [, array  ...

  3. ue4 Worldmachine 结合使用

    最近项目需求制作一个场景的远景部分.正好可以尝试使用一下UE4的 Landscape.不过直接在 Editor 里刷地形工作量太大,刷出的地形也不真实,最关键的是 Landscape 的工具并不是那么 ...

  4. mysql行列调换方法

    行变列,列变行 财务样式模板: CREATE TABLE `grade` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `name` VARCHAR ...

  5. Springmvc mybatis

    http://www.icoolxue.com/album/show/216 07

  6. cookie session URL重写 与考试

    状态管理.Cookie.Session.URL重写 HTTP协议:无状态的连接(每次连接都是新的请求)1.隐藏字段 <input type="hidden" name=&qu ...

  7. java UDP

    UDP 与 tcp 连接的 区别 以及  两者的不同 UDp 1 面向的是无连接的网络方式 2 传输速度快 (但是容易发生丢包 ) 3 传输的数据的大小带有的限制 一般是在64k  范围内 tcp 1 ...

  8. python基础第四天(1)

    冒泡算法--算法 需求:请按照从小到大对列表 [13, 22, 6, 99, 11] 进行排序 思路:相邻两个值进行比较,将较大的值放在右侧,依次比较! 第一步 li = [13, 22, 6, 99 ...

  9. Linux cp一个文件夹时提示cp: omitting directory `test/'

    将一个文件夹test 复制到地址/opt/tmp下,提示出错: cp: omitting directory `test/' 原因: test 目录下还有目录,不能直接进行拷贝. 我们先找下cp 的命 ...

  10. Android上dip、dp、px、sp等单位说明(转)

    dip  device independent pixels(设备独立像素). 不同设备不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA.HVGA和QVGA 推荐使用这个,不依赖像素. 在 ...