Redis-简介

1. Redis简介
 
Redis是一个远程内存数据库,具有复制特性. Redis数据结构共有5种,致力于帮助用户解决问题, 而不会像其他数据库那样要求用户扭曲问题来适应数据库. 除此之外,通过复制,持久化和客户端分片( client -side sharding )等特性,用户可以很方便的将Redis扩展成一个 能够包含数百GB数据, 每秒处理上百万次请求的系统.
Redis是一个速度非常快的非关系型数据库( non-relational database ), 因为不需要通过读取来获得数据,而是通过 key 直接获取所以非常快, 它可以存储键( key )与5种不同类型的值(value)之间的映射( mapping ),可以将存储在内存的键值对数据持久化到硬盘, 可以使用复制特性来扩展读性能, 还可以使用客户端分片来扩展写性能.
分片是一种数据划分为多个部分的方法,对数据的划分可以基于包含的ID, 基于键的散列值,或者基于以上两者的某种组合. 通过对数据进行分片, 用户可以将数据存储到多台机器里面, 也可以从多台机器里面获取数据, 这种方法在解决某些问题时可以获得线性级别的性能提升.

 

 

 
 
redis集群
使用乒乓协议, 即 接收一个乒 返回一个乓
类似于心跳机制 定时任务
多台争夺一个ip节点, 这个ip就是主服务器,主服务器挂掉了, 副服务器备份上来,仍然使用这个节点,不需要更换端口号,可以解决宕机问题
另外一种主从,通过一个哨兵来监控主机, 主机宕机后,从服务器补上来, 这样的话是端口号会变化的,从服务器使用一种投票的机制来选举哪个从服务器来做主服务器
 
分片:
传统: 当数据量很大时,通过改善单机硬件资源的纵向扩充方式来存储数据变得越来越不适用. 通过取模,进行分配内存,平均分配, 通过存储数据的key的hash值进行取模与数据库数量进行平均分配,但是有一个特别大的缺点在于,如果要是添加一个数据库,那么之前存储的数据都要进行重新分配redis数据库,进而会造成资源浪费. 形象理解为 row为数据库, col为真实数据组成的四边形,可以发现会造成命中率太低.
改进: 通过增加机器数目来获得水平横向扩展的方式. 一致性算法 redis环状取值,将数据存储在一个环状模型上,可能会分配不均匀,环状中有一个虚拟目录用来存储真实数据的地址,用户访问数据库,通过虚拟目录来访问真实地址, 当添加一个数据库时,对应的添加一个虚拟目录即可,更改虚拟目录中存储的地址即可,并不需要重新进行真实内存分配,来提高命中率

 

 
 
一致性哈希的原理:
由于一般的哈希函数返回一个int(32bit)型的hashCode. 因此, 可以将该哈希函数能够返回的hashCode表示成一个范围为0--( 2^32 ) -1环.
将机器的标示(如:IP地址)作为哈希函数的Key映射到环上. 如: hash(Node1)=Key1 hash(Node2)=Key2, 如上图
同样,数据也通过相同的哈希函数映射到环上. 这样,按照顺时针方向,数据存放在它所在的顺时针方向上的那个机器上. 这就是一致性哈希算法分配数据的方式.
一致性哈希采用的做法如下:引入一个环的概念,如上面的第一个图。先将机器映射到这个环上,再将数据也通过相同的哈希函数映射到这个环上,数据存储在它顺时针走向的那台机器上。以环为中介,实现了数据与机器数目之间的解藕。这样,当机器的数目变化时,只会影响到增加或删除的那台机器所在的环的邻接机器的数据存储,而其他机器上的数据不受影响。
 
 
 

1.1 Redis与其它数据库的比较
 
高性能键值缓存服务器 memcached对比redis:两者都是存储键值映射, 彼此性能相差无几, 但是redis能够自动以两种不同的方式将数据写入硬盘, 并且redis除了能存储普通的字符串键之外, 还可以存储其它4种数据结构, 而memcached只能存储普通的字符串键. 除此之外, Redis既可以作为主数据库(primary database)使用, 又可以作为其它存储系统的辅助数据库(auxiliary database)使用.
redis是使用 内存存储(in-memory)的非关系数据库,数据存储选项可以存储字符串, 列表, 集合, 散列表以及有序集合. 每种数据类型都有自己的专属命令, 另外还有批量操作和不完全的事务支持. 附加功能有发布订阅, 主从复制,持久化,脚本等.
尽管redis的性能很好, 但受限于Redis的内存存储设计, 有时候只使用一台Redis服务器可能没有办法处理所有请求. 因此,为了扩展Redis的读性能, 并为Redis提供故障转移(failover)支持, Redis实现了主从复制: 执行复制的从服务器会链接上主服务器, 接收主服务器发送的整个数据库的出师副本(copy); 之后主服务器执行的写命令,都会被发送给所有链接着的从服务器去执行, 从而实时的更新从服务器的数据集. 因为从服务器包含的属于会不断地进行更新, 所以客户端可以向任意一个服务器发送读请求, 以此来避免对主服务器进行集中式的访问.
 

 
1.2 使用Redis的理由
 
对比同类型的memcached,用户只能用append命令添加数据到已有的字符串末尾( 注意:memcached只能存储字符串 ), 并将那个字符串当做列表来使用. 删除数据时, memcached采取的办法是通过黑名单(blacklist)来隐藏列表里的元素, 从而避免对元素执行读取,更新,写入等操作. 相反,Redis的 List 和 Set允许用户直接添加或删除元素.
使用Redis而不使用memcached来解决问题, 不仅可以让代码变得更短,更易懂, 更易维护, 而且还可以使代码运行速度更快( 因为用户不需要通过读取数据库来更新数据 ). 除此之外, 在其他许多情况下, Redis的效率和易用性也比关系型数据库要好很多
对于Redis的读写, 对于大部分数据库来说, 插入行操作的执行速度非常快( 插入行只会在硬盘文件末尾进行写入 ). 不过,对于表里面进行的更新却是一个速度相当慢的操作, 因为这种跟新除了会引起一次随机读( random read )之外, 还可能会引起一次随机写( random write ). 而在Redis里面,用户可以直接使用原子的(atomic)INCR命令及其变种来计算聚合数据, 并且因为Redis将数据存储在内存里面, 而且发送给Redis的命令请求不需要经过典型的查询分析器(parser)或者查询优化器(optimizer)进行处理, 所以对Redis存储的数据执行随机写的速度总是非常迅速的.
使用Redis而不是关系型数据库或者其他硬盘存储数据可, 可以避免写入不必要的临时数据, 也免去了对临时数据进行扫描或者删除的麻烦,并最终改善程序的性能.
 
 
 
posted @ 2022-11-10 16:31  茄子777  阅读(274)  评论(0)    收藏  举报