Redis的应用场景及优缺点

Redis做为一个典型的非关系型数据库,目前来讲在企业级应用中使用普遍。java

一、Memcached和Redis相比的劣势

业界经常使用MySQL+Memcached这样的存储架构,可是随着访问量的不断攀蛇,随之而来的问题也有不少。redis

一、MySQL须要不停的拆库拆表,Memcached也须要跟着不断扩容;数据库

二、Memcached与MySQL之间存在着必定的数据不一致的现象;数组

三、若是Memcached容易命中率变低,直接穿透到MySQL,致使数据库没法支撑;架构

二、Redis的特色

提及Redis,不少开发者都只知道它和Memcached同样是非关系型数据库,能够直接存储K-V形式的数据,可是相比起Memcached来讲,他也有不少不一样的地方。性能

一、Redis不只仅只支持简单的K-V形式的数据存储,还支持list、set、hash、zset等等集合类数据的存储;线程

二、Redis支持实时的数据备份,及时宕机,也能够把数据恢复过来;对象

三、Redis支持数据的持久化,能够存放在内存memory中的数据直接保存在磁盘上;排序

三、Redis经常使用的数据类型

String、Hash、Set、List、SortedSet、pub/sub、Transactions。队列

一、String:Strings就是一个最最简单的Key-Value形式存储的变量。其中Value既能够是数字也能够是字符串。其实现方式是在Redis内部默认存储一个字符串,被redisObject引用,当检测到数字操做如自增自减incr、decr等等命令时,自动转化为数字进行计算,计算完毕后再转化为String存储起来。

二、Hash:Hash存储是键值对的value。即Key-Hash,而Hash又是一个k-v的结构,若是使用的Memcached,则须要把整个Hash打包存储在内存中,若是须要查询其中某个值,还要所有取出整个Hash,再查找对应值。而Redis能够直接经过命令获取到Value,大大提升了性能。 其实现原理:当成员较少时,Redis为了节约内存会采用相似一维数组的紧凑存储,而当对象较多时,则直接转为HashMap存储。

三、Set:Set是一个无序的自然去重的集合,即Key-Set。此外还提供了交集、并集等一系列直接操做集合的方法,对于求共同好友、共同关注什么的功能实现特别方便。其底层是靠HashMap实现的,其中value为null;

四、List:List是一个有序可重复的集合,其遵循FIFO的原则,底层是依赖双向链表实现的,所以支持正向、反向双重查找。经过List,咱们能够很方面的得到相似于最新回复这类的功能实现。

五、SortedSet:相似于java中的TreeSet,是Set的可排序版。此外还支持优先级排序,维护了一个score的参数来实现。其底层主要依赖HashMap来实现的,经过维持插入的数值和Score优先级的映射来进行排序。

六、pub/sub:发布订阅,相似于消息队列mq。能够选择对某个Key进行订阅,一旦这个key发布了一些消息,则全部订阅了这个Key的对象就能够收到这个消息。主要能够用在实时消息系统上,例如聊天之类的。

七、Transactions:NoSQL不支持事务,可是经过提供了打包执行的功能,即这个包里面的全部命令必需要一块儿执行,此外还能够锁定某个Key,在打包执行命令时若是检测到这个Key发生了变化,则直接回滚。

四、Redis的经常使用应用场景

redis使用内存提供存储,经过持久化功能保存数据。且针对request是单线程操做。这一系列特色使得redis具备十分神奇的功能。

一、查找最新的回复。

若是在传统的关系型数据库,这就须要使用select * from table where name="" order by time desc limit 100;这十分消耗数据库性能,可是经过Redis,就能够直接在Redis里面经过Id建立一个List,指定长度1w,当须要查找时,直接输出该list的后100条记录。

二、排行问题

常见的排行问题,例如最热话题、游戏排名等等,这些均可以经过Redis来轻松实现,直接使用ZRank便可获得。

三、删除过时数据

Redis不是真正意义上的可持久化数据库,能够给数据加上一个有效时间,在有效时间超过期,Redis会自动删除对应数据。

相关文章
相关标签/搜索