Redis 初谈

简介

  • 高可用缓存数据库
  • 丰富的数据类型结构
  • 支持各种主流语言
  • 入门学习成本低
  • 开源

数据类型

  • String
  • Hash
  • List
  • Set
  • HLL
  • ……

Redis基础入门

请访问redis官网 或者 redis中文官网自行学习了解。

注意事项

操作类问题

  1. 应该避免 keys “*” 之类的耗时操作

这个问题可以这样理解,把redis服务看成ATM机,如果一个客户业务特别多,其他客户只能耐心的等待。

是的,redis是单进程服务,有效的避免了数据存储、操作过程中锁开销。在小数据操作处理上,已验证性能高于同类产品memcache。

作者之所以采用单进程的主要原因:作者认为cpu资源不算瓶颈,真正的瓶颈是网络和磁盘I/O,所以在操作过程中需要根据redis的这个特性选择合适的操作。

解决方案:完全可以使用scan 命令替换。

内存类问题

  1. 内存若不富裕,该如何选择数据存储方式

    理论上能采用Hash结构的尽量采用Hash结构存储,并结合预估的数据大小跟配置文件中设置,可以有效的节约内存开销。(原因不提供,可自行思考答案)

  2. redis的内存配置

    默认情况redis的内存如果不设置,会把系统内存耗尽,直到系统down机,所以合理设置redis节点内存大小很重要,需要根据系统实际内存给出合理值。

  3. 内存不够怎么办?

    该问题由上个问题引申,当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节点间的数据操作,往往最影响效率的因素是网络因素。所以在明显发现性能瓶颈的时候,建议做如下修改:

  1. 将原来的大批量操作修改为pipeline的方式;
  2. 将原来一次只操作一条数据的语句,采用一次操作多条。
    这个在跨机房通信时经常会用到。

参考

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值