欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

为什么 Redis 为什么如此受欢迎

程序员文章站 2022-03-16 15:57:03
现在大多数开发人员都会听说过 Redis。Redis 是目前市场上最好的开源内存 NoSQL 数据库之一。它为前端以及后端服务(如键值查找,队列,哈希等)提供了非常多的帮助。 一、什么是 Redis? 根据 Redis 官方介绍,Redis 是一个开源(BSD许可),内存数据结构存储,用作数据库,缓 ......

现在大多数开发人员都会听说过 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 适合的场景主要局限在较小数据量的高性能操作和运算上。