redis分布式

Session机制详解及分布式中Session共享解决方案

旧巷老猫 提交于 2019-12-03 08:54:49
一、为什么要产生Session   http协议本身是无状态的,客户端只需要向服务器请求下载内容,客户端和服务器都不记录彼此的历史信息,每一次请求都是独立的。   为什么是无状态的呢?因为浏览器与服务器是使用socke套接字进行通信,服务器将请求结果返回给浏览器之后,会关闭当前的socket链接,而且服务器也会在处理页面完毕之后销毁页面对象。   然而在Web应用的很多场景下需要维护用户状态才能正常工作(是否登录等),或者说提供便捷(记住密码,浏览历史等),状态的保持就是一个很重要的功能。因此在web应用开发里就出现了保持http链接状态的技术:一个是cookie技术,另一种是session技术。 二、Session有什么作用,如何产生并发挥作用   要明白Session就必须要弄明白什么是Cookie,以及Cookie和Session的关系。   1、什么是Cookie   Cookie技术是http状态保持在客户端的解决方案,Cookie就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息。   2、Cookie的产生   当用户首次使用浏览器访问一个支持Cookie的网站的时候,用户会提供包括用户名在内的个人信息并且提交至服务器;接着,服务器在向客户端回传相应的超文本的同时也会发回这些个人信息

redis入门(二)(转载)

佐手、 提交于 2019-12-03 07:25:44
目录 redis入门(二) 前言 持久化 RDB AOF 持久化文件加载 高可用 哨兵 流程 安装部署 配置技巧 集群 原理 集群搭建 参考文档 redis入门(二) 前言 在 redis 入门(一)简单介绍了redis的历史和安装部署,以及基本的数据结构和api,本节讲解redis持久化、高可用、redis集群和分布式相关的知识。 持久化 redis作为内存 数据库 ,数据全部存储到内存中。但是若出现断电等原因会造成数据丢失。redis内置了2种持久化的方式,分别为RDB持久化和AOF持久化。 RDB RDB持久化是把当前进程数据生成快照保存到硬盘的过程,换句话来说是将当前redis内存中的数据全部保存到硬盘。触发RDB持久化过程分为手动触发和自动触发。 手动触发 可以通过 save 和 bgsave 两个命令手动执行保存RDB快照。 save 命令:会阻塞当前redis主进程,直到RDB保存完成,save命令已经弃用,不建议生产环境使用。 bgsave 命令:redis进程会执行fork操作创建进程执行保存RDB快照。只有在fork子进程才会短时间阻塞。建议大家都是用 bgsave 命令保存RDB快照。目前redis内部所有RDB操作都使用 bgsave 命令 127.0.0.1:26379> save OK 127.0.0.1:26379> bgsave Background

分布式cookie-session的实现(spring-session)

房东的猫 提交于 2019-12-03 07:05:29
1 session存储策略 存储,即在后台使用session的setAttribute,getAttribute等方法时,这些内部存放的数据最终存储至什么位置。比如在默认的tomcat实现中,相应的数据即存储在内存中,并在停止之后会序列化至磁盘中。 可以使用内存存储和第三方存储,如redis。对于集群式的session存储,那么肯定会使用第三方存储的实现。 在spring-session中,对session存储单独作了一个定义,但定义上基本保证与http session一致,主要的目的在于它可以支持在非http的环境中模拟使用。因此不直接使用http session接口。 先看定义: public interface Session { /** 获取惟一的id,可以理解为即将每个session当作一个实体对象 */ String getId(); <T> T getAttribute(String attributeName); Set<String> getAttributeNames(); void setAttribute(String attributeName, Object attributeValue); void removeAttribute(String attributeName); } 从这个定义来看,如果要使用httpSession

redis入门(二)

不羁岁月 提交于 2019-12-03 06:55:47
目录 redis入门(二) 前言 持久化 RDB AOF 持久化文件加载 高可用 哨兵 流程 安装部署 配置技巧 集群 原理 集群搭建 参考文档 redis入门(二) 前言 在 redis入门(一) 简单介绍了redis的历史和安装部署,以及基本的数据结构和api,本节讲解redis持久化、高可用、redis集群和分布式相关的知识。 持久化 redis作为内存数据库,数据全部存储到内存中。但是若出现断电等原因会造成数据丢失。redis内置了2种持久化的方式,分别为RDB持久化和AOF持久化。 RDB RDB持久化是把当前进程数据生成快照保存到硬盘的过程,换句话来说是将当前redis内存中的数据全部保存到硬盘。触发RDB持久化过程分为手动触发和自动触发。 手动触发 可以通过 save 和 bgsave 两个命令手动执行保存RDB快照。 save 命令:会阻塞当前redis主进程,直到RDB保存完成,save命令已经弃用,不建议生产环境使用。 bgsave 命令:redis进程会执行fork操作创建进程执行保存RDB快照。只有在fork子进程才会短时间阻塞。建议大家都是用 bgsave 命令保存RDB快照。目前redis内部所有RDB操作都使用 bgsave 命令 127.0.0.1:26379> save OK 127.0.0.1:26379> bgsave Background

Redis_缓存穿透、缓存击穿、缓存雪崩

回眸只為那壹抹淺笑 提交于 2019-12-03 04:58:43
一、缓存处理流程 前台请求,后台先从缓存中取数据,取到直接返回结果,取不到时从数据库中取,数据库取到更新缓存,并返回结果,数据库也没取到,那直接返回空结果。 二、缓存穿透 描述: 缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。 解决方案: 接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截; 从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击 三、缓存击穿 描述: 缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力 解决方案: 设置热点数据永远不过期。 加互斥锁,互斥锁参考代码如下: 说明: 1)缓存中有数据,直接走上述代码13行后就返回结果了 2)缓存中没有数据,第1个进入的线程,获取锁并从数据库去取数据,没释放锁之前,其他并行进入的线程会等待100ms,再重新去缓存取数据。这样就防止都去数据库重复取数据,重复往缓存中更新数据情况出现。 3)当然这是简化处理

搭建基于docker 的redis分布式集群在docker for windows

家住魔仙堡 提交于 2019-12-03 04:46:12
https://blog.csdn.net/xielinrui123/article/details/85104446 首先在docker中下载使用 docker pull redis:3.0.7 docker pull ruby 1 2 分别下载redis的3.0.7版本和ruby。之所以用3.0.7版本的redis是因为ruby的redis插件没有最新版本的,如果安装最新版本的redis会导致redis.x.x.x.gem和redis版本不一致而产生问题。所以将就选择3.0.7吧。你可以去gem的官网上面看看最新版的gem对应的redis是多少版本了,然后再下载最新的即可,我这里就用3.0.7版本。gem是ruby的包管理软件,就跟php的Composer,linux的yum一样。 然后,在本地电脑上面也下载和docker中相同版本的redis,取出redis.conf文件,在你的工作路径上面创建一个文件夹,随便命名就可以了,然后在里面放入复制的redis.conf。为了使redis支持分布式,打开cluster配置。 保存后,在当前文件夹中创建Dockerfile文件,简单的说,Dockerfile文件就是在容器外面定义了将要在容器里面执行的操作。这些操作实际上也可以自己在容器中进行创建。Dockerfile文件的内容如下: FROM redis:5.0.3 EXPOSE

Redis Sentinel 高可用部署实践集群

。_饼干妹妹 提交于 2019-12-03 04:40:12
一、Redis Sentinel 介绍 1、Sentinel 数据库环境搭建,从单机版到主备、再到多数据库集群,我们需要一个高可用的监控;比如Mysql中,我们可能会采用MHA来搭建我们的高可用数据库服务; 目前很多项目都用到了redis,比如我们采用1+2的模式,也就是一主两从;我们设置Redis主从复制,将主节点数据同步给从节点,从而达到: 1、主机异常宕机,从节点作为主节点顶上来,让服务正常运行,给运维留足时间; 2、采用读写分离,分担主节点的读压力; 那么Redis 怎么解决主节点宕机,从节点晋升成主节点,同时需要修改应用方的主节点地址,并且让所有从节点去复制新的主节点,整个过程不需要人工干预的问题? Redis官方给出了解决方案,就是使用Sentinel来动态监控redis节点,并组建高可用方案。 2、Redis Sentinel的高可用 Redis Sentinel是一个分布式架构,包含若干个Sentinel节点和Redis数据节点,每个Sentinel节点会对数据节点和其余Sentinel节点进行监控,当发现节点不可达时,会对节点做下线标识。 如果被标识的是主节点,他还会选择和其他Sentinel节点进行选举,当大多数的Sentinel节点都认为主节点不可达时,他们会重新选举出一个Sentinel节点来完成自动故障转移工作,同时将这个变化通知给Redis应用方。

redis入门(二)

流过昼夜 提交于 2019-12-03 04:26:13
目录 redis入门(二) 前言 持久化 RDB AOF 持久化文件加载 高可用 哨兵 流程 安装部署 配置技巧 集群 原理 集群搭建 参考文档 redis入门(二) 前言 在 redis入门(一) 简单介绍了redis的历史和安装部署,以及基本的数据结构和api,本节讲解redis持久化、高可用、redis集群和分布式相关的知识。 持久化 redis作为内存数据库,数据全部存储到内存中。但是若出现断电等原因会造成数据丢失。redis内置了2种持久化的方式,分别为RDB持久化和AOF持久化。 RDB RDB持久化是把当前进程数据生成快照保存到硬盘的过程,换句话来说是将当前redis内存中的数据全部保存到硬盘。触发RDB持久化过程分为手动触发和自动触发。 手动触发 可以通过 save 和 bgsave 两个命令手动执行保存RDB快照。 save 命令:会阻塞当前redis主进程,直到RDB保存完成,save命令已经弃用,不建议生产环境使用。 bgsave 命令:redis进程会执行fork操作创建进程执行保存RDB快照。只有在fork子进程才会短时间阻塞。建议大家都是用 bgsave 命令保存RDB快照。目前redis内部所有RDB操作都使用 bgsave 命令 127.0.0.1:26379> save OK 127.0.0.1:26379> bgsave Background

.NET CORE 中的缓存使用

泄露秘密 提交于 2019-12-03 04:14:06
1 Net Framewoke的缓存 1.1 System.Web.Caching   System.Web.Caching应该是我们最熟悉的缓存类库了,做ASP.NET开发时用到缓存基本都是使用的这个缓存组件,简单回顾一下用法吧 复制代码 using System.Web; using System.Web.Caching; namespace FrameCache { class Program { static void Main(string[] args) { //1.简单缓存,value可以是任何类型 HttpRuntime.Cache.Insert("mykey", "myvalue"); Console.WriteLine($"Key为mykey的缓存:{HttpRuntime.Cache["mykey"]}"); //2.使用缓存依赖项 string path = Path.Combine(Environment.CurrentDirectory, @"someCacheData.xml"); DataSet ds = new DataSet(); ds.ReadXml(path); if (HttpRuntime.Cache.Get("myxml") == null) { //Dataset添加到缓存 System.Web.HttpRuntime.Cache

SpringBoot:一二级分布式缓存

梦想的初衷 提交于 2019-12-03 04:03:24
前言 缓存系统的用来代替直接访问数据库,用来提升系统性能,减小数据库负载。早期缓存跟系统在一个虚拟机里,这样内存访问,速度最快。 后来应用系统水平扩展,缓存作为一个独立系统存在,如redis,但是每次从缓存获取数据,都还是要通过网络访问才能获取,效率相对于早先从内存里获取,还是不够逆天快。如果一个应用,比如传统的企业应用,一次页面显示,要访问数次redis,那效果就不是特别好,性能不够快不说,还容易使得Reids负载过高,Redis的主机出现各种物理故障。因此,现在有人提出了一二级缓存。即一级缓存跟系统在一个虚拟机内,这样速度最快。二级缓存位于redis里,当一级缓存没有数据的时候,再从redis里获取,并同步到一级缓存里。这跟CPU的一级缓存,二级缓存是一个道理。当然也面对同样的问题。 缓存概念 Cache 通常有如下组件构成 CacheManager:用来创建,管理,管理多个命名唯一的Cache。如可以有组织机构缓存,菜单项的缓存,菜单树的缓存等 Cache:类似Map那样的Key—Value存储结构,Value部分 通常包含了缓存的对象,通过Key来取得缓存对象 缓存项:存放在缓存里的对象,常常需要实现序列化接口,以支持分布式缓存。 Cache存储方式:缓存组件的可以将对象放到内存,也可以是其他缓存服务器,Spring Boot 提供了一个基于ConcurrentMap的缓存