zoukankan      html  css  js  c++  java
  • Redis

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

    一、Redis含义

      在日常的Java web开发中,都是使用关系数据库来进行数据存储的,因为基本上访问和并发不高、交互较少,不会出现什么问题。当伴随着访问量的提升,使用关系型数据库的web系统会在性能上出现一些问题了,单一使用数据库来保存数据的系统会因为面向磁盘,磁盘读/写速度比较慢的问题而存在严重的性能弊端,一瞬间成千上万的请求到来,需要系统在极短的时间内完成成千上万次的读/写操作,这个时候往往不是数据库能够承受的,极其容易造成数据库系统瘫痪,最终导致服务宕机的严重生产问题。随着互联网技术的进一步发展,各种类型的应用层出不穷,这导致在当今云计算、大数据盛行的时代,对性能有了更多的需求,主要体现在以下四个方面:

    • 低延迟的读写速度:应用快速地反应能极大地提升用户的满意度
    • 支撑海量的数据和流量:对于搜索这样大型应用而言,需要利用PB级别的数据和能应对百万级的流量
    • 大规模集群的管理:系统管理员希望分布式应用能更简单的部署和管理
    • 庞大运营成本的考量:IT部门希望在硬件成本、软件成本和人力成本能够有大幅度地降低

      NoSQL应运而生,它同时具备了高性能、可扩展性强、高可用等优点,受到广泛开发人员和仓库管理人员的青睐。这是一种基于内存的数据库,并且提供一定的持久化功能,可以用作数据库、缓存和消息中间件。Redis和MongoDB是当前使用最广泛的NoSQL,而就Redis技术而言,它的性能十分优越,可以支持每秒十几万此的读/写操作,其性能远超数据库,并且还支持集群、分布式、主从同步等配置,原则上可以无限扩展,让更多的数据存储在内存中,更让人欣慰的是它还支持一定的事务能力,这保证了高并发的场景下数据的安全和一致性。Redis具备这几个特性:

    • 基于内存运行,性能高效
    • 支持分布式,理论上可以无限扩展
    • key-value存储系统
    • 开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API

    相比于其他数据库类型,Redis具备的特点是:

    • C/S通讯模型
    • 单进程单线程模型
    • 丰富的数据类型
    • 操作具有原子性
    • 持久化
    • 高并发读写
    • 支持lua脚本

    Redis的应用场景:

    • 缓存系统(“热点”数据:高频读、低频写)
    • 计数器
    • 消息队列系统
    • 排行榜
    • 社交网络和实时系统

    C/S架构

      可以通过Redis的命令行,也可以通过各种语言的Redis API,在代码里面对Hash表进行操作,这些都是Redis客户端(Client),而Hash表所在的是Redis服务端(Server),也就是说Redis其实是一个C/S架构。Client和Server可以是在一台机器上的,也可以不在。

      Redis的Server是单线程服务器,基于Event-Loop模式来处理Client的请求,这一点和NodeJS很相似。使用单线程的好处包括:

    • 不必考虑线程安全问题。很多操作都不必加锁,既简化了开发,又提高了性能
    • 减少线程切换损耗的时间。线程一多,CPU在线程之间切来切去是非常耗时的,单线程服务器则没有了这个烦恼

    Redis集群

      当客户端client增加时,Redis还只是一个的时候,会出现一些问题:

    • Redis内存不足:随着使用Redis的客户端越来越多,Redis上的缓存数据也越来越大,而一台机器的内存毕竟是有限的,放不了那么多数据
    • Redis吞吐量低:客户端变多了,可Redis还是只有一台,而Redis是单线程的!一台机器的带宽和处理器都是有限的,Redis自然会忙不过来,吞吐量已经不足以支撑我们越来越庞大的系统。

      把Redis的数量增加,客户端的请求通过负载均衡算法,分散到各个Redis服务器上,通过集群解决了这些问题:

    • 扩大缓存容量
    • 提升吞吐量

    二、Redis解析

      Redis提供的数据类型主要分为5种自有类型和一种自定义类型,这5种自有类型包括:String类型、哈希类型、列表类型、集合类型和顺序集合类型。

    •  String类型:它是一个二进制安全的字符串,意味着它不仅能够存储字符串、还能存储图片、视频等多种类型, 最大长度支持512M。
    • 哈希类型:该类型是由field和关联的value组成的map。其中,field和value都是字符串类型的。
    • 列表类型:该类型是一个插入顺序排序的字符串元素集合, 基于双链表实现。
    • 集合类型:Set类型是一种无顺序集合, 它和List类型最大的区别是:集合中的元素没有顺序, 且元素是唯一的。Set类型主要应用于:在某些场景,如社交场景中,通过交集、并集和差集运算,通过Set类型可以非常方便地查找共同好友、共同关注和共同偏好等社交关系。
    • 顺序集合类型:ZSet是一种有序集合类型,每个元素都会关联一个double类型的分数权值,通过这个权值来为集合中的成员进行从小到大的排序。与Set类型一样,其底层也是通过哈希表实现的。

      Redis常见问题:

    • 击穿:缓存击穿,是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。合理的规避方案:服务器启动时,提前写入、规范key的名称或通过中间件拦截、对某些高频率访问的key值可以设置合理的TTL或永不过期
    • 雪崩:Redis缓存层由于某种原因宕机后,所有的请求会涌向存储层,短时间内的高并发请求可能会导致存储层挂机,称之为“Redis雪崩”。合理的规避方案:使用Redis集群、限流。
    • 穿透:缓存穿透,是指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存。如果从数据库查询的对象为空,也放入缓存,只是设定的缓存过期时间较短,比如设置为60秒。

      其他NOSQL数据库:

    • Memcahe:这是一个和Redis非常相似的数据库,但是它的数据类型没有Redis丰富。Memcache由LiveJournal的Brad Fitzpatrick开发,作为一套分布式的高速缓存系统,被许多网站使用以提升网站的访问速度,对于一些大型的、需要频繁访问数据库的网站访问速度的提升效果十分显著。
    • Apache Cassandra:(社区内一般简称为C*)这是一套开源分布式NoSQL数据库系统。它最初由Facebook开发,用于储存收件箱等简单格式数据,集Google BigTable的数据模型与Amazon Dynamo的完全分布式架构于一身。Facebook于2008将 Cassandra 开源,由于其良好的可扩展性和性能,被 Apple、Comcast、Instagram、Spotify、eBay、Rackspace、Netflix等知名网站所采用,成为了一种流行的分布式结构化数据存储方案。
    • MongoDB:是一个基于分布式文件存储、面向文档的NoSQL数据库,由C++编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系型数据库的,它支持的数据结构非常松散,是一种类似json的BSON格式。
  • 相关阅读:
    SQLSERVER查询所有数据库名,表名,和字段名
    SQL通过拆分某字段中的内容来实现与对应表连接查询
    [SPOJ]CIRU 圆并
    有关反演和GCD
    docker部署 jenkins
    mongoDB学习记录(二)
    docker动态修改容器限制
    ORACLE数据库误操作DELETE并且提交数据库之后如何恢复被删除的数据
    用8个命令调试Kubernetes集群
    db2服务器linux的cache过高原因
  • 原文地址:https://www.cnblogs.com/yfstudy/p/13562484.html
Copyright © 2011-2022 走看看