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的数据不重复。
原文链接:http://www.cnblogs.com/goodspeed/archive/2011/07/26/servicestack_redis_optimize.html
【编辑推荐】
相关文章
- 从本体论开始说起——运营商关系图谱的构建及应用
- 如何成为一名数据科学家?
- 从未见过的堂兄杀了人,你的DNA是关键证据
- 20个安全可靠的免费数据源,各领域数据任你挑
- 20个安全可靠的免费数据源,各领域数据任你挑
- 阿里云李飞飞:All in Cloud时代,云原生数据库优势明显
- 基于Hadoop生态系统的一高性能数据存储格式CarbonData(性能篇)
- 大数据告诉你:10年漫威,到底有多少角色
- TigerGraph:实时图数据库助力金融风控升级
- Splunk利用Splunk Connected Experiences和Splunk Business Flow 扩大数据访问
- 大数据开发常见的9种数据分析手段
- 以免在景区看人,我爬了5W条全国景点门票数据...
- 【实战解析】基于HBase的大数据存储在京东的应用场景
- 数据科学家告诉你哪些计算机科学书籍是你应该看的
- Kafka作为大数据的核心技术,你了解多少?
- Spring Boot 整合 Redis 实现缓存操作
- 大数据学习必须掌握的五大核心技术有哪些?
- 基于Antlr在Apache Flink中实现监控规则DSL化的探索实践
- 甲骨文再次被Gartner评为分析型数据管理解决方案魔力象限领导者
- 爬取吴亦凡微博102118条转发数据,扒一扒流量的真假