为什么 Redis 为什么如此受欢迎
现在大多数开发人员都会听说过 Redis。Redis 是目前市场上最好的开源内存 NoSQL 数据库之一。它为前端以及后端服务(如键值查找,队列,哈希等)提供了非常多的帮助。
一、什么是 Redis?
根据 Redis 官方介绍,Redis 是一个开源(BSD许可),内存数据结构存储,用作数据库,缓存和消息代理,它支持字符串、哈希表、列表、集合、有序集合、位图、hyperloglogs 等数据类型。
二、Redis 与 Memcached
Redis 是一个数据结构服务器。作为键值数据存储,Redis 类似于 Memcached,但它比 Memcached 有两个主要优点:支持更多的数据类型以及持久化。
持久化使得你可以将 Redis 当做合法数据库进行操作,而不是一个不稳定的临时缓存。如果重新启动,Memcached 信息将丢失; 但 Redis 数据仍然存在。
Redis 支持存储多种类型数据。跟 Memcached 一样可以使用字符串。而且你还可以处理 hash(哈希),set(所有不同值的未排序),zset(所有不同值的排序)和 list(可能包括重复的排序)。
三、Redis 如何运作?
数据库将数据存储在磁盘或 SSD 上,而 Redis 的数据是驻留在内存中。由于无需访问磁盘,Redis 等内存数据存储避免了查找时间延迟,并且可以在几微秒内访问数据。Redis 提供多种数据结构、高可用性、地理空间、Lua 脚本、事务、磁盘持久性和群集支持,让实时互联网级应用程序的构建变得更加简单。
四、Redis 持久化
现在可以通过两种不同的方式实现持久性:一种称为快照,是一种半持久性模式,指定的时间间隔内生成数据集的时间点快照,以 RDB(Redis DataBase) 转储格式编写。从版本1.1开始,有更安全的替代方案 AOF(Append Only File),它的出现是为了弥补 RDB 的不足(数据的不一致性),采用日志的形式来记录每个写操作并追加在文件中。
五、RDB 和 AOF ,我应该用哪一个?
一般来说,如果想达到足以媲美 PostgreSQL 的数据安全性, 你应该同时使用 RDB 和 AOF 两种持久化功能。
AOF 默认情况下,Redis 每2秒将数据写入文件系统,根据需求设置时间。如果在默认设置下系统出现故障,则只会丢失几秒钟的数据。如果你可以承受数分钟以内的数据丢失, 那么你可以只使用 RDB 持久化。
有很多人会单独使用 AOF,但是我们并不鼓励这样,因为时常进行 RDB 快照非常方便于数据库备份,启动速度也较之快,还避免了AOF 引擎的 bug。
六、常见案例
缓存 - 由于其高性能,当读写操作量超过传统数据库的功能时,可以通过 Redis 进行解决。由于 Redis 能够轻松的将数据持久保存到磁盘和丰富数据类型,因此它是传统 Memcached 缓存解决方案的绝佳替代方案。
发布和订阅 - 从版本 2.0 开始,Redis 提供了使用发布/订阅消息传递范例分发数据的功能。
队列 - 像 Resque 这样的项目使用 Redis 作为排队后台作业的后端。
游戏排行榜- Redis 是寻求构建实时排行榜的游戏开发者的热门选择。可直接使用 Redis 有序集数据结构,此结构实现了元素的唯一性,同时又可维护按用户分数排序的列表。你也可以使用时间戳作为分数,使用有序集处理时间序列数据。
实时分析-Redis 可作为内存中数据存储,与流处理平台(例如 Apache Kafka)搭配使用,以亚毫秒级延迟提取、处理和分析实时数据。Redis 是实时分析使用案例的理想选择,例如社交媒体分析、广告投放、个性化。
七、示例 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 // 删库跑路
八、小结
Redis 有着极其丰富的数据类型和极高性能,性能上读的速度是110000次/s,写的速度是81000次/s 。但是 Redis 不是万能的,受到物理内存的限制,不能用作海量数据的高性能读写,因此 Redis 适合的场景主要局限在较小数据量的高性能操作和运算上。
为什么 Redis 为什么如此受欢迎的更多相关文章
- 企业做数据缓存是使用Memcached还是选Redis?
企业是使用Memcached还是选Redis? 在构建一款现代且由数据库驱动的Web应用程序并希望使其拥有更为出色的性能表现时,这个问题总会时不时出现.并给每一位开发人员带来困扰.在考虑对应用程序的性 ...
- 为何Redis要比Memcached好用(转)
转载链接:http://blog.csdn.net/renfufei/article/details/40598889 GitHub版本地址: https://github.com/cncounter ...
- java 客户端链接不上redis解决方案
原文地址:http://blog.csdn.net/yingxiake/article/details/51472810 出现问题描述: 1.Could not get a resource from ...
- Redis内存数据库在Exchange会议室的应用
本文论述了现有Exchange会议室应用现状和不足之处,并详细介绍了Redis内存数据库在Exchange会议室的应用,并给出了一种高性能的应用架构及采用关键技术和关键实现过程,最终实现大幅改进系统性 ...
- Memcached和Redis异同
在考虑对应用程序的性能表现进行提升时,缓存机制往往是解决问题的重要起点,而Memcached与Redis则经常被作为初步方案来加以比较.这两套声名显赫的缓存引擎拥有着诸多相似之处,但它们同样也具备大量 ...
- 为什么Redis比Memcached易
GitHub版本号地址: https://github.com/cncounter/translation/blob/master/tiemao_2014/Redis_beats_Memcached/ ...
- Redis是新兴的通用存储系统-为何Redis要比Memcached好用
GitHub版本地址: https://github.com/cncounter/translation/blob/master/tiemao_2014/Redis_beats_Memcached/R ...
- 把leveldb嵌入到redis.实现真正的数据持久存储
目前最新版RedisStorage 是基于 redis 2.6.2基础上,加上 leveldb存储引擎. 这个项目是源于 公司项目的passport 用户认证改造.公司一个项目运行了N年.积累了几千万 ...
- Redis系列四:redis支持的数据类型
一.字符串<String> 1. 字符串类型:实际上可以是字符串(包括XML JSON),还有数字(整形 浮点数),二进制(图片 音频 视频),最大不能超过512MB 2. 设值命令: s ...
随机推荐
- 松软科技web课堂:JavaScript 注释
JavaScript 注释用于解释 JavaScript 代码,增强其可读性. JavaScript 注释也可以用于在测试替代代码时阻止执行. 单行注释 单行注释以 // 开头. 任何位于 // 与行 ...
- vue $emit $on 从子组件传递数据给父组件
原理是: 子组件使用$emit发送数据,父组件使用$on,或者v-on绑定, 来监听子组件发送的数据. 子组件: <button @click="sendChildData" ...
- raspberry-gpio-python(树莓派GPIO与Python编程)
国外的设计接口设计得很棒,包括问题:读脏与防抖,还包括读这个数据提供了两种方式,一种是阻塞等待方式,还有一种是回调函数,前一种是通讯中常用的方式,后一种来自系统架构设计的整体性考虑.这种硬件接口设计的 ...
- Centos7 下安装python3及卸载
一.安装python3 1.安装依赖包 yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel read ...
- 对比keep-alive路由缓存设置的2种方式
方式有两种 .路由元信息(2.1.0版本之前) .属性方式(2.1.0版本之后新增) Vue2.1.0之前: 想实现类似的操作,你可以: 配置一下路由元信息 创建两个keep-alive标签 使用v- ...
- Day6 - Python基础6 模块shelve、xml、re、subprocess、pymysql
本节目录: 1.shelve模块 2.xml模块 3.re模块 4.subprocess模块 5.logging模块 6.pymysql 1.shelve 模块 shelve模块是一个简单的k,v将内 ...
- nginx学习(四):nginx处理web请求机制
worker抢占机制 如下图所示,如果有一个请求,各个work进程会进行争锁.谁抢到是谁的.需要注意Nginx 所有worker进程协同工作的关键(共享内存). [accept_mutex的介绍] 当 ...
- 关于scanf的一些知识
10.22,对现阶段已知道的scanf的一些用法或注意事项的一些总结: 1.scanf中,赋值的那个数据前面一定加&! 2.若情景要求必须输入空格的,scanf("%d%c%d&qu ...
- React: React的属性验证机制
一.简介 在开发中,属性变量类型的验证,几乎是任何语言都必须关注的问题,因为如果传入的数据类型不对,轻者程序运行仅仅是给出警告⚠️,严重的会直接导致程序中断,APP闪退或者web页面挂掉,这是很严重的 ...
- php 获取代码执行的时间
$start_time = microtime(true); // ... 执行代码 ...$end_time = microtime(true);echo '共'.round($start_time ...