NoSQL之Redis数据库基本知识

目录

 

NoSQL的简单介绍

NoSQL 和SQL数据库的比较:

1.Redis概念

2.Redis优势

3.Redis 适用场景

4.Redis存储的数据结构详解

     String--字符串

     List--列表

     Set--集合

扫描二维码关注公众号,回复: 9110546 查看本文章

     ZSet--有序集合

              Hash--哈希表

5.Redis事务

6.Redis高可用

        Redis持久化

            RDB方式

             AOF方式

           Redis主从复制

           Redis哨兵

           Redis分布式集群

附录Redis.conf配置文件参数说明


NoSQL的简单介绍

NoSQL:一类新出现的的数据库,它的特点:

   1.不支持SQL语法;

   2.存储结构与传统关系型数据库中的那种关系表完全不同,NoSQL中的存储的数据都是KV形式;

   3.NoSQL的世界中没有一种通用的语言,每个NoSQL数据库都有自己的API和语法,擅长的业务场景;

   4.NoSQL中的产品种类:

       (1)MongoDB,文档型NoSQL数据库,擅长CMS系统(内容管理系统)

       (2)Redis,内存数据库,数据结构服务器,号称瑞士军刀(精巧),功能强大,轻量级

       (3)HBase,hadoop生态系统中原生的一种NoSQL数据库,重量级的分布式NoSQL数据库,用于存储海量数据

       (4)Cassandra,hadoop生态系统中原生的一种分布式NoSQL数据库,后起之秀

NoSQL 和SQL数据的比较:

     1.适用的场景不同,SQL数据库适用于关系特别复杂的数据查询场景,NoSQL反之

     2.“事务”特性的支持:SQL对事务的支持非常完善,而NoSQL基本不支持事务(Redis部分支持事务

     3.两者在不断的取长补短,呈现融合趋势

1.Redis概念

    REmote   Dlctionary  Server(Redis)是一个由 Salvatore  Sanfilippo写的开源的、高性能的、使用ANSI  C语言编写,遵守BSD协议、支持网络、可基于内存亦可持久化的日志型,key-value存储系统,并提供多种语言的API。

    Redis常被称作是一款key-value内存存储系统或者内存数据库,同时支持丰富的数据结构,又被称作为一种数据结构服务器,因为其值可以是字符串(String),哈希(Map),列表(list),集合(sets),有序集合(sorted sets)等类型。

    Redis与其他key_value缓存产品的3个特点:

    1.Redis支持数据的持久化,可以将内存中的数据存储到磁盘,下次启动后再加载到内存中

    2.Redis支持不仅是简单的key_value类型的数据,value的值还可以是list,set,hash,zset等其他复杂数据结构

    3.Redis支持数据的备份,即master-slave模式的数据备份。

2.Redis优势

    1.性能极高:Redis能读的速度是110000次/s,写的速度是81000次/s;

    2.丰富的数据类型:Redis支持二进制案例的String,List,Hash,Set及Sorted  Set数据类型操作;

    3.原子操作:Redis的所有操作都是原子性的,同时Redis还支持几个操作合并后的原子性执行;(是否完全支持事务待定)

    4.丰富的特性:Redis还支持Publish/Subscribe,通知key过期,支持高可用集群等特性;

    5.数据持久化机制:

             持久化机制有两种:

                1.RDB方式:定期将内存数据dump到磁盘

                2.AOF(append only  file)持久化机制:用记日志的方式记录每一条数据更新操作,一旦出现灾难事件,可以通过日志重放来恢复整个数据库

  3.Redis 适用场景

     1.TopN需求:取最新的n个数据,如读取作家博客最新的50篇文章,通过List实现按时间排序的数据的高效获取

     2.排行榜应用:以特定条件为排序标准,将其设成sorted  set的score,进而实现高效获取

     3.需要精准设定过期时间的应用:把sorted set 的 sorted 值设置成过期时间的时间戳,那么就可以简单地通过过期时间排序,定时清除过期数据

     4.计数器应用:Redis的命令都是原子性的,可以轻松地利用INCR,DECR命令来构建计数器系统

     5.去除大量数据中的重复数据:将数据放入set中,就能实现对重复数据的排除

     6.构建队列系统:使用list 可以构建队列系统,使用sorted set 甚至 可以构建有优先级的队列系统

     7.实时系统,反垃圾系统:通过上面说到的 set 功能,你可以知道一个终端用户是否进行了某个操作,可以找到其操作的集合并进行分析统计对比等

     8.Publish/SubScribe构建实时消息系统

     9.缓存(会话,商品列表,评论列表,经常查询的数据等)

4.Redis存储的数据结构详解

     String--字符串

     String是Redis最基本的类型,一个key对应一个value,String类型是二进制安全的,可以包含任何数据比如JPG图片或者序列化对象,   一个键最大能存储512M

      操作命令

     

     List--列表

     Redis列表是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部或者尾部

     操作命令

    

      典型需求:

       任务调度系统:

        生产者不断产生任务,放入task-queue排队, 消费者不断拿出来任务来处理,同时放入一个temp-queue暂存,如果任务处理成功,则清除temp-queue,否则,将任务弹回task-queue。

      

    Set--集合

    Redis的Set是string类型的无序集合

     集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)

    

     ZSet--有序集合

      ZSet 和 Set 一样也是String 类型元素的集合,且不允许重复的成员。

      不同的是每个元素都会关联一个double类型的分数。Redis 正是通过分数来为集合中成员进行从小到大的排序。

       ZSet的成员是唯一的,但分数(score)却可以重复。

       

        Hash--哈希表

          Redis  Hash 是一个键值对集合

          Redis  Hash类型可以看成具有 String  Key 和 String Value 的 map 容器

          Redis  Hash是一个 String 类型的field 和value 的映射表,Hash 特别适合用存储对象。

          

        键值相关命令

          

         服务器相关命令

             

  5.Redis事务

          可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其他命令插入,不需加塞(隔离性)

          命令:

          discard:取消事务放弃执行事务块内的所有命令

          exec:执行事务块内的命令

           multi:标记一个事务块开始

           unwatch:取消watch 对所有key的监视

           watch:监视一个或多个key,如果在事务执行之前被其他命令所改动,那么事务将被打断

           Redis事务执行过程中不保证原子性:Redis 同一个事务中如果一条命令执行失败,其后命令仍然会被执行,没有回滚。

           运行前监测中,事务中间一条命令语法写错了,则全部撤销

           运行时报出异常,只撤销异常的语句

6.Redis高可用

            在Redis中,实现高可用的技术主要包括持久化、复制、哨兵、集群

            持久化

                      将数据保存在硬盘中,保证数据不会因进程退出而丢失。

           主从复制

                      复制是高可用Redis的基础,哨兵和集群都是在复制基础上实现的高可用,复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。缺陷:故障恢复无法自动化;写操作无法负载均衡,存储能力受到单机的限制。

            哨兵

                      哨兵在复制的基础上,哨兵实现了自动化的故障恢复。缺陷:写操作无法负载均衡,存储能力受到单机的限制。

            集群

                      通过集群,Redis解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了较为完善的高可用方案。  

        Redis持久化

             Redis持久化分为RDB持久化和AOF持久化:

             RDB:将Redis在内存中的数据库记录定时dump到磁盘上;

             AOF:将Redis的操作日志依次以追加的方式写入到磁盘文件中;

            RDB方式

            

               有2个触发条件:

                 1.手动方式

               

                 2.自动触发

                

                AOF方式

                    AOF 比快照方式有更好的持久化性,是由于在使用 AOF 持久化方式时,Redis 会将每一个收
                    到的写命令都通过 write 函数追加到文件中(默认是 appendonly.aof)。当 Redis 重启时会通过
                    重新执行文件中保存的写命令来在内存中重建整个数据库的内容。

                     当然由于 os 会在内核中缓存 write 做的修改,所以可能不是立即写到磁盘上。这样 AOF 方
                     式的持久化也还是有可能会丢失部分修改。不过我们可以通过配置文件告诉 redis 我们想要
                     通过 fsync 函数强制 os 写入到磁盘的时机。有三种方式如下(默认是:每秒 fsync 一次):

                     

               两种持久化方式的总结:

                      相同数据集的数据 AOF文件要远大于 rdb 文件,恢复速度慢于 rdb
                      AOF 运行效率要慢于 rdb,每秒同步策略效率较好,不同步效率和 rdb 相同
                      Redis 还能对 AOF 文件进行后台重写,使得 AOF 文件的体积不至于过大

           Redis主从复制

                      特点:

                       

                        过程:

                        

                        配置slave服务器只需要在配置文件中加入如下配置:

                          slaveof hadoop02 6379 #指定 master 的 ip 和端口

               Redis哨兵

                      一种高可用的redis部署方案。在集群中的redis-master服务挂掉时,无需人为干预,即可通过哨兵集群的自我调 整,实现redis服务的持续可用。

                      哨兵的作用: 
                           1、监控redis进行状态,包括master和slave 
                           2、当master down机,能自动将slave切换成master

                        一般情况下哨兵和主从复制一起使用,保证Redis的高可用

              Redis分布式集群

                         架构细节:
                                1、所有的 redis 节点彼此互联(ping-pong 机制),内部使用二进制协议优化传输速度和带宽。
                                2、节点的 fail 是通过集群中超过半数的节点检测失效时才生效。
                                3、客户端与 redis 节点直连,不需要中间 proxy 层。客户端不需要连接集群所有节点,连接集
                                群中任何一个可用节点即可。
                                4、redis-cluster 把所有的物理节点映射到[0-16383]slot 上,cluster 负责维护 node <-> slot <->
                                 value

                           Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先
                           对 key 使用 CRC16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应
                           一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的
                           节点

                       Redis 容错:
                           1、 投票过程是集群中所有 master 参与,如果半数以上 master 节点与 master 节点通信超时
                               (cluster-node-timeout),认为当前 master 节点挂掉.
                           2、 什么时候整个集群不可用(cluster_state:fail)?如果集群任意 master 挂掉,且当前 master
                               没有 slave.集群进入 fail 状态,也可以理解成集群的 slot 映射[0-16383]不完整时进入 fail
                               状态。redis-3.0.0.rc1 加入 cluster-require-full-coverage 参数,默认关闭,打开集群兼容部
                               分失败。如果集群超过半数以上 master 挂掉,无论是否有 slave,集群进入 fail 状态。

附录Redis.conf配置文件参数说明

                            

                       

                       

                        

                        

                        

发布了27 篇原创文章 · 获赞 9 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/I_Demo/article/details/84639051