妈妈再也不用担心我的程序 OOM 啦 - 一个基于 Redis 的分布式内存

2015-11-11 00:01:51 +08:00
 wangleineo
Dmem ( Distributed memory )是用 python 实现的一个分布式内存的解决方案,把 Python 的基础数据类型映射到 Redis 上,通过一个“透明”的 Redis Client 实现在多个节点上存取数据。

**Github**:[https://github.com/RealHacker/dmem]( https://github.com/RealHacker/dmem)

应用场景:

- 程序对于内存需求较大,单节点无法满足时,无需更改代码逻辑即可支持分布式内存。
- 需要分布式存储多层数据结构,比如一个 list ,其中每个元素是一个 dict 。( Redis 命令只支持单层数据结构)
- 代码洁癖患者,可以使用 Python 原生操作符(`x[y], del x.y, x in y`)和方法来处理分布式对象。

废话不多说,看代码:

from dmem import *
# Configure your redis instances pool
RedisClientPool.get_pool().load_config({
"redis1": {"host":"192.168.1.1", "port": 6379, "db":0},
"redis2": {"host":"192.168.1.2", "port": 6379, "db":0},
"redis3": {"host":"192.168.1.3", "port": 6379, "db":0},
})
# Create a list
mylist = RedisList([1, "abc", 3.1415])
# Now the list is alive on Redis
print mylist[1] # actually retrieved with LGET command
# output: 'abc'
print mylist[0:2] # map to LRANGE command
# output: [1, 'abc']
del mylist[0] # map to LREM command
print mylist[:]
# output: ["abc", 3.1415]
s = RedisStr("Redis string")
# Now the string lives in Redis
mylist.append(s) # APPEND command
print len(mylist) # STRLEN command
# output: 3
print mylist[-1].getvalue() # GET command
# output: 'Redis string'
mydict = RedisDict({"a":1234}) # HSET commands
# Now the dict lives in Redis as a hashmap
mydict["list"] = mylist # HGET command
print mydict.keys() # HKEYS command
# output: ['a', 'list']
for k,v in mydict.items(): # HGETALL command
print k, v
# output: a 1234
# output: list <redislist.RedisList object at 0x01CDEF30>
print mydict["list"][0]
# output: 'abc'
obj = RedisObject()
# For redis object, the attributes are stored in Redis
obj.attr1 = "abc"
obj.attr2 = mydict
print obj.attr2['list'][0]
# output: 'abc'

欢迎提建议、报 Bug 。
4128 次点击
所在节点    分享创造
24 条回复
mzer0
2015-11-13 20:34:05 +08:00
@wangleineo 有一种情形我会使用分布式内存:如果两台主机的硬盘数据是自动同步的,主机 A 可以先命令主机 B 加载文件到内存,再通过分布式内存同步到 A 的内存,达到从内存加载文件的目的,减轻硬盘 IO 负担。
Actrace
2015-11-14 00:19:59 +08:00
内存的存在意义就在于速度。
网络存取,虽然在同一个局域网里,实现了扩大容量的愿景,但是性能肯定不如真正的内存。还不如多买几块 SSD 再做个 RAID 来的实在。
楼主你还是认清事实吧,自行车再怎么快也比不上飞机的(是的,连汽车的速度都无法超越),还是要用正确的工具做正确的事情。

不过这套设计可以用在分布式的持久化存储文件系统上,还是有点意义的。
wangleineo
2015-11-14 11:19:05 +08:00
@Actrace 技术是不断发展的,网络存取的速度已经越来越接近内存了,(虽然内存的速度也在提升)。但是硬盘还差好几个数量级,看看上面的图。
lilin
2015-11-14 20:38:06 +08:00
@Actrace 在 vpn 讨论区看到你有个可靠的服务商,可以推荐给我吗?
我的邮箱:zhangnan123545@gmail.com
谢谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/235223

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX