Redis注意事项

1.在增加key的时候勿必设置过期时间,不然Redis Server的内存使用会达到系统物理内存的最大值,导致Redis使用VM降低系统性能。

 

2.使用Twitter Gizzard进行Redis数据库切分。

 

3.Redis Key设计时应该尽可能短,Value的值尽可能使用纯数字。一两句话很难概括RedisKeyValue的设计,具体可以参考以下文章:

a) 浅谈Redis数据库的键值设计:http://blog.nosqlfan.com/html/3033.html?ref=rediszt

b) 节约内存:InstagramRedis实践:http://blog.nosqlfan.com/html/3379.html?ref=rediszt

c) 关于Key的设计,用“:”来分隔各个单词已是不成文的规矩,如表示一个对象某个值可以选择如下的Key,对象名:[id]:字段名=值。

4.关于Redis负载以及单点故障问题,预计会在Redis 3.0的版本中全面解决。

5.Redis优化的几点思路:

i. 使用Replication机制,搭建Master-Slave模型

ii. 使用KeepAlivedHA,对外一个VIP,当Master出现故障时,能自动切换到Slave上,并将Slave提升为Master

iii. 可以在Slave上建新的Slave,实现一主多从,同时可以将读请求分配到Slave上 

iv. Master上不进行持久化dump操作,该操作放在Slave上执行

v. 仍然开启vm,将不常用的value值给交换到磁盘上(不建议开启,会严重影响Redis Server的服务性能)。

vi. 使用Lua嵌入式开发语言进行定制开发,将重要的程序逻辑放在服务器端进行开发。

vii. 使用Pipelining机制进行命令通信,减小网络延迟。

viii. 使用新版本中的可变参数进行批量命令传送以及批量结果接收。

6.Redis中,存储对象有以下几种方式:

i. 将对象转换成JSON对象(利用现成的JSON库)后存入Redis,从Redis数据库中读取数据时先读取出JSON字符串,然后再调用JSON库将JSON字符串解析为对象。

ii. 将对象转换成Google开源二进制协议对象(Google Protobuf,和JSON数据格式,但是因为是二进制表现,所以性能效率以及空间占用都比JSON要小;缺点是Protobuf的学习曲线比JSON大得多)后存入Redis数据库;在读取对象时先从Redis数据库中读取出对象的二进制数据,然后利用GoogleProtobuf程序库将二进制数据转换成对象。

iii. 使用Redis提供的Hash数据结构来存储对象,使用这种格式能很大程度上节约内存使用且速度快,缺点是需要熟悉这种格式。

7.Redis内存优化相关配置(尽可能使用Hash):

i. hash-max-zipmap-entries 64 #如果Hash中字段的数量小于参数值,Redis将对该KeyHash Value采用特殊编码。

ii. hash-max-zipmap-value 512 #如果Hash中各个字段的最大长度不超过512字节,Redis也将对该KeyHash Value采用特殊编码方式。

iii. list-max-ziplist-entries 512 list-max-ziplist-value 64 #下面两个参数的含义基本等同于上面两个和Hash相关的参数,只是作用的对象类型为List

iv. set-max-intset-entries 512 #如果set中整型元素的数量不超过512时,Redis将会采用该特殊编码。

v. 以上配置如果配置得符合系统要求则可以在很大程度上降低内存的使用率,保证Redis Server可靠运行。

vi. 倘若某个已经被编码的值再经过修改之后超过了配置信息中的最大限制,那么Redis会自动将其转换为正常编码格式,这一操作是非常快速的,但是如果反过来 操作,将一个正常编码的较大值转换为特殊编码,Redis的建议是,在正式做之前最好先简单测试一下转换效率,因为这样的转换往往是非常低效的。

vii. 注意:以上配置会导致原来的数据类型相关命令的时间复杂度由O(1)变为O(n),所以,如果相关配置值设置过大,则有可能使得Redis Server的性能降低,请小心配置以上选项。

8.关于Redis内存预先评估:http://blog.nosqlfan.com/html/3430.html

i. string类型的内存大小 键值个数 * (dictEntry大小 + redisObject大小 包含keysds大小 包含valuesds大小) + bucket个数 * 4

ii. zipmap类型的内存大小 = hashkey个数 * (dictEntry大小 + redisObject大小 包含keysds大小 + subkey的总大小) + bucket个数 * 4

9.Redis的事务处理:

i. Redis的事务处理主要用以下四个命令实现:MULTI, EXEC, WATCH, UNWATCH, DISCARD

ii. WATCH, UNWATCH主要用于实现乐观锁,即WATCHKEY的值如果发生变化,则DISCARD事务。

iii. 关于Redis事务的具体详细教程请参看:http://www.cnblogs.com/stephen-liu74/archive/2012/03/28/2357783.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值