-
Notifications
You must be signed in to change notification settings - Fork 129
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
与redis的关系 #1
Comments
你理解是对的。 |
我举个很简单的例子 --这些是在redis的内存中完成 --这些是在leveldb操作的 ds_开头的命令存取的数据是通过leveldb引擎存放,其他的还是原生redis一样放在内存 |
其实redis-storage在redis基础上增加了leveldb的“客户端”功能,可以用来处理leveldb数据库,这样好理解些。 |
哈哈不是客户端功能。增加了leveldb服务端功能。因为 ldb只是个存储引擎。没有服务端。 |
性能下降的原因是什么?leveldb磁盘操作会导致阻塞,而redis只有单线程的缘故吧? 但效率和速度不可同日而语。 |
首先你了解下leveldb的写操作就知道他为什么写比读还快。 |
个人对leveldb还算比较熟悉。 即使是顺序写,写磁盘操作和内存操作的耗时也不是同一量级。leveldb内部的磁盘操作是没有挂到事件堆里的,如果是单线程,当压力大时(引擎自身的,或者是外界导致磁盘压力大时),必然会阻塞住的,从而导致整体吞吐下降。 另外,个人认为redis做主、leveldb做从的价值有限,因为整体数据量会受限于主机的总内存大小。并且主从切换会变的很麻烦。 整体的性能有benchmark数据么? |
另外有一个叫做SSDB的项目:https://code.google.com/p/zdb/ 是自己实现的服务器端。思路好像清晰一些,除了set外的redis数据类型都支持。看起来就是redis的持久化实现了。他的主从同步据说考虑到了网络差的情况,比redis优秀。 |
里面提到 http://www.udpwork.com/ 用了 zdb ? |
是呀,他说用到了生产环境。把用户库放到了zdb。 |
@aloasut: 我是SSDB项目的创建者. 根据业务开发的经验, 我发现zset数据结构的表达能力非常强大, 同时, 我们遇到了redis内存限制以及主从同步不完善的瓶颈, 所以在LevelDB上面寻找解决方案. SSDB支持zset, 不过不是完全支持, 例如zcard, 我的思路是使用者自己维护计数. 新浪微博的经验也是使用独立的计数服务维护各种集合的计数. SSDB的主从同步, 利用LevelDB来持久化更新log, log里只记录变更的key, 而没有value, 所以可以保存非常大的更新log(默认是100万条), 并根据序号(LevelDB内部序号)进行断点续传. 所以, SSDB可以容忍不稳定的网络. 对于 redis-storate, 我有个问题: ( get命令从内存中取,没取到数据,再用dsGet从leveldb里取) -- 这是发生在服务器端的行为吗? 还是说要求客户端(PHP)主动调用 ds_get 命令? |
请教ssdb是如何应用到你们会员系统的?
|
@ideawu 目前有 rl_get命令支持。(内存中取,没取到数据,再从leveldb里取)zset等redis相关命令,在 redis-storage 会持续实现。 @aloasut 我不知道你的业务场景是如何的bt,以致于性能这么吃紧。 目前我这边的设想就是用leveldb来解决 redis 数据始终必需在内存的问题。 大概思路是这样: 主库是纯内存redis ,关闭rdb,aof, 从库是 leveldb, 主库里的数据强制设置一个生命周期(比如三天),这个生命周期是动态的(最后一次读取的时间点 + 三天) 三天内这个数据都没读到,就会变成冷数据,从redis里淘汰掉,再要取的话,就从leveldb里取了。 只要数据被读取到,就变回热数据 |
@shenzhe 你这种冷热数据的设想太好了。我现在在维护一个约千万级别的用户库。是在redis保持30天用户基本信息,过期就去数据库查,数据库在并发大的时候也有点压力,现在有点想把mysql存的数据都迁移到leveldb。但是leveldb是写的性能好于读的性能,所以正在评估中。非常感谢你的解释。 |
目前我维护的是 两千万上下的用户库。 数据存在redis-storage 上。 然后加上redis 自己的缓存。用lua 封装了下 供客户端调用。 效率杠杠的。 以后打算把帖子信息 也转意到redis-storage来 |
@qiye 你说的“然后加上redis 自己的缓存”说的是redis-storage 中的redis服务,还是从官方版本的redis呢? |
@aloasut 如果主redis不做rdb/aof持久化,从redis使用leveldb进行持久化,那么从redis每次set的时候是直接写透内存写到leveldb吗?这样会有一个问题就是从redis的写性能会成为瓶颈。redis的主从备份是异步的,当主redis挂掉之后,因为主从写性能差距较大(一个有持久化,一个没有),切主会有数据不一致问题,或者说要等从redis同步完成之后才能切主,有可能导致切主长时间不能提供服务,影响可用性。 |
请问这个实现是把redis原来放在内存的数据通过leveldb放在硬盘这样子吗?然后一切操作都跟原生的redis一样?还是说只有加强版的那些命令存取的数据是通过leveldb引擎存放,其他的还是原生redis一样放在内存?
The text was updated successfully, but these errors were encountered: