ServiceStack.Redis的问题与修正

Redis是开源、高性能的Key-value存储引擎。

最近我们在一个日访问量约1kw的网站上使用redis替换以前的memcache,成功将CPU从30%下降到15%,效果相当显著。

ServiceStackRedis是最受欢迎的C#驱动之一。关于如何使用ServiceStackRedis请参见这里——使用ServiceStackRedis链接Redis简介

不过我们在使用ServiceStackRedis的线程池(PooledRedisClientManager)还是碰到了不少问题。

 1 链接数异常。

 一个webserver会占用80个链接。当15台webserver就过千了,这时会出现有些客户端链接不上的情况。

 解决方案:

 GetInActiveWriteClient方法中

//找下一个目标//从当前读写指针的后面开始查找,而不是从0开始var nextIndex = (WritePoolIndex + i) % writeClients.Length;更改为var nextIndex = i;同时修改DisposeClient方法中将readClient.Active == false将DisposeConnection一下。线程就能很好的回收了。

效果:在我们这样一个网站下,单台webserver大约会占用10个~15个链接,比之前的80个少了不少。

分析:

从代码上来看,作者的初衷是为了更快的找到空闲的线程,但是却认所有线程都不间断的使用,没有一个线程可能空闲。如果站点较小,webserver不太多,不改问题也不大。不过我认为用长链接并不划算,因为与redis建立一个链接还是相对比较“便宜”的。

2 多台redis存储相同的内容。

相同的内容会冗余在所有redis中

解决方案

在GetInActiveWriteClient中加入int型参数来标识出使用那台redis

var start = 0;var step = 1;if (index > -1 && index < ReadWriteHosts.Count){  start = index;  step = ReadWriteHosts.Count;}//遍历读写池//这个时候池是锁定的for (var i = start; i < writeClients.Length; i += step){  省略

这样线程池中就会按ReadWriteHosts的个数来顺序分配。

效果:

在进行读写时只需要使用key.GetHashCode方法获得一个hash值就能准确分配到其中一台redis上。保证所有的redis的数据不重复

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c#
, 存储
, 线程
, 解决方案
, redis
链接
servicestack.redis、stackservice.redis、service stack redis、c servicestack.redis、stackexchange.redis,以便于您获取更多的相关知识。

时间: 2024-09-20 12:34:16

ServiceStack.Redis的问题与修正的相关文章

ServiceStack.Redis——Redis在.net上的客户端解决方案

ServiceStack.Redis--Redis在.net上的客户端解决方案   源码及使用: https://github.com/ServiceStack/ServiceStack.Redis   例子: https://github.com/ServiceStack/ServiceStack.Examples/tree/master/src/RedisStackOverflow   上面的例子中container.Register<IRedisClientsManager>(c =&g

Redis的问题,有点疑惑

问题描述 Redis的问题,有点疑惑 各位大侠,我最近想搞一下Redis,有几个问题一直很费解,就是为何要每个实例下db0,db1...等等这些数据库,而我用客户端连接时候,只是使用了db0,那么我的数据如果特别大的话,是一直都存储在db0中还是 到了一定的程度redis自动保存到其他库中呢?第二个问题:如果我使用redis 分库存储,我想把业务1存储在db1中...等等这样,怎样动态的切换存储数据库?第三个问题:多个实例与多个库的 具体使用场景?大家根据自己实际使用的经验给下指导,谢谢. 备注

ASP.NET使用Redis共享缓存示例

第一步:下载程序   在https://github.com/MSOpenTech/redis/releases下载安装服务器端.   基本上就是下一步.下一步的,注意:安装过程会询问是否添加环境变量,是否添加防火墙例外规则,这两个都勾上. 第二步:安装服务   1.运行Win+R,输入cmd,调出命令行工具:   2.输入:cd C:\Program Files\Redis 切换工作目录到Redis安装目录:   3.输入:redis-server.exe --service-install

[置顶]C#中使用Redis不同数据结构的内存占有量的疑问和对比测试

    最近在大量使用Redis来进行数据统计前的清洗和整理,每天的数据量超5千万+,在开发过程中,数据量小,着重注意业务规则的处理,在上线基本测试后发现了大量的问题,其中之一就是Redis存储数据过多,内存的使用量大大增加.进过简单分析,对存储非常频繁的实体类进行了改进,字段名字进行缩写处理,一下子就减少了很多内存使用量.在对Redis的研究过程中,发现了以下这篇文章:Redis上踩过的一些坑-美团 ,发现其中 有一节内容:"四.redis内存使用优化 ",对Redis不同的存储结构

CYQ.Data V5 分布式缓存Redis应用开发及实现算法原理介绍

前言: 自从CYQ.Data框架出了数据库读写分离.分布式缓存MemCache.自动缓存等大功能之后,就进入了频繁的细节打磨优化阶段. 从以下的更新列表就可以看出来了,3个月更新了100条次功能: + View Code 其实更多的时间,是放在ASP.NET Aries 业务开发框架上,上里下外全部重构了一遍. 前几天,决定把Redis集成进来,一鼓作气,解决了. 下面分享一下经历: 最初的想法: 一开始我是拒绝的,不愿动态调用第三方的客户端(关联依赖的dll太多). 最近打算支持Redis,有

分布式中使用Redis实现Session共享(转)

上一篇介绍了如何使用nginx+iis部署一个简单的分布式系统,文章结尾留下了几个问题,其中一个是"如何解决多站点下Session共享".这篇文章将会介绍如何使用Redis,下一篇在此基础上实现Session. 这里特别说明一下,其实没有必要使用Redis来解决Session共享.Asp.net提供了StateServer模式来共享Session,这里重复造轮子的目的1:熟悉Redis的基本知识和使用 2.学习和巩固Session的实现原理. 3.学习Redis应用场景 阅读目录 Re

Redis简介以及数据类型存储

        由于我们在大型互联网项目当中,用户访问量比较大,比较多,会产生并发问题,对于此,我们该如何解决呢,Redis横空出世,首先,我们来简单的认识一下Redis,详细介绍如下所示:          Redis是一个开源的,使用C语言编写,面向"键/值"对类型数据的分布式NoSQL数据库系统,特点是高性能,持久存储,适应高并发的应用场景.Redis纯粹为应用而产生,她是一个高性能的Key-Value数据库,并且操作了多种语言的API性能测试将诶过表示SET操作每秒钟可达110

详解StackExchange.Redis通用封装类分享_C#教程

前两天朋友问我,有没有使用过StackExchange.Redis,问我要个封装类,由于之前都是使用ServiceStack.Redis,由于ServiceStack.Redis v4版本后是收费版的,所以现在也很有公司都在使用StackExchange.Redis而抛弃ServiceStack.Redis了.其实个人觉得,两个驱动都不错,只是由于ServiceStack.Redis收费导致目前很多公司都是基于V3版本的使用,也有人说V3版本有很多Bug,没有维护和升级,不过至少目前我是没发现B

C#客户端Redis服务器的分布式缓存

介绍 在这篇文章中,我想介绍我知道的一种最紧凑的安装和配置Redis服务器的方式.另外,我想简短地概述一下在.NET / C#客户端下Redis hash(哈希类型)和list(链表)的使用. 在这篇文章主要讲到: 安装Redis服务器(附完整的应用程序文件设置) Redis服务器保护(配置身份验证) 配置服务器复制 从C#应用程序访问缓存 使用Redis ASP.NET会话状态 Redis 集合(Set).列表(List)和事务处理用法示例 说明附加的源(Redis Funq LoC MVC项