简介
- 高可用缓存数据库
- 丰富的数据类型结构
- 支持各种主流语言
- 入门学习成本低
- 开源
数据类型
- String
- Hash
- List
- Set
- HLL
- ……
Redis基础入门
请访问redis官网 或者 redis中文官网自行学习了解。
注意事项
操作类问题
- 应该避免 keys “*” 之类的耗时操作
这个问题可以这样理解,把redis服务看成ATM机,如果一个客户业务特别多,其他客户只能耐心的等待。
是的,redis是单进程服务,有效的避免了数据存储、操作过程中锁开销。在小数据操作处理上,已验证性能高于同类产品memcache。
作者之所以采用单进程的主要原因:作者认为cpu资源不算瓶颈,真正的瓶颈是网络和磁盘I/O,所以在操作过程中需要根据redis的这个特性选择合适的操作。
解决方案:完全可以使用scan 命令替换。
内存类问题
内存若不富裕,该如何选择数据存储方式
理论上能采用Hash结构的尽量采用Hash结构存储,并结合预估的数据大小跟配置文件中设置,可以有效的节约内存开销。(原因不提供,可自行思考答案)
redis的内存配置
默认情况redis的内存如果不设置,会把系统内存耗尽,直到系统down机,所以合理设置redis节点内存大小很重要,需要根据系统实际内存给出合理值。
内存不够怎么办?
该问题由上个问题引申,当redis使用内存达到配置设置的上限时,客户端会获取错误信息。当内存达到上限时,会出发redis的gc过程,删除过期以及即将过期的数据。
解决方案:- 所有数据设置过期时间;
- 可以开启LRU (least recently used)的配置,当内存达到上限的时候,会将不经常使用的数据清除。
持久化问题
选用何种持久化方式
采用rdb持久化方式,需要在配置文件设置save配置项,save方式分两种,一种为bloking,一种为Non-bloking。
采用aof,会将用户的所有操作记录下来。但是依然有数据丢失风险。而且这样会导致aof文件很大,同样也会影响redis的性能。目前见过的运用中,使用主从,在从上做aof持久化操作。
延展性问题
待续
一些特殊需求
人工实现LRU算法
自己实现zset,value为操作key,score为操作key的最后更新时间。当内存空间不足的时候,用户可以自行将长时间未更新的数据进行清除。
使用lua操作
Multi和Exec命令是用来保证一系列操作的连续性。这种操作虽然保证一次操作的连续性,但是并不能实现get & set操作;
这时候需要借助lua脚本的功能,在redis节点上,执行lua脚本算作一次原子操作;
这里存在一些约束,比如lua脚本中尽量不要使用循环,lua脚本中的操作尽量简单。
提升服务性能
客户端与redis节点间的数据操作,往往最影响效率的因素是网络因素。所以在明显发现性能瓶颈的时候,建议做如下修改:
- 将原来的大批量操作修改为pipeline的方式;
- 将原来一次只操作一条数据的语句,采用一次操作多条。
这个在跨机房通信时经常会用到。
参考
http://www.infoq.com/cn/articles/tq-why-choose-redis
http://www.infoq.com/cn/articles/tq-redis-copy-build-scalable-cluster
http://www.infoq.com/cn/articles/tq-redis-memory-usage-optimization-storage/#anch104989