Redis系列-redis概述【1】

一、Redis简介

redis的官网地址 redis.io。(域名后缀io属于国家域名,是british Indian Ocean territory,即英属印度洋领地),Vmware在资助着redis项目的开发和维护。

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

Redis的起源和背景

Redis起源

antirez和他的网站
在 2007 年,有个意大利西西里岛的小哥 Salvatore Sanfilippo(antirez) 和朋友创建了一个访客信息网站:LLOOGG.com。这个网站为其他网站提供各种信息的统计(包括访客 Ip、操作系统、浏览器、使用的搜索关键词、所在地区、访问的网页地址等信息)。

而对信息的收集在概念上并不复杂:多个网站把访客信息连续不断的推送到 LLOOGG.COM 服务器,而 LLOOGG.COM 服务器需要为每个网站保存一定数量的最新页面访问记录,并通过网页将这些记录实时地展示给用户观看。
LLOOGG.COM 可以查看最多 10000 条的最新浏览记录。这样的话,它需要为每一个网站创建一个队列,不同网站的访问记录进入到不同的队列。如果队列的长度超过了用户指定的长度,它需要把最早的记录删除。(先进先出)
随着 LLOOGG.com 的用户越来越多,LLOOGG.com 要维护的列表数量也越来越多,要执行的推入和弹出操作也越来越多。LLOOGG.com 当时使用 MySQL 数据库,而 MySQL 每次执行推入和弹出操作都要进行硬盘写入和读取,程序的性能严重受制于硬盘 I/O 。 最终 LLOOGG.com 所使用的 MySQL 再也没办法在当时的 VPS 上处理新增的大量负载,因为 LLOOGG.com 当时还没有找到盈利模式,所以为了尽量节约开支,antirez 没有选择直接升级 LLOOGG.com 所使用的 VPS ,而是打算另寻 办法,在现有硬件的基础上,通过提升列表操作的性能来解决负载问题。

Redis的诞生

为了解决 LLOOGG.com 的负载问题,antirez 决定自己写一个具有列表结构的内存数据库原型。这个数据库原型支持O(1) 复杂的推入和弹出操作,并且将数据储存在内存而不是硬盘,所以程序的性能不会受到硬盘 I/O 限制,可以以极快的速度 执行针对列表的推入和弹出操作。于是 antirez 使用C 语言写了这个内存数据库,并给它加上了持久化功能,2009年2月26日Redis(Remote Dictionary Server 远程字典服务)就此诞生!

在最大负载达到每秒数千条页面记录的情况下,无论我使用什么样的数据库模式(schema),无论我如何进行优化,我所使用的关系数据库都没办法在这个小虚拟机上处理如此大的负载。因为囊中羞涩,我没办法对虚拟机进行升级,并且我觉得应该有更简单的方法来处理一个由推入值组成的列表。最终,我决定自己写一个实验性质的内存数据库原型(prototype),这个数据库使用列表作为基本数据类型,并且能够对列表的两端执行常数时间复杂度的弹出(pop)和推入(push)操作。长话短说吧,这个内存数据库的想法的确奏效了,于是我用 C 语言重写了最初的数据库原型,并给它加上了基于子进程实现的持久化特性,Redis 就这样诞生了。
———— Salvatore Sanfilippo(antirez)

Redis的特点和优势

Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便.

常见的内存型数据库,除Redis 之外,还有 Oracle Berkeley DB(甲骨文旗下的一款产品)、SQlite(轻量级内存数据库)、Memcache(键值型分布式缓存数据库)、Altibase(基于内存的高性能数据库)。

Redis特点
  • Redis 不仅可以将数据完全保存在内存中,还可以通过磁盘实现数据的持久存储;
  • Redis 支持丰富的数据类型,包括 string、list、set、zset、hash 等多种数据类型,因此它也被称为“数据结构服务器”;
  • Redis 支持主从同步,即 master-slave 主从复制模式。数据可以从主服务器向任意数量的从服务器上同步,有效地保证数据的安全性;
  • Redis 支持多种编程语言,包括 C、C++、Python、Java、PHP、Ruby、Lua 等语言
优点
  • 读写性能优异 (性能高 Redis能支持超过 100K+ 每秒的读写频率)
  • 支持 RDB 和 AOF 两种数据的持久化
  • 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离
  • 支持丰富的数据结构,如 String,List,Set,Zset(有序集合),Hash 五种数据结构
  • 单进程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题
  • 多种附加功能:除了上述功能以外,Redis还提供了键过期、发布订阅、事务、流水线、Lua脚本等附加功能。
  • 多用途工具:Redis 有很多的用途,比如可以用作缓存、消息队列、搭建 Redis 集群等;
缺点
  • Redis 不具备自动容错和恢复功能。主机,从机的宕机都会导致读写请求失败,需要等待机器重启才能恢复
  • 主机宕机前,如果有部分数据未能及时同步到从机,重启主机后会导致数据不一致的问题

        1.  依赖主机内存大小
           由于是内存数据库,所以,单台机器,存储的数据量,跟机器本身的内存大小。虽然redis本身有key过期策略,但是还是需要提前预估和节约内存。如果内存增长过快,需要定期删除数据。
    
        2.  如果进行完整重同步,由于需要生成rdb文件,并进行传输,会占用主机的CPU,并会消耗现网的带宽。不过redis2.8版本,已经有部分重同步的功能,但是还是有可能有完整重同步的。比如,新上线的备机。
    
        3.  修改配置文件,进行重启,将硬盘中的数据加载进内存,时间比较久。在这个过程中,redis不能提供服务。

Redis的应用场景

简单来说,Redis 在 Java Web 主要有两个应用场景:

  • 存储缓存用的数据
  • 需要高速读写的场合

Redis 根据使用数据类型的不同,对应的使用场景有很多,例如:

  1. 缓存(String / Hash 类型):缓存如用户信息,视频信息等;
  2. 分布式锁(String 类型):setnx 方法,「key不存在才插入」,可以用它来实现分布式锁;
  3. 计数器(String 类型):incr/decr 方法,自增自减,由于是原子性,可以用来计数统计浏览数、点赞数等;
  4. 限制请求次数(String 类型):也是利用 incr 方法,限制请求次数访问者的 ip 和其他信息作为 key,访问一次增加一次计数,超过次数则返回 false;
  5. 数据共享分布式(String 类型):因为 Redis 是分布式的独立服务,可以在多个应用之间共享,所有可以实现需要例如分布式 Session;
  6. 购物车(Hash 类型):类似存储商品信息,大 key 为商家 id,小 key 是商品 id 即 goodsId,value 为该 goodsId 的详细信息;
  7. 消息队列(List / Stream 类型):二者都可以实现消息队列,而 Redis5.0 新增的 Stream,解决了 List 实现的消息队列不能持久化和不能重复消费的问题;
  8. 点赞、踩、收藏(Set 类型):Set 集合无序、不可重复,可以保证一个用户只能点一个赞;
  9. 共同关注(Set 类型):Set 类型支持交集运算,所以可以用来计算共同关注的好友、公众号等;
  10. 抽奖活动(Set 类型):存储某活动中中奖的用户名 ,Set 类型因为有去重功能,可以保证同一个用户不会中奖两次;
  11. 排行榜(ZSet 类型):有序集合保留了集合不能有重复成员的特性(分值可以重复),但不同的是,有序集合中的元素可以排序,所以可以用作排行榜功能的实现;

此外利用 Redis 的特殊数据类型也可以实现一些相应的功能:Bit 位运算用来签到统计HyperLogLogs 统计基数用来百万级网络 UV,还有 GEO 地理位置、用来打车等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嘉羽很烦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值