Redis教程

Redis总结

本文主要是介绍Redis总结,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Redis总结

  • 一、使用场景
  • 二、redis数据类型
  • 三、redis持久化方案
    • 3.1、RDB模式(默认)
    • 3.2、AOF模式
  • 四、缓存穿透怎么办
    • 4.1、问题描述
    • 4.2、问题解决方案
  • 五、redis集群
    • 5.1、redis单机版
    • 5.2、读写分离方案
  • 5.3、哨兵模式
    • 5.4、Redis内置集群
    • 5.5、TwemProxy集群方案
    • 六、总结:

一、使用场景

一般用作分布式缓存使用, 作为数据库和项目之间的桥梁, redis主要用内存存储数据, 速度非常快, 所以经常大量查询的数据可以放入redis中, 这样可以替关系型数据库抗高并发读取操作.

二、redis数据类型

redis中支持五种数据类型:
redis里面的数据都是键值对形式也就是key, 和value形式, value有如下五种数据类型
字符串:
就是普通的字符串可以作为redis中value的值
例如: “xxxxx”: “123123123adf”
List:
有序集合, 里面的数据可以重复
例如:“xxxxxx”: ​
1
2
3

Hash类型:
也是key, value键值对形式, key不可以重复, value可以重复
例如: “xxxxxxxx”:
​ 1 : adsf
​ xx : sdfsdf

Set类型:
无序集合, 里面的数据不可以重复
例如: “xxxxxx”:
​ 3
​ 1

ZSet类型:
无序集合, 但是可以按照score分数进行排序, 里面的数据不可以重复
例如: “xxxxxx”:
分数 3
分数 1

三种特殊数据类型

Geospatial 地理位置 找附近的人

Hyperloglog 基数统计的算法

  • 什么是基础:不重复的元素

Bitmaps 位存储

  • 统计信息,活跃、不活跃、登录、未登录打卡,Bitmaps位图,数据结构,都是操作二进制来进行记录,就只有0和1两个状态

三、redis持久化方案

redis中持久化方案一共有两种,
一种叫做RDB模式,
一种叫做AOF模式

3.1、RDB模式(默认)

使用场景:
RDB模式是redis中默认的持久化模式, 叫做分时持久化, 可以在配置文件中配置持久化时间, 和持久化时间的频率. 一般如果redis做分布式缓存使用, 不怕丢数据, 可以用这种持久化方案
优点:
速度快, 节省资源
缺点:
如果服务器突然断电, 那么没有来得及持久化的数据将会丢失.

3.2、AOF模式

使用场景:
拿redis作为主存储使用, 别的地方没有备份的数据. 可以使用这种模式, 这种模式叫做实时持久化, 也就是数据存入redis后, 立即存储到硬盘中.
优点:
基本不会出现丢失数据情况
缺点:
由于频繁的硬盘IO持久化数据操作, 会拖慢redis的速度

四、缓存穿透怎么办

4.1、问题描述

正常访问流程
如果我们高并发查询, 首先到redis中查询, 如果redis中有数据直接返回结果.

如果redis中没有数据, 则到mysql数据库中查询, 如果查询到了, 将查询到的数据存入redis中一份, 然后再将数据返回给客户

下载再查询这样的数据, 由于redis中已经存在, 则直接返回数据, 不会去查询数据库, 降低了数据库的高并发访问压力

异常流程

客户高并发查询, 首先访问redis, redis中没有数据, 查询mysql数据库, mysql数据库中也查询不到数据

如果是同样的这种方式查询, 也就是相当于查询操作, 通过了redis, 并且访问了mysql数据库, mysql数据库无法抗住这样的高并发压力, 会造成mysql服务器宕机, 这就是著名的缓存穿透问题.

4.2、问题解决方案

缓存预热流程解决方案

将数据存入redis, 和读取流程分开

也就是管理员将数据从mysql中查询到, 存入redis中

消费者访问查询的时候, 只查询redis, 如果redis中没有数据则返回null

隆过滤器

布隆过滤器其实就是利用了一致性hash算法, 使用算法的特点, 将数据均匀分布, 还有利用了概率学的原理, 用算法判断数据是否存在, 如果存在就去查询, 如果不存在就直接返回null.避免了数据不存在还去访问mysql数据库.

五、redis集群

5.1、redis单机版

使用场景:
传统项目企业公司, 一般做oa, erp, 电子政务系统, 比如政府项目等
数据量和并发量不高的情况下使用

优点:
简单, 省服务器

缺点:
无法抗高并发, 大数据量, 没有灾备方案

5.2、读写分离方案

描述:
一台主机, 多台备机, 主机只允许写入, 不允许人为读取, 备机只允许读取操作, 不允许人为写入操作, 写入只能往主机中写入数据, 主机会将数据自动同步到备机中

使用场景:
中小型规格的互联网公司, 并发量不是特别大的情况下使用, 主要是读一定要远远大于写入操作量使用

优点:
部署相对简单, 大大提高并发读取操作量

缺点:
灾备方案不完整, 一旦主机挂掉, 整个集群将只能读取, 不允许写入.

5.3、哨兵模式

描述:

	1. 一台主机, 多台备机, 还有一个sentinel哨兵服务器
	2. 哨兵服务器连接所有redis主机和备机服务器, 并且对主机进行ping, pong操作, 进行监听
	3. 主机只允许写入, 备机只允许读取, 我们向主机中写入数据, 数据由主机自动同步到备机中
	4. 如果哨兵服务器向主机发送ping命令, 主机没有给哨兵服务器发送pong命令, 一段时间后认为最近死掉, 哨兵服务器会从备机中选出一个作为新的主机, 这种叫做主观下线
	5. 如果哨兵服务器向主机发送ping命令, 主机没有给哨兵服务器发送pong命令, 一段时间后, 主机会问每一个备机, 让备机去ping主机,看主机是否返回pong命令, 如果主机不给备机返回pong命令则认为主机真的死掉, 这时候再选举出一个备机作为新的主机, 这种叫做客观下线.

使用场景:
中小型规模互联网公司使用, 灾备, 读写分离功能都具有, 主要用在读取远远大于写入操作的场景中

优点:
灾备, 自动切换, 主从同步, 大大提高可以抗住的读取并发量

缺点:
不适合用在写入并发高的场景中. 由于客观下线使用了流言传播协议(Gossip), 这个协议会导致有延时.主备机之间切换有一定的延时.

5.4、Redis内置集群

描述:

  1. redis内置集群至少需要6台服务器, 三台主机, 三台备机

  2. 主机和备机之间有心跳检测机制, 备机向主机发送ping命令, 主机返回备机pong命令主机宕机, 备机替代主机工作

  3. 我们读写都只操作主机, 主机会将数据自动同步到备机, 这样主机死掉, 备机中具有主机的全部数据, 防止数据丢失

  4. redis内置集群, 一共最多有0-16383个slot槽位, 我们需要将这些个槽位分配给不同的主机

  5. 我们不管读取还是写入数据, redis集群都会根据key使用CRC16算法, 将key算出来一个纯数字,

  6. 这个crc16算法算出来的数字对16384取膜, 也就是数字对16384做除法取余数, 余数一定是在0-16383范围内. 看这个余数在哪个slot槽范围内, 就去对应的服务器, 读或者写.

使用场景:
大型互联网公司, 对读和写入操作都比较多, 并发高, 数据量大的情况下使用

优点:

  • 灾备(数据不容易丢失, 主机和备机中数据一样),
  • 高可用(主机死了, 备机替代主机工作),
  • 扩展性好(当前集群服务器数量不够, 可以再加)
  • 负载均衡(通过slot槽和crc16算法进行计算, 决定数据存入哪台服务器, 具有天然的负载均衡特性, 可以抗高并发)

缺点:
由于slot槽总数是0-16383所以集群内主机最多允许有16384个服务器, 再多不支持.

5.5、TwemProxy集群方案

使用场景:

这种方案是Twitter公司的redis集群方案, 也是Twitter推出并且开源免费的技术
国内知乎使用的也是这个技术方案

描述:

	1. 在这种方案中, 一共有2^32次方个桶的空间,也就是有0~(2^32)-1 = 4,294,967,296的数字空间.
	2. 将这些数字空间均匀分配到hash环中
	3. redis服务器的ip地址使用hash算法进行计算会得出一个数字, 这个数字看在桶空间的那个位置, 那么这台服务器就处于这个桶空间的位置.
	4. 如果我们存取数据, twemproxy代理服务器会使用hash算法对key进行计算, 算出的这个数字, 看在hash环中的哪个位置, 按照顺时针方向, 找到最近的一台redis服务器进行存取.

优点:

使用的服务器至少3台, twemproxy一台, 两台redis服务器. 使用服务器数量较少
由代理服务器控制真实的redis服务器, 所以部署简单
具有负载均衡功能, 可以抗高并发大数据量的读写
扩展比较容易, 只需要在twemproxy代理服务器的配置文件中更改配置即可

缺点:

高可用不太好, 容易出现一台redis服务器宕机, 那么里面的数据将会丢失.

六、总结:

单机版方案:

适合读取和写入并发量不高的情况下使用, 一些做传统项目的公司使用

读写分离方案:

可以抗高并发读取, 无法抗高并发写入, 小公司使用

哨兵模式方案:

高可用, 可以抗高并发读取, 无法抗高并发写入. 小公司使用

redis内置集群:

高可用, 负载均衡, 可扩展, 灾备. 适合大型互联网公司使用, 可以抗高并发读写

不怕数据丢失, 但是使用的服务器数量比较多, 拿redis作为主要存储服务器使用.

twemproxy集群方案(主流集群方案):

负载均衡, 可扩展, 适合大型互联网公司使用, 可以抗高并发读写

怕数据丢失, 所以如果使用redis作为分布式缓存使用, 使用这种方案

这篇关于Redis总结的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!