前言
2008年,意大利的一家创业公司Merzia推出了一款基于MySQL的网站实时统计系统LLOOGG,然而没过多久该公司的创始人 Salvatore Sanfilippo便对MySQL的性能感到失望,于是他决定亲自为LLOOGG量身定做一个数据库,并于2009年开发完成,这个数据库就是Redis。不过Salvatore Sanfilippo并不满足只将Redis用于LLOOGG这一款产品,而是希望更多的人使用它,于是在同一年Salvatore Sanfilippo将Redis开源发布,并开始和Redis的另一名主要的代码贡献者Pieter Noordhuis一起继续着Redis的开发,直到今天。
SalvatoreSanfilippo自己也没有想到,短短的几年时间,Redis就拥有了庞大的用户群体。Hacker News在2012年发布了一份数据库的使用情况调查,结果显示有近12%的公司在使用Redis。国内如新浪微博、街旁网、知乎网,国外如GitHub、Stack Overflow、Flickr等都是Redis的用户。
什么是NoSQL?
为了解决高并发、高可扩展、高可用、大数据存储问题而产生的数据库解决方案,就是NoSql数据库。NoSQL,泛指非关系型的数据库,NoSQL即Not-Only SQL,它可以作为关系型数据库的良好补充。但是它不能替代关系型数据库,而且它是存储在内存中,所以它的访问速度很快。
NoSQL数据库分类大致能分为以下几种:
- 键值(Key-Value)存储数据库(如 Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB),一般用于内容缓存,主要用于处理大量数据的高访问负载
- 列存储数据库(Cassandra, HBase, Riak),一般用于分布式的文件系统
- 文档型数据库(CouchDB、MongoDB),一般用于Web应用(与Key-Value类似,Value是结构化的)
- 图形(Graph)数据库(Neo4J、InfoGrid、Infinite Graph),主要作用于社交网络
Redis的应用场景
- 缓存(数据查询、短连接、新闻内容、商品内容等等)。(最多使用)
- 分布式集群架构中的session分离。
- 聊天室的在线好友列表。
- 任务队列。(秒杀、抢购、12306等等)
- 应用排行榜。
- 网站访问统计。
- 数据过期处理(可以精确到毫秒)
- 与websocket搭配使用
redis的特性
- redis数据访问速度快(数据在内存中)
- redis有数据持久化机制(持久化机制有两种:1、定期将内存数据dump到磁盘;2、aof(append only file)持久化机制——用记日志的方式记录每一条数据更新操作,一旦出现灾难事件,可以通过日志重放来恢复整个数据库)
- redis支持集群模式(容量可以线性扩展)
- redis相比其他缓存工具(ehcach/memcached),有一个鲜明的优势:支持丰富的数据结构
redis的几种数据结构简介
| 结构类型 | 结构存储的值 | 结构存储的值 |
|---|---|---|
| String | 可以是字符串、整数或者浮点数 | 对整个字符串或者字符串的其中一部分执行操作,对整数和浮点数执行自增(increment)自减(decrement)操作 |
| LIST | 一个链表,链表上的每个节点都包含了一个字符串 | 从链表的两端推入或者弹出元素;根据偏移量对链表进行修剪(trim);读取单个或者多个元素;根据值查找或者移除元素 |
| SET | 一包含字符串的无序收集器(unorderedcollection),并且被包含的每个字符串都是独一无二、各不相同的 | 添加、获取、移除单个元素;检查一个元素是否存在于集合中;计算交集、并集、差集;从集合里面随机获取元素 |
| HASH | 包含键值对的无序散列表 | 添加、获取、移除单个键值对;获取所有键值对 |
| ZSET(有序集合) | 字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分值的大小决定 | 添加、获取、删除单个元素;根据分值范围(range)或者成员来获取元素 |