Redis是一个Key-Value存储系统,它支持存储的value类型很多,包括string、list(链表)、set(集合)、zset(有序集合)。这些数据类型都支持push/pop、add/remove以及取交集和并集等丰富的操作。Redis支持各种不同方式的排序。
为了保证效率,数据都是还存在内存中的,它也可以周期性地把更新的数据写入磁盘或者把修改操作写入追加的记录文件。
Redis作为一种NoSQL解决方案,适用于以下场景:
1 对数据高并发读写
2 对海量数据的高效存储和访问
3 对数据的高可扩展像性和高可用性。(知识连接:“高可用性”(High Availability)通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性。)
Redis是非关系型、分布式的、开源的、水平可扩展的。不遵循关系型数据库的 SQL标准、ACID属性、表结构等。
这里温故而知新吧,所谓ACID属性指的是对事务的支持。
比如数据库里:
happyBKs 10000元
GF 1元
这时有个操作是happyBKs给GF汇款8000元的事务。
该事务包含了两个操作:
happyBKs 10000-8000
GF 1+8000
正常运行下,结果应该是:
happyBKs 2000元 T_T
GF 8001元 : )
但是,如果现在系统执行完第一个操作时发生了故障会怎么样呢?
如果数据库支持事务,即支持ACID,那么系统将回滚到最初状态:
happyBKs 10000元 : )
GF 1元 : (
如果数据库不支持事务,即不支持ACID,那么系统则会:
happyBKs 10000-8000=2000元 T_T
GF 1元 : (
(彩蛋:其实,happyBKs has no GF now,T_T. 本文时oschina用户happyBKs的博客文章,转载请说明出处。)
那么Redis适用哪些场景呢?
目前最大的Redis用户时新浪微博,有几百台物理机和更多的端口在运行着Redis。
Redis的适用场景:
1 应用程序直接访问Redis程序。(这种做法的缺点时如果Redis Server挂了,或者内存释放了,Redis的数据将永久丢失)
2 应用程序直接访问Redis,只有当Redis访问失败时才访问MySQL。(Redis集群会和MySQL集群进行同步。当Redis Server挂了之后,应用会去找MySQL)
Redis数据库提供多种灵活的数据结构和数据操作,十分灵活。
具体的适用场景或者说Redis真正适合做哪些事情:
1 取最新的N个数据的操作。例如,取最新的500篇新闻。
2 排行榜应用,取TOP N操作。
3 需要精确设定过期时间的应用。(这是MySQL无法做到的。Redis可以设置过期,如用setex方法,在我的博客该系列的后面的文章会介绍。大家清关注happyBKs的博客。)
4 计数器应用。(新浪微博大量使用)
5 Uniq操作(排重,唯一操作),获取某段时间所有的数据排重值。
6 实时系统,反垃圾系统
7 Pub/Sub构建实时消息系统。(pub是发布,sub是订阅)
8 构建队列系统。(注意:Redis的数据类型中有list,对应于栈、队列等)
9 缓存
本文出处:http://my.oschina.net/u/1156339/blog/387246
如果你还是对Redis没有一个直观的感受,那么下面我将对Redis、MySQL和MongoDB做一个比较。
Redis | MySQL | MongoDB |
有库的概念 | 有库的概念 | 有库的概念 |
无 | 有表的概念 | 无表,有集合的概念 |
无 | 字段,行的列 | 无 |
所以,NoSQL不存在表结构。