在redis一致性hash(shard)中使用lua脚本的坑
redis 2.8之前的版本,为了实现支持巨量数据缓存或者持久化,一般需要通过redis sharding模式来实现redis集群,普遍大家使用的是twitter开源的Twemproxy。
twemproxy不会增加redis的性能指标数据,据业界测算,使用twemproxy相比直接使用redis会带来~10%的性能下降。 但是单个redis进程的内存管理能力有限。据测算,单个redis进程内存超过20G之后,效率会急剧下降。目前,我们给出的建议值是单个redis最好配置在8G以内。8G以上的redis缓存需求,通过twemproxy来提供支持。
twemproxy
不会增加
redis
的性能指标数据,
据业界测算,
使用
twemproxy
相比直接使用
redis
会带来
~10%
的性能下降。
但是单个
redis
进程的内存管理能力有限。
据测算,
单个
redis
进程内存超过
20G
之后,
效率
会急剧下降。目前,我们给出的建议值是单个
redis
最好配置在
8G
以内。
8G
以上的
redis
缓存需求,通过
twemproxy
来提供支持。
twemproxy的配置信息填写在nutcracker.yml之中,默认的查找位置是在conf目录下,也可以通过-c参数指定。举个栗子:
twem1:
listen:"127.0.0.1:22121"
hash:fnv1a_64
distribution:ketama
auto_eject_hosts:false
server_failure_limit:1
server_retry_timeout:60000
redis:true
servers:
-"IP1:6379:1 shard1-master"
你编译或者下载个老版本的ServiceStack.Redis组件(新版本收费了,有貌似1小时6000次的上限,https://servicestack.net/)。然后呢,你可以安心的读写redis了,看起来一切都很美好,某一天发现为了更新一个值,需要频繁的读写redis,这不科学,于是你继续发掘,发现redis支持lua脚本,很多事务性的操作可以直接交给lua脚本一次完成,分分钟改改代码,发个新版本,一些看起来又安逸了。
突然,客服投诉来啦,说某个数据值不对,查数据库,数据正确的。查redis,哎~果然不对,redis没更新(假设redis是用来做缓存的,mysql做持久化),难道删除redis key更新缓存的方法有问题?你划拉代码看看没啥问题,传递一批key让lua脚本循环删掉这些key,从而达到过期缓存的目的,代码简单,流程清晰。RedisDesktopManager直连redis删除key,ok的,调试代码,的确大概有一半的redis key删除不掉,此时你就掉到redis sharding模型下执行lua脚本的坑里了。
坑:redis sharding模型下执行lua脚本时,假设key1在shard1,lua+key1可不一定在shard1。
即,在proxy上对key1 get/set时,Twemproxy对key1哈希计算后会保证分配到固定的shard上,但通过代理调用lua脚本批量处理redis key时,哈希散列可能落在不同的shard上。
在redis一致性hash(shard)中使用lua脚本的坑的更多相关文章
- Redis中的原子操作(2)-redis中使用Lua脚本保证命令原子性
Redis 如何应对并发访问 使用 Lua 脚本 Redis 中如何使用 Lua 脚本 EVAL EVALSHA SCRIPT 命令 SCRIPT LOAD SCRIPT EXISTS SCRIPT ...
- CentOS6.4 安装OpenResty和Redis 并在Nginx中利用lua简单读取Redis数据
1.下载OpenResty和Redis OpenResty下载地址:wget http://openresty.org/download/ngx_openresty-1.4.3.6.tar.gz Re ...
- 在redis中使用lua脚本
在实际工作过程中,可以使用lua脚本来解决一些需要保证原子性的问题,而且lua脚本可以缓存在redis服务器上,势必会增加性能. 不过lua也会有很多限制,在使用的时候要注意. 在Redis中执行Lu ...
- redis中使用lua脚本
lua脚本 Lua是一个高效的轻量级脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能 使用脚本的好处 1.减少网络开销,在Lua脚 ...
- 新姿势!Redis中调用Lua脚本以实现原子性操作
背景:有一服务提供者Leader,有多个消息订阅者Workers.Leader是一个排队程序,维护了一个用户队列,当某个资源空闲下来并被分配至队列中的用户时,Leader会向订阅者推送消息(消息带有唯 ...
- 服务降级 托底预案 Nginx中使用Lua脚本检测CPU使用率,当达到阀值时开启限流,让用户排队
https://mp.weixin.qq.com/s/FZAcQQAKomGEe95kln1HCQ 在京东我们是如何做服务降级的 https://mp.weixin.qq.com/s/FZAcQQAK ...
- C++中嵌入Lua脚本环境搭建
第一步(环境准备工作): 工具: ●LuaForWindows_v5.1.4-46.exe傻瓜式安装. 作用:此工具可以在windows环境下编译运行Lua脚本程序.安装完成后会有两个图标:Lua和S ...
- 【COCOS2DX-LUA 脚本开发之一】在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!
[COCOS2DX-LUA 脚本开发之一]在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途! 分类: [Cocos2dx Lua 脚本开发 ] 2012-04-1 ...
- 怎样在Cocos2d-x中使用Lua脚本
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u013321328/article/details/25699545 笔者使用的是Cocos2d-x ...
随机推荐
- [转]MySQL中存储过程权限问题
MySQL中以用户执行存储过程的权限为EXECUTE 比如我们在名为configdb的数据库下创建了如下存储过程,存储过程的定义者为user_admin use configdb; drop proc ...
- Linux 查杀进程
ps -eaf |grep "stoporder.php" | grep -v "grep"| awk '{print $2}'|xargs kill -9 # ...
- step by step 之餐饮管理系统三
1.说明 表名的长度最长为18个字符 茶色的字段为主键或联合主键 浅黄色的字段为索引 浅灰底色的字段为临时表中比正式表多出的字段 数据库系统:Sqlserver2008 脚本工具:使用CodeGene ...
- N皇后问题(位运算实现)
本文参考Matrix67的位运算相关的博文. 顺道列出Matrix67的位运算及其使用技巧 (一) (二) (三) (四),很不错的文章,非常值得一看. 主要就其中的N皇后问题,给出C++位运算实现版 ...
- html+css知识整理
1.学网页最好的方法:学习别人的网页. 2.文档结构 <html>(超文本标记语言) <head> <title> </title> & ...
- PHP接口使用
<?php interface IEmployee { function working(); } interface IDeveloper { function Coding(); } cla ...
- C#设计模式(22)——访问者模式(Vistor Pattern)
一.引言 在上一篇博文中分享了责任链模式,责任链模式主要应用在系统中的某些功能需要多个对象参与才能完成的场景.在这篇博文中,我将为大家分享我对访问者模式的理解. 二.访问者模式介绍 2.1 访问者模式 ...
- .net 架构师/经理招聘,长期有效
岗位职责: 1.参与项目的需求分析和业务评审 2.负责项目的技术架构: 3.负责指导开发小组完成开发以及单元测试: 4.负责解决开发人员的技术问题,并对开发人员的代码进行Review. 任职要求: 1 ...
- easyui combobox 中实现 checkbox
$('#cc').combobox({ url:'combobox_data1.json', method:'get', valueField:'id', textField:'text', pane ...
- Lingo 做线性规划 - Revenue Management
Reference: <An Introduction to Management Science Quantitative Approaches to Decision Making, Rev ...