高性能伪事务之Lua in Redis】的更多相关文章

EVAL简介 Redis2.6加入了对Lua脚本的支持.Lua脚本可以被用来扩展Redis的功能,并提供更好的性能. 在<Redis拾遗>中曾经引用了<Redis in Action>中的一套悲观锁的实现,使用Lua脚本实现同样的功能,性能提高1倍以上.在另一个自动补全的例子中,使用Lua脚本比WATH/MULTI/EXEC快了20倍. EVAL 和 EVALSHA 命令是从 Redis 2.6.0 版本开始的,使用内置的 Lua 解释器,可以对 Lua 脚本进行求值. EVAL的…
现在多数秒杀,抽奖,抢红包等大并发高流量的功能一般都是基于 redis 实现,然而在选择 redis 的时候,我们也要了解 redis 如何保证服务正确运行的原理 前言 redis 如何实现高性能和高并发 reids 事务的 ACID 原理 WATCH.EXEC 命令实现 redis 事务 lua 实现 redis事务 抢红包方案 关注公众号,一起交流,微信搜一搜: 潜行前行 redis 如何实现高性能和高并发 redis 是一个内存数据库,读写非常高效.除了开启 AOF,RDB 异步线程去持久…
参考文档:redis持久化:http://blog.csdn.net/freebird_lb/article/details/7778981 https://blog.csdn.net/jy692405180/article/details/72026745redis数据结构&底层存储https://www.cnblogs.com/hjwublog/p/5639990.html redis事务 https://www.cnblogs.com/kyrin/p/5967620.html redis与…
使用Nginx Lua实现redis高性能http接口 时间 -- :: 峰云就她了 原文 http://xiaorui.cc/2015/01/27/使用nginx-lua实现redis高性能http接口/ 主题 Lua Nginx HTTP 某些时候用python实现的接口性能不够强劲,需要换种方法来提高性能,这不就用lua试试. 常见的redis lua的组合功能 有接口防止过度访问,动态的数据加载,接口的数据缓存 redis没有直接提供一个http的接口, 性能的比较的话,lua的能力要比…
3.Pipeline 3.1 Pipeline概念 Redis客户端执行一条命令分为如下四个过程: (1)发送命令 (2)命令排队 (3)命令执行 (4)返回结果 其中(1)和(4)称为Round Trip Time(RTT,往返时间). Redis提供了批量操作命令( 例如mget.mset等) ,可以有效地节约RTT.但大部分命令是不支持批量操作的,例如要执行n次hgetall命令,并没有mhgetall命令存在,需要消耗n次RTT.Redis的客户端和服务端可能部署在不同的机器上.例如客户…
1. Pipeline 1.1 Pipeline概念 Redis客户端执行一条命令分别为如下4个过程: 1) 发送命令 2) 命令排队 3) 命令执行 4) 返回结果 其中1)+4)称为Round Trip Time(RTT,往返时间). Redis提供了批量操作命令(例如mget.mset等),有效地节约RTT.但大部分命令是不支持批量操作的,例如要执行n 次 hgetall命令,并没有mhgetall命令存在,需要消耗n次RTT.Redis的客户端和服务端可能部署在不同的机器上.例如客户端在…
Lua 与 Redis 标签: Java与NoSQL 从 2.6版本 起, Redis 开始支持 Lua 脚本 让开发者自己扩展 Redis - 案例-实现访问频率限制: 实现访问者 $ip 在一定的时间 $time 内只能访问 $limit 次. 非脚本实现 private boolean accessLimit(String ip, int limit, int time, Jedis jedis) { boolean result = true; String key = "rate.li…
看过 高性能网站架构之缓存篇--Redis安装配置和高性能网站架构之缓存篇--Redis使用配置端口转发 这两篇文章的,相信你已经对redis有一定的了解,并能够安装上,进行简单的使用了,但是在咱们的实际应用中,使用redis肯定不会使用单机版,不光是redis不能使用单机版,其他的也不会使用,所以今天我们来说一下redis cluster的安装. 1.  Redis Cluster的架构图.            (1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议…
* { color: #3e3e3e } body { font-family: "Helvetica Neue", Helvetica, "Hiragino Sans GB", "Microsoft YaHei", Arial, sans-serif; font-size: 15px } p { line-height: 25.6px; text-align: justify; margin: 23.7px 0 } blockquote { b…
一.引言 Redis学了一段时间了,基本的东西都没问题了.从今天开始讲写一些redis和lua脚本的相关的东西,lua这个脚本是一个好东西,可以运行在任何平台上,也可以嵌入到大多数语言当中,来扩展其功能.lua脚本是用C语言写的,体积很小,运行速度很快,并且每次的执行都是作为一个原子事务来执行的,我们可以在其中做很多的事情.由于篇幅很多,一次无法概述全部,这个系列可能要通过多篇文章的形式来写,好了,今天我们进入正题吧. 二.Lua简介            Lua 是一个小巧的脚本语言.是巴西里…
add by zhj : Lua与Multi/EXEC的功能比较像,在执行过程中,redis不会执行其它命令,这就不会有并发访问的问题, 这是非常好的.但Multi/EXEC要求所有命令都是独立的,后面的命令无法知道前面的命令是否执行成功,因为redis中并没有if等语句, 使用Lua可以解决这个问题,简单的说,Lua脚本就是一个函数,你可以判断每一步的执行结果.当然, 无论是Multi/EXEC还是Lua虽然在执行过程中,都没有自动回滚的功能,这点达不到关系数据库的事务原子性. 翻译:http…
转自:http://www.oschina.net/translate/intro-to-lua-for-redis-programmers 可能你已经听说过Redis 中嵌入了脚本语言,但是你还没有亲自去尝试吧?  这个入门教程会让你学会在你的Redis 服务器上使用强大的lua语言. Hello, Lua! 我们的第一个Redis Lua 脚本仅仅返回一个字符串,而不会去与redis 以任何有意义的方式交互. local msg = "Hello, world!" return m…
Redis在2.6推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行.使用脚本的好处如下: 1.减少网络开销:本来5次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放在redis服务器上完成.使用脚本,减少了网络往返时延. 2.原子操作:Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入. 3.复用:客户端发送的脚本会永久存储在Redis中,意味着其他客户端可以复用这一脚本而不需要使用代码完成同样的逻辑. 使用方式: redis-cli --eval dem…
可能你已经听说过Redis 中嵌入了脚本语言,但是你还没有亲自去尝试吧?  这个入门教程会让你学会在你的Redis 服务器上使用强大的lua语言. Hello, Lua! 我们的第一个Redis Lua 脚本仅仅返回一个字符串,而不会去与redis 以任何有意义的方式交互. 1 local msg = "Hello, world!" view source print? 1 local link_id = redis.call("INCR", KEY[1]) 2 r…
一.lua中redis的配置依赖: 1.OpenResty的lua访问redis的插件:https://github.com/openresty/lua-resty-redis 二.下载后,导入对应的插件: lua_package_path "/opt/openresty/lualib/kafka/?.lua;;"; lua_need_request_body on; 三.lua代码 2.使用lua访问redis: server {        location /test {   …
Nginx结合Lua脚本,直接绕过Tomcat应用服务器,连接MySQL/Redis直接获取数据,再结合Lua中Template组件,直接写入动态数据,渲染成页面,响应前端,一次请求响应过程结束.最终达到下图的一个效果. OpenResty组件 OpenResty的自带组件库默认已经集成了相当实用的组件,http://openresty.org/cn/components.html,如下所示: LuaCjsonLibrary LuaRestyMemcachedLibrary LuaRestyMy…
参考文章 : https://blog.csdn.net/fangjian1204/article/details/50585080…
1.redis事物参考:https://baijiahao.baidu.com/s?id=1613631210471699441&wfr=spider&for=pc (php操作redis命令官方大全:https://github.com/phpredis/phpredis) 2.总结:redis事物不支持悲观锁,支持乐观锁,要实现悲观锁,看业务,同时也有下面一种方法,循环 [watch > multi > doRedisCommand > exec] 3.详解: PHP…
标签: 高性能架构集群缓存redis 上一篇文章,我们搭建了Redis-cluster集群,这篇博客跟大家讲一下如何在一个运行的集群上增加节点或者删除节点. Redis集群添加节点 首先我们要新建立一个节点,将redis01 复制一份改为redis07,然后修改端口号也改为7007 ,然后我们执行[root@localhost redis07]# ./redis-server redis.conf 启动以后,然后进行查看,发现有一个端口号为7007的redis实例已经启动了!我们怎么把这个red…
最近公司网站改版,程序和数据库全部用新版,旧版的数据要导入,旧网站的30万条数据url要全部重定向到新版网站,正好前段时间在学习nginx+lua+mysql+memcache(redis),找资料真费劲,记录下来,以备查询 对于开发来说需要有好的生态开发库来辅助我们快速开发,而Lua中也有大多数我们需要的第三方开发库如Redis.Memcached.Mysql.Http客户端.JSON.模板引擎等. 一些常见的Lua库可以在github上搜索,https://github.com/search…
转载至笑松小站http://blog.seoui.com/2018/01/27/redis-lua/ redis从2.6版本开始内置支持Lua解释器,解释器提供了3个函数来处理redis的命令redis.call() redis.pcall()和 redis.log,同时redis 也保证脚本会以原子性的方式执行.这是一个很重要的因素. 本文涉及到的命令有 EVAL EVALSHA SCRIPT LOAD SCRIPT FLUSH SCRIPT EXISTS SCRIPT KILL redis.…
连接redis集群需要用到llua-resty-redis-cluster模块 github地址:https://github.com/cuiweixie/lua-resty-redis-cluster 下载完成后,只需要用到包中2个文件rediscluster.lua和redis_slot.c .c文件无法在nginx配置文件中引入,需要编译成.so文件,编译命令:  gcc SOURCE_FILES -fPIC -shared -o TARGET 如下则是连接redis集群代码: local…
function zPop($key) { $script = <<<EOD local v = redis.call('zrange', KEYS[1], 0, 0); if v[1] ~= nil then redis.call('zremrangebyrank', KEYS[1], 0, 0); return v[1]; end; return nil; EOD; return $this->cache->eval($script, [$key], 1); } PS:…
过期策略 相关知识:redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略.redis 提供 6种数据淘汰策略: voltile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰 volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰 volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰 allke…
首先确保你编译的Lua是支持链接外部动态链接库的.因为在对Redis进行访问时是需要使用socket通信的, 而这依赖于外部的C语言写的动态连接库. 首先,这里先下载Redis的Lua客户端访问包redis-lua,下载地址: https://github.com/nrk/redis-lua 下载之后,直接解压就行,下载的zip的话,可以使用unzip 压缩包 就可以了. 因为对Redis进行访问需要使用socket进行通信,所以需要下载Socket动态连接库 http://files.luaf…
redis事务 Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证: 批量操作在发送 EXEC 命令前被放入队列缓存. 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行. 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中. 一个事务从开始到执行会经历以下三个阶段: 开始事务. 命令入队. 执行事务. 示例: //根据multi开启事务redis 127.0.0.1:6379> MULTI OK redis 127.0.0.1:6…
事务的四大特性原子性.一致性.隔离性.持久性, 事务隔离的四大隔离级别: READ UNCOMMITTED(未提交读), 在 read uncommitted级别,事务中的修改,及时没有提交,对其他事务也都是可见的.事物可以读取未提交的数据,这也被称为脏读,你想如果所有的未提交的数据事物它读取了,性能上是不是会差,所以在实际应用场景中很少应用 READ COMMITTED(提交读), 提交读是大部分数据库的默认隔离级别,mysql却不是,因为它所执行的是 一个数据至未提交事务之前 事务是看不到它…
因为单纯的随机确实会影响到竞技性,所以dota2引入的是伪随机机制,在大量的技能中,比如说混沌的混乱之箭.剑圣的剑舞.冰女的冰霜领域之类的技能,都利用了伪随机机制. 而纯随机,或者标准正态分布并不会因为之前的结果影响此次技能的效果,因为他们的每次计算是互相独立的. 所以,从魔兽争霸3继承来的PRD(Pseudo Random Distribution)机制就被引入啦,具体的实现原理是这样的,每次的运行,都使用一个不断增加的概率来进行计算,如果这个事件一直触发不成功,那么概率就不断上升,直到事件发…
local redis = require "resty.redis" local red = redis:new() red:set_timeout() -- sec -- or connect to a unix domain socket file listened -- by a redis server: -- local ok, err = red:connect("unix:/path/to/redis.sock") local ok, err = r…
Lua语言模型 与 Redis应用 标签: Java与NoSQL 从 2.6版本 起, Redis 开始支持 Lua 脚本 让开发者自己扩展 Redis. 本篇博客主要介绍了 Lua 语言不一样的设计模型(相比于Java/C/C++.JS.PHP), 以及 Redis 对 Lua 的扩展, 最后结合 Lua 与 Redis 实现了一个支持过期时间的分布式锁. 我们希望这篇博客的读者朋友可以在读完这篇文字之后, 体会到 Lua 这门语言不一样的设计哲学, 以及 更加得心应手的使用/扩展 Redis…