概念
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
获取
Redis文档资料非常丰富,无论是中文还是英文都有大量的网站提供了丰富的信息。建议获取正规资料请查阅官网:点击跳转Redis官网
Redis官方并没有提供Windows下的发行版,如果你想在Windows使用,可以使用Windows团队开发的Redis,可以在Windows下使用:点击查看
使用场景
String
String 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字,或者包含某种特定的数据格式,如可序列化对象,Java对象,Json,xml等。
除了可对字符串进行get/set操作,还可以追加字符串,获取字符串长度,设置过期时间,如果是数字还可以执行自增/自减操作。
典型场景如:首页统计数据,用户对象,系统配置元数据,点赞数,浏览数,粉丝数。
Hash
hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。每个 hash 可以存储键值对40多亿。
redis提供了丰富的命令可对hash数据进行增删改查,批量添加获取。
典型场景如:hash数据结构特别适合保存一组相关类的数据,如一个对象信息,一组特定的业务数据,比如我们可能有多个第三方服务商,如短信,这个时候我们缓存阿里云的短信配置信息和腾讯的短信配置信息。
List
List 类型是一个链表结构的集合,其主要功能有push、pop、获取元素等。更详细的说,List类型是一个双端链表 的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除 元素,list的设计非常简单精巧,即可以做为栈,又可以作为队列。
使用list数据结构我们可以轻松构建出以下数据结构类型
- 后进先出(LIFO) lpush + lpop = Stack(栈)
- 先进先出(FIFO) lpush + rpop = Queue(队列)
- lpush + brpop = Message Queue(消息队列,阻塞弹出)
应用场景:秒杀抢单,生产者/消费者模式
Set
set是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。
应用场景:存储手机号,粉丝关注的集合数据,主要是存储某个相关的业务数据且无序不重复的。
Sorted Set
sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的并且不重复的集合列表,那么可以选择sorted set数据结构
应用场景: 学生对象排序,设置分数插入到集合里,可以实现自动根据分数排序。
选择优势
- 性能极高 具体测试结果请查看官方文档 点我查看
- 丰富的数据类型 – Redis支持二进制案例的 String, List, Hash Set 及 Ordered Sets
数据类型操作。 - 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
Memcached比较
1. 网络IO模型
redis:使用单线程的IO复用模型,自己封装了一个简单的AeEvent事件处理框架,主要实现了epoll, kqueue和select,对于单存只有IO操作来说,单线程可以将速度优势发挥到最大,但是redis也提供了一些简单的计算功能,比如排序、聚合等,对于这些操作,单线程模型施加会严重影响整体吞吐量
memcached:使用多核多线程处理任务,非阻塞IO复用的网络模型,分为监听主线程和worker子线程,监听线程监听网络连接,接受请求后,将连接描述字pipe传递给worker线程,进行读写IO,网络层使用libevent封装的事件库,多线程模型可以发挥多核作用,但是引入了cache coherency和锁的问题,memcached所有操作都要对这个全局变量加锁,带来了性能损耗。
2. 持久化
redis:RDB存储,支持延时快照,全量备份,每隔N分钟或N次写操作后, 从内存dump数据形成rdb文件,压缩放在备份目录;AOF存储,记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据。
memcached:不支持
3. 数据类型
redis:数据类型丰富包括:String、Hash、List、Set和Sorted Set。Redis内部使用一个redisObject对象来表示所有的key和value。总而言之,redis拥有更多的数据结构和并支持更丰富的数据操作。
memcached:数据类型单一,仅支持简单的key-value结构的数据。如果想修改数据类型,在memcached里,你需要将数据拿到客户端来进行类似的修改再set回去。这大大增加了网络IO的次数和数据体积
4. 内存使用
redis:如果redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于memcached,当内存饱满时,会持久化到硬盘。
memcached:使用简单的key-value存储的话,memcached的内存利用率更高,当内存饱满时,会丢弃数据。
5. 性能对比
redis:由于redis只使用单核,而memcached可以使用多核,所以平均每一个核上redis在存储小数据时比memcached性能更高
memcached:在100k以上的数据中,memcached性能要高于redis,虽然redis最近也在存储大数据的性能上进行优化,但是比起memcached,还是稍有逊色。