Redis 2.6就快要发布了,预计下周应该会发布第一个RC版本。2.6 版本的最大亮点莫过于对lua脚本的支持,这一灵活性的加入,让Redis的角色又会进行一些转变,相信又会催生出很多新的用法。下面就是一个有意思的脚本,它的目的是使用Redis的lua功能进行fibonacci数列的计算。
简单介绍一下fibonacci数列,fibonacci数列是以其发现者,法国数学家Leonardo Fibonacci命名,它的规则是数列中的某个数总等于其前面两个数之和,如下:
1, 1, 2, 3, 5, 8, 13, 21, 34 ….
关于fibonacci的神奇之处就不多说了,看官们有兴趣wiki之就行了。
对于这个数列,问题经常是求其从1开始的第N项是多大。最简单的算法莫过于从头开始加,经过N次运算后就能得出来。在程序实现上可以用递规。而另一种优化的方法是将计算结果存起来,这样尽可能的利用已计算的数据来减少运行步骤。
好了,介绍就到这里,下面我们来看看Redis结合lua脚本的实现,可以说是计算加缓存的一个完美结合。
require ‘redis’ r = Redis.new LuaScript = <<EOF function fib(n) if n < 2 then return n end local a = redis.call(‘hget’,KEYS[1],n-1) or fib(n-1) local b = redis.call(‘hget’,KEYS[1],n-2) or fib(n-2) local ret = a + b redis.call(‘hset’,KEYS[1],n,ret) return ret end return fib(tonumber(ARGV[1])) EOF puts r.eval(LuaScript,1,:fibcache,ARGV[0]) |
上面在调用这个函数的时候,在没有数据的时候通过递规调用来获取相应的值。如果N-1或N-2已缓存,就直接取缓存,不用计算。然后计算完成后再把N对应的数值进行缓存。这样就把计算和存储完美的结合起来了。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
作者
相关推荐
-
NoSQL性能管理仍不完备 你该如何应对?
NoSQL技术现在仍然处于相对初级的阶段,众多NoSQL软件类型和产品服务令人眼花缭乱,选择合适的性能管理方案也成为一件颇具挑战性的事。
-
NoSQL——未来数据库家族的一员
NoSQL是对数据库由内而外的全方位改造,从而创造出一个高容量、高速度和高可变性的架构。然而,NoSQL供应商在可变性部分却正在遭遇失败。
-
GPU技术仅局限于游戏领域?当心大数据应用的小船说翻就翻
GPU技术的使用是一些机器学习应用的前沿和核心。Facebook,百度、亚马逊和其他一些公司正在使用的GPU集群来研究深层神经网络相关的机器学习应用程序。
-
【NoSQL数据库四大类型解析】如何选择列族数据库和图形数据库?
NoSQL数据库有多少类型?如何选择合适的NoSQL数据库?我们将介绍选择列族数据库和图型数据库必须考虑的因素。