Redis

     简介:

                        Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串哈希表列表集合有序集合位图hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。Redis目前是市面上90%以上的公司都在使用的一个高性能分布式中间件。学好Redis是成为架构师的必修课。 

 

       入坑:建议查看教程:Redis中文网 

       入坑:Redis核心概念:

                 1.一句话总结redis------Redis就是一个进程外的分布式缓存

       入坑:Redis应用场景:

                        1.首先 在集群项目中使用 ,例如电商集群系统;如下图所示

                         

 

 

 

         2.如果是单体系统 如下图所示

                              

 

 

         2.1:查询商品业务流程:客户端请求---》应用服务器----》数据库查询   ——》返回服务器——》客户端

                2.2:首先一个前提:数据文件在数据库系统中存在与服务器磁盘中,而应用服务器中数据常常存储在应用服务器内存中,这就意味着 服务器的并发处理请求能力比数据库处理请求能力要高;大概是 应用                         服务器处理500个  ,数据库可以处理200个,在客户端满载时,数据库压力过大 可能导致宕机等后果

             2.3:任何情况下提升系统性能的第一步就是 使用缓存:如下图,此时可能完全适应500的并发请求,等到并发的需求大于500时 系统内部缓存似乎也土崩瓦解不堪重任,数据库 应用服务器都有可能宕机

                    

 

         2.4:如何解决?如果一台不行 那就再来一台 这就是集群系统产生的原因之一(高并发,高性能 高可用) 如图

                

 

 

                          如上图所示 电商服务器已经集群,但是我们将请求进行了nginx转发,第一次请求时,访问01服务器 数据库回源,缓存本地,第二次同样的请求 访问02服务器 加载服务器缓存 缓存为0 数据回源,加载到内存缓存中,这样缓存命中率只有50%,并且每台服务器保存一份 服务器内存严重浪费,加上数据库回源请求,数据库压力上升,导致查询性能下降。这就是使用集群系统的缺点,当然 我们可以在nginx处做一点配置(使用)Iphase ;

              2.5:如何提升查询性能;

                              他的原因:缓存命中率低 ————》解决 提升命中率,  内存缓存分布在每个系统 我们只需要将 缓存独立在一起这样就可以解决命中率问题;--------------------》使用Redis

    总结:使用redis主要应用在集群系统中,如果使用的是单体系统,就不建议使用Redis,强烈建议使用本地缓存,因为:本地缓存存在本地,性能远远比redis高,使用redis还需要网络IO,即使他的性能很高。

                  linux 安装Redis

        省略

       入坑:Redis通信原理:

      1.redis 建立连接过程 :

                     理解1:

                          1.1 建立redis连接 (多路复用机制,可以理解为订阅发布机制) 

                          1.2:通过socket四层通信进行连接  客户端 发起连接----》发送到链路层  ---》OS---》获取请求----》向Redis发起请求

                          1.4   Redis的异步通信:  为了提升性能 OS会一次性的将请求 推送到 事件处理器   redis会订阅该处理器进行多线程处理  这种模型被称为              epoll模型

                    理解二“

                                       请看下图     

                                   

 

 

 

                          1.5:电商系统和redis连接 靠socket   四层连接 如图

                     

                          1.6:当网络访问层收到请求 通过Os将请求一层一层向上发向Redis    OS 请求 redis  如果是同步请求 每一次请求都会消耗一个线程来建立                连接,如何让一个线程来解决100个请求?看图

                                 

 

 

 

                          1.7:当很多个客户端发起对redis的请求时 ,将所有请求放入到 消息处理器,redis只需要对消息处理器轮询处理 

                       

       

                          1.8:上图解释: 左边部分为OS接受各种来自client的请求,右边为redis从消息收集器轮询处理消息

      总结:1.epoll模型就是 Os+ 队列 的多路复用机制: 多路:多个客户端  ; 复用:一个redis线程和所有客户点交互的过程;

                 2.连接查询 缓存的三件事  :1.建立连接 2.存储数据到本地缓存 3.持久化数据到本地文件(开启新线程)

                 3.reids使用单线程:reids完全基于内存操作,性能足够,若使用多线程 形成线程锁导致性能下降

                 4.redis使用多线程:开启多个线程做不同的事情,而不是开启多个线程干一件事;

       入坑:Redis数据结构原理

          1. 数据为一条商品数据:通过stringset()将数据存到redis内存中,   redis  不支持对象,所以需要jsonconvert(object)

          2.数据为集合的商品数据:通过SetAdd()/SetMembers 存取集合数据;

                            2.1.Q:Redis如何将数据存到set?

           A:通过数组存储数据;通过Hash标识数组元素 ,

                  Q: 如果修改某条数据的某个属性的值怎么办? 使用HashSet存储    

          3.(HashSet)字典 通过 HashSet/HashGet 存取数据,key/Value格式

                

 

                 如何吧数据存入hash?看上图:HashSet(key,value) key被管理 值存到数组

          4.第一个是 数组的key 第二个是 数组的索引key 第三个是值 完全基于内存操作 缺陷是内存不足;

          5.如果要保证 销量表中的 销量 和总量的值 +1 -1 则需要使用事务 保证数据一致性

               

 

 

          6.如果一次性存储多个商品数据以hashset存储 使用CreateBatch()

                   

                 对Redis set进行排序存储 需要在存对象时使用 sortsetAdd()

 

  总结:

          场景1:单个商品的存储

          场景2:多个商品的存储

          场景3:商品字段的更新

          场景4:商品多个字段添加一致性

          场景5:多个商品数据批量添加

          场景7:商品数据如何排序

          场景8:商品数据如何分页

 

      入坑:redis分布式锁:锁住一个进程

   1: 什么是锁:锁就是为了保证数据安全的一种机制; 

                       在我们的系统中常常有线程锁:在一个进程中有多个线程,当一个共享资源同时只允许一个线程访问时就产生了线程锁;

              重点来了:什么又是进程锁?不言而喻 当然是锁住一个进程了 

                 

 

                           以上两个进程同时访问:加上线程锁发现了超卖现象;以为线程锁跨进程 ;如何解决?问题原因是两个线程同时访问了数据库 那我们只需要让一个进程的一                 个线程访问; --------------------分布式锁就能实现这样的需求;

      总结一下:分布式锁的使用场景 主要是在分布式的集群环境中,主要使用再对数据库的update操作;select insert delete不涉及相关问题;

       2:如何封装分布式锁

      入坑:redis哨兵集群:使用Redis主要是在集群系统中使用,除了对业务的分析,我们还要保证redis再系统中的高可用;

         1:保证redis的高可用是业务实现的基础;

                  Redis的集群演变:

            1.1redis集群第一代演变:主从集群:数据写入master master分发到slaver

                

         主从集群的缺陷:master宕机 整个集群不可用

 

          1.2redis集群第二代演变:哨兵集群:数据写入master master分发到slaver sentine监视master 当master宕机,从多个slaver选举一个master 

                 

 

 

             哨兵集群的缺陷:无法解决高并发写/海量数据存储的问题;每个redis实例部署的环境的数据存储磁盘都是有限的; 这就需要扩容;

             高并发写:IOT项目中;场景:要统计一个城市每户用自来水的实时情况;

               1.3redis集群第三代演变:多master集群模式

             

 

          缺陷:比较消耗资源

posted @ 2022-03-31 15:53  三五八团楚云飞  阅读(137)  评论(0)    收藏  举报