Redis概述
1 概述
Redis 是开源、高性能的key-value数据库。
Redis很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。
Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
2 优点
- 异常快 - 每秒可执行大约110000次的设置(SET)操作,81000次的读取/获取(GET)操作
- 支持丰富的数据类型 - Redis支持开发人员常用的大多数数据类型,例如列表,集合,排序集和散列等;
- 支持事务,且操作具有原子性 - 所有Redis操作都是原子操作,这确保如果两个客户端并发访问,Redis服务器能接收更新的值;
- 多实用工具 - Redis是一个多实用工具,可用于多种用例,如:缓存,消息队列(Redis本地支持发布/订阅),应用程序中的任何短期数据,例如,web应用程序中的会话,网页命中计数等;
- 单进程单线程 - Redis采用队列技术将并发访问变成串行访问,消除了传统数据库并行控制的开销;
- 支持读写分离、主从复制
3 相对于memcached的优势
- redis支持丰富的数据类型,memcached所有的值均是简单的字符串
- redis单个value的最大限制是1GB, memcached只能保存1MB的数据
- redis自己构建了虚拟内存机制,比系统的虚拟内存块
- redis可以持久化其数据
4 Redis支持的数据类型
- Strings
- Lists
- Sets
- Sorted Set
- Hashes
5 虚拟内存
当value很大时,可以使用虚拟内存,节约内存。
当key也很大时,可以将key-value变成一个value,存在虚拟内存中。
6 数据分片
数据分片模型把每个节点当成独立的master,对业务进行分片存储。包括范围分区和哈希分区。
优点:容量大;处理能力强。
缺点:不支持涉及多个key的操作或事务;数据处理复杂。
7 管道技术
Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。这意味着通常情况下一个请求会遵循以下步骤:
客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应。
服务端处理命令,并将结果返回给客户端。
使用Redis 管道技术可以在服务端未响应时,客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响应。
优势是提高了 redis 服务的性能。
8 回收策略
- volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
- volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
- volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
- allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
- allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
- no-enviction:禁止驱逐数据
9 发布订阅
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
Redis 客户端可以订阅任意数量的频道。
下图展示了频道 channel1,以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:
当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:
10 适用场景
10.1 会话缓存(Session Cache)
用Redis缓存会话相比其他存储的优势在于:Redis提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失,大部分人都会不高兴的
10.2 全页缓存(FPC)
除基本的会话token之外,Redis还提供很简便的FPC平台。回到一致性问题,即使重启了Redis实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,能帮助你以最快速度加载你曾浏览过的页面。
10.3 队列
Reids在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消息队列平台来使用。Redis作为队列使用的操作,就类似于本地程序语言(如Python)对 list 的 push/pop 操作。
10.4 排行榜/计数器
Redis在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合(Sorted Set)也使得我们在执行这些操作的时候变的非常简单,Redis只是正好提供了这两种数据结构。
10.5 发布/订阅
发布/订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用Redis的发布/订阅功能来建立聊天系统。