目录
Redis(Remote Dirctionary Server) ,一种基于键值对(key-value)的NoSQL数据库。
Redis特性
1.速度快
Redis执行命令速度非常快,官方给出的数字是读写性能可达到10万/秒。
为什么Redis如此快?
- Redis所有的数据都是存储在内存中的
内存的速度是非常快的,这个我相大家都有所了解。
- Redis使用了单线程架构,预防了多线程可能产生的竞争
单线程避免了上下文频繁切换问题,没有多线程的竞争,性能会很好。
Redis单线程并非代表整个Redis实例是一个线程,而且指Redis负责存取这块的线程只有一个。
为什么使用单线程模型?
1、Redis的瓶颈不是cpu的运行速度,而往往是网络带宽和机器的内存大小。
2、单线程切换开销小,容易实现既然单线程容易实现。
如果CPU成为瓶颈怎么办?
使用多个Redis实例即可。
- I/O多路复用模型
IO多路复用(IO Multiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IO,Java中的Selector和Linux中的epoll都是这种模型
关于I/O多路复用模型在此不多说,后面会有文章单聊这块,一个坑。
- Redis使用了C语言
一般来说,C语言实现的程序"距离"操作系统更进一些,执行速度相对更快
- Redis源码的精打细磨
2.值支持多种数据结构
主要提供了5种数据结构:字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(zset)。
在字符串基础上演进出了位图(Bitmaps)和HyperLogLog两种神奇的数据结构。
随着LBS(Location Based Service,基于位置服务)的不断发展,Redis 3.2版本中加入有关GEO(地理信息定位)的功能。
3.功能丰富
- 提供了键过期功能,可以用来实现缓存
- 提供了发布订阅功能,可以用来实现消息系统
- 支持Lua脚本功能,可以利用Lua创造出新的Redis命令
- 提供了简单的事务功能,能在一定程度上保证事务特性
- 提供了流水线(Pipeline)功能,这样客户端能将一批命令一次性传到Redis,减少网络开销
4.简单稳定
- 简单
表现在以下三方面:1、源码少。2、单线程模型,使服务端处理模型简单,也使客户端开发简单。3、不需要依赖操作系统类库,实现了自己的事件处理功能(Memcache需要依赖libevent这样的类库)。
- 稳定
很少因为自身bug而宕机
5.客户端语言多
支持Java、PHP、Python等主流编程语言
6.持久化
数据在内存中一旦发生断电或机器故障,重要数据可能会丢失。
Redis提供两种持久化方案:RDB和AOF。
7.主从复制
Redis提供了复制功能,实现多个相同数据的Redis副本,复制功能是分布式Redis基础。
8.高可用分布式
Redis从2.8版本开始提供了高可用的Redis Sentinel,它能够保证Redis节点的故障发现和故障自动转移。
Redis从3.0版本正式提供了分布式实现Redis Cluster,它是Redis真正的分布式实现,提供了高可用、读写和容量的扩展。
其它第三方的集群我会在后续的文章中继续,先挖个坑。
Redis可以做什么
- 缓存
合理使用缓存不仅可以增加数据的访问速度,而且能够有效的降低后端数据库源的压力。
Redis提供了键值过期时间设置,并且也提供了灵活控制最大内存和内存溢出后的淘汰策略。
- 排行榜系统
Redis提供了列表和有序集合数据结构,合理使用这些数据结构可以很方便的构建各种排行榜单。
之前我做过一个排行榜单相关功能,后面会再出文章把如何实现的整理一下,先挖个坑。
- 计数器应用
计数功能,例如视频网站播放数、浏览数等,为保证实时性,每次播放和浏览加1。
Redis天然支持数据计数功能且计数性能也非常好。
- 社交网络
社交网站访问量比较大且部分功能传统关系数据库存储不太适合,例如:赞/踩,粉丝等。
Redis提供的数据结构可以相对比较容易的实现。
- 消息队列系统
消息队列具有业务解耦,非实时业务削峰等特性,可以说是一个大型网站必备功能。
Redis提供了发布订阅功能和阻塞队列的功能,与专业的消息队列相比功能还不够强大,但用于一般的消息队列功能基本可以满足。
- session共享
tomcat中就存在插件可以让session数据都存储在Redis中
Redis不可以做什么
- 数据规模
数据规模分为大规模和小规模。
虽然内存已经足够便宜,但将大规模数据放在Redis中,经济成本非常高。
- 冷热数据
数据分为冷数据和热数据。热数据是指频繁操作的数据(查询也是一种操作),反之为冷数据。
冷数据放在Redis中,基本上是对内存的一种浪费,虽然目前内存很便宜。
热数据放在Redis中加速读写,也可以减轻后端的存储负载,可以说事半功能。
用好Redis建议
- 不要当黑盒使用,开发与运维同样重要
- 阅读源码
参考
《Redis开发与运维》