如今大多数开发人员都会据说过 Redis。Redis 是目前市场上最好的开源内存 NoSQL 数据库之一。它为前端以及后端服务(如键值查找,队列,哈希等)提供了很是多的帮助。前端
1、什么是 Redis?数据库
根据 Redis 官方介绍,Redis 是一个开源(BSD许可),内存数据结构存储,用做数据库,缓存和消息代理,它支持字符串、哈希表、列表、集合、有序集合、位图、hyperloglogs 等数据类型。后端
2、Redis 与 Memcached缓存
Redis 是一个数据结构服务器。做为键值数据存储,Redis 相似于 Memcached,但它比 Memcached 有两个主要优势:支持更多的数据类型以及持久化。安全
持久化使得你能够将 Redis 当作合法数据库进行操做,而不是一个不稳定的临时缓存。若是从新启动,Memcached 信息将丢失; 但 Redis 数据仍然存在。服务器
Redis 支持存储多种类型数据。跟 Memcached 同样可使用字符串。并且你还能够处理 hash(哈希),set(全部不一样值的未排序),zset(全部不一样值的排序)和 list(可能包括重复的排序)。数据结构
3、Redis 如何运做?性能
数据库将数据存储在磁盘或 SSD 上,而 Redis 的数据是驻留在内存中。因为无需访问磁盘,Redis 等内存数据存储避免了查找时间延迟,而且能够在几微秒内访问数据。Redis 提供多种数据结构、高可用性、地理空间、Lua 脚本、事务、磁盘持久性和群集支持,让实时互联网级应用程序的构建变得更加简单。代理
4、Redis 持久化日志
如今能够经过两种不一样的方式实现持久性:一种称为快照,是一种半持久性模式,指定的时间间隔内生成数据集的时间点快照,以 RDB(Redis DataBase) 转储格式编写。从版本1.1开始,有更安全的替代方案 AOF(Append Only File),它的出现是为了弥补 RDB 的不足(数据的不一致性),采用日志的形式来记录每一个写操做并追加在文件中。
5、RDB 和 AOF ,我应该用哪个?
通常来讲,若是想达到足以媲美 PostgreSQL 的数据安全性, 你应该同时使用 RDB 和 AOF 两种持久化功能。
AOF 默认状况下,Redis 每2秒将数据写入文件系统,根据需求设置时间。若是在默认设置下系统出现故障,则只会丢失几秒钟的数据。若是你能够承受数分钟之内的数据丢失, 那么你能够只使用 RDB 持久化。
有不少人会单独使用 AOF,可是咱们并不鼓励这样,由于时常进行 RDB 快照很是方便于数据库备份,启动速度也较之快,还避免了AOF 引擎的 bug。
6、常见案例
缓存 - 因为其高性能,当读写操做量超过传统数据库的功能时,能够经过 Redis 进行解决。因为 Redis 可以轻松的将数据持久保存到磁盘和丰富数据类型,所以它是传统 Memcached 缓存解决方案的绝佳替代方案。
发布和订阅 - 从版本 2.0 开始,Redis 提供了使用发布/订阅消息传递范例分发数据的功能。
队列 - 像 Resque 这样的项目使用 Redis 做为排队后台做业的后端。
游戏排行榜- Redis 是寻求构建实时排行榜的游戏开发者的热门选择。可直接使用 Redis 有序集数据结构,此结构实现了元素的惟一性,同时又可维护按用户分数排序的列表。你也可使用时间戳做为分数,使用有序集处理时间序列数据。
实时分析-Redis 可做为内存中数据存储,与流处理平台(例如 Apache Kafka)搭配使用,以亚毫秒级延迟提取、处理和分析实时数据。Redis 是实时分析使用案例的理想选择,例如社交媒体分析、广告投放、个性化。
7、示例 Redis 基本命令
下面我简单讲解 Redis-CLI 基本命令操做,默认状况下,Redis-CLI在端口 6379 上运行。
SET (设置密钥)
127.0.0.1:6379> SET foo "Hello World" OK // 设置密钥
GET (获取密钥)
127.0.0.1:6379> GET foo "Hello World" // 获取密钥
DEL (删除密钥)
127.0.0.1:6379> GET foo "Hello World" 127.0.0.1:6379> DEL foo (integer) 1 // 密钥刚被删除 127.0.0.1:6379> GET foo (nil) // 密钥被删除,结果为nil。
SETEX (设置有效期限的密钥)
127.0.0.1:6379> SETEX foo 40 "I said, Hello World!" OK //密钥已设置为40秒到期
TTL (密钥的剩余时间)
127.0.0.1:6379> TTL foo (integer) 36 //36秒超时
PERSIST (密钥删除期限)
127.0.0.1:6379> PERSIST foo (integer) 1 //将密钥转为持久化(密钥不会过时)
RENAME (重命名当前现有密钥)
127.0.0.1:6379> RENAME foo bar OK // 将键'foo'重命名为 'bar'
FLUSHALL (清空到目前为止保存的全部内容)
127.0.0.1:6379> flushall OK // 删库跑路
8、小结
Redis 有着极其丰富的数据类型和极高性能,性能上读的速度是110000次/s,写的速度是81000次/s 。可是 Redis 不是万能的,受到物理内存的限制,不能用做海量数据的高性能读写,所以 Redis 适合的场景主要局限在较小数据量的高性能操做和运算上。