使用memcache 和 redis 、 实现session 会话复制和保持

一、NoSQL介绍

NoSQL是对Not Only SQL、非传统关系型数据库的统称

NoSQL一词诞生于1998年,2009年这个词汇再次提出指非关系型、分布式、不提供ACID的数据库设计模式

随着互联网时代的数据爆发时增长、数据库技术发展的日新月异,要适应新的业务需求,大数据技术中的NoSQL也同样重要

NoSQL分类

KV型(key-value):性能好(O1),如redis   memcached(优势:数据的存储和缓存写入内存当中去)

文档数据库(Document):mogodb(索引、分片机制作为导向,所以其很适合关联大数据领域,搜索领域)、CouchDB、ES(分布式、restful风格的搜索和数据分析引擎)

Column Store列存数据库:HBase、Cassandra、大数据领域应用广泛

Graph DB数据库:Neo4j

Time Series(时序数据库):InfluxDB   Prometheus

Memcached

Memcached只支持能序列化的数据类型,不支持持久化,基于key-value的内存缓存系统

memcached虽然没有像redis具有数据持久化功能,但是可以通过做集群同步的方式,让Memcached服务器的数据进行同步,从而实现数据的一致性,即保证各memcached的数据是一样的,即使又任何一台memcached发生故障,只要集群中有一台memcached可用就不会出现数据丢失。当其他mem加入集群,可以从已有的mem中自动获取数据并提供服务。

memcached借助了操作系统的Libevent工具做高效的读写,其支持动I/O。libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理机制封装成统一的调用接口。即使对服务器的连接数量增加,也能发挥高性能。mem适应这个库,可以在Linux、BSD、Solaris等操作系统上发挥其高性能。

memcached支持最大的内存存储对象为1M,redis可达512M(不代表其内存缓存为1M),超过1M的数据可以使用客户端压缩或拆分放到多个KEY中,比较大的数据在进行读取的时候需要消耗的时间比较长,memcached最适合保存用户的session实现session共享

memcached存储数据时,会申请1M的内存,把该内存称为一个slab,也称为一个page

memcached支持多种开发语言,包括JAVA  C  PYTHON   C#  PHP   Ruby  Perl等

相同键值对数据库Redis和Memcached的比较

数据结构:

Redis:哈希、列表、集合、有序集合、消息队列    memcached:纯key-value

是否支持持久化:

        Redis:支持                                  memcached:不支持

是否支持高可用:

        Redis:支持,也支持读写分离、主从复制,官方还有集群管理功能,能实现主从监控、故障转移,无需人工干预。                          memcached:不支持,但可以二次开发。

存储容量:

        Redis:最大512M                          memcached:最大1M

内存分配:

        Redis:临时申请,可能导致碎片    memcached:预分配内存池,节省内存分配时间

单机QPS:

        Redis:10w                          memcached:60w

memcached工作机制

①:Memcached内存分配机制

      应用程序运行时需要使用内存存储数据,但是对于一个缓存系统来说,申请内存、释放内存将十分频繁,非常容易导致大量的内存碎片,最后导致无连续内存可用。

      memcached采用了slab Allocator机制来分配和管理内存。

      Page:分配给slab的内存空间,默认为1M,memcached中存储数据的最大单位。分配后就得到了一个slab,slab分配之后内存按照固定字节大小等分成chunk

      Chunk:内存块,用于缓存记录K/V值的内存空间。Memcached会根据数据大小选择存到哪一个chunk中,假设chunk有128byte、64byte等多种,数据只要100byte存储在128byte中,存在少许浪费。

      chunk最大就是Page的大小,即一个Page中就一个chunk

      Slab Class:Slab按照chunk的大小分组,就组成了不同的Slab Class,diyige Chunk大小为96B的Slab为Class1,Chunk 120B为Class 2,如果有100bytes要存,那么Memcached会选择下图中Slab class 2存储,因为它是120byte的chunk。slab之间的差异可用使用Growth Factor(增长因子)控制,默认为1.25。

 

 

 

②:缓存清理机制

缓存过期并且访问只是才会清理缓存,不会主动清理缓存(懒过期机制)

提取出stats的指标:

memcached安装

1:yum安装

yum -y install memcached

配置文件:/etc/sysconfig/memcached

 

2:memcached简单命令操作

stats    set     add     replace      get       delete

连接测试

Python3连接memcached

apt-get update

apt install python3-pip -y

pip3 install python3-memcached

3:memcache高可用(需要基于第三方解决方案)

memagent高可用    反向代理memcached

二、memcache实现session会话复制和保持

基于集群,将tomcat的会话信息保存至memcached中,可用基于两种模式

sticky模式(tomcat和memcached有关联关系)

 【注】:适用于相对规模小的模式下。

t1 和 m1 在一台机器上 t2 和 m2 在一台机器上 t1 的会话存储在 m2 上 t2 的会话 存储在 m1 上 交叉存储 因为在同一个机器 因此 如果一个机器坏掉 另一个 msm 也会顶上 进行保持会 

non-sticky模式(tomcat和memcached没有关系,tomcat自身不需要存放任何session信息)

SetupAndConfiguration · magro/memcached-session-manager Wiki · GitHub

【注】:kryo版本有严格的要求。 

安装tomcat和memcached

将所有的jar包放置tomcat的库目录,并修改context.xml

启动memcached服务,查看session会话

尝试故障一台memcache,查看会话故障迁移效果。

2:non-sticky模式

会话进行访问 会存储到内存中 自己是异步的 但是这里选择同步 异步就是在空余时 间在复制 这里直接复制到另一个 memcache 中 即使她宕机 另一个机器也能  

tomcat自身不存任何session信息,完全依赖于后端数据库缓存。(其默认做异步,为了数据不丢失,禁止其做异步:sessionbackupasync=false)

 

3:使用Redis实现tomcat的session会话保持

Redis 对会话记录进行管理 当有会话访问以后 会存储到内存中 同时他在异步的情况下 会将会话存储到硬盘中 这里选择的 

基于epel源安装redis

yum -y install redis

更改配置文件:

Home · ran-jit/tomcat-cluster-redis-session-manager Wiki · GitHub

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/593511.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【网络通信】Windows搭建RTMP视频流服务器(含推流/拉流详细教程)

RTMP(Real-Time Messaging Protocol)是一种用于实时流媒体传输的网络协议,主要用于传输音频、视频和数据。RTMP最初是由Adobe Systems公司开发的,用于其Flash平台和Adobe Media Server,但随着技术的发展和开源社区的推…

数据结构学习/复习6---双向链表的实现/随机指针链表练习/顺序表与链表对比/存储体系简述

一、链表的结构*8 二、带头双向循环链表的实现 注意事项1:是否需要断言于实际情况中传来的指针是否可以为空,不可以则要断言 三、链表、指针、拷贝经典练习题 四、顺序表与链表总结对比

通过helm在k8s上安装minio

1 helm安装minio 1.1 下载minio 添加仓库 helm repo add bitnami https://charts.bitnami.com/bitnami 将minio拉取下来 helm pull bitnami/minio --version 版本号 解压到本地开始编辑配置文件 tar -zxf minio-xxx.tgz [rootk8s-master01 minio]# vi values.yaml 1.2…

【C语言】简单有趣的扫雷游戏

**©作者:末央& ©系列:C语言初阶(适合小白入门) ©说明:以凡人之笔墨,书写未来之大梦 目录 一、分析游戏规则二、分文件三、菜单实现四、游戏内容核心实现1.初始化棋盘2.打印棋盘3.布置雷4.排查雷5.game()函数实现调用 五、全部源码 一、分…

二维泊松方程(Neumann+Direchliet边界条件)有限元Matlab编程求解|程序源码+说明文本

专栏导读 作者简介:工学博士,高级工程师,专注于工业软件算法研究本文已收录于专栏:《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现,并提供所有案例完整源码;2.单元…

MySQL索引及优化

MySQL索引及优化 一、MySQL索引1、什么是索引?2、了解过索引的数据结构吗?B树和B树的区别?(底层原理)3、什么是聚簇索引(聚集索引)?什么是非聚簇索引(二级索引&#xff0…

给Ollama套个WebUI,方便使用

Ollama 基本的安装使用参考前文 https://xugaoxiang.com/2024/05/01/ollama-offline-deploy/,前文使用的模型是 llama2,本篇将使用 llama3,因此在启动时,命令是 ollama run llama3。 Ollama Llama3 Llama3 是 Meta 发布的大语言模…

【AI工具声音克隆】——OpenVoice一键部署modelScope一键使用

一、声音/音色克隆简介 声音或音色克隆的原理实现步骤主要基于深度学习技术,特别是语音合成和生成模型。以下是声音/音色克隆的大致实现步骤: 数据收集: 收集语音数据,作为模型的训练样本。数据应尽可能多样化,包括不…

GRU模块:nn.GRU层的输出state与output

在 GRU(Gated Recurrent Unit)中,output 和 state 都是由 GRU 层的循环计算产生的,它们之间有直接的关系。state 实际上是 output 中最后一个时间步的隐藏状态。 GRU 的基本公式 GRU 的核心计算包括更新门(update gat…

[C++基础学习-04]----C++数组详解

前言 在C中,数组是一种用来存储相同类型元素的数据结构。一维数组是最简单的数组形式,它由一系列按顺序存储的元素组成。二维数组则是由一维数组构成的数组,可以看作是一堆一维数组堆叠在一起形成的矩阵。 正文 01-数组简介 一维数组和二维…

库存管理系统开源啦

软件介绍 ModernWMS是一个针对小型物流仓储供应链流程的开源库存管理系统。该系统的开发初衷是为了满足中小型企业在有限IT预算下对仓储管理的需求。通过总结多年ERP系统研发经验,项目团队开发了这套适用于中小型企业的系统,以帮助那些有特定需求的用户。…

计算机毕业设计springboot基于vue电商抢购限时秒杀系统ch0h8

技术栈 ide工具:IDEA 或者eclipse 编程语言: java 数据库: mysql5.7以上版本 可选框架:ssmspringboot都有的 前端:vue.jsElementUI 详细技术:springbootSSMvueMYSQLMAVEN 数据库工具:Navicat/SQLyog都可以 开发工具 Ec…

【iOS】KVC

文章目录 前言一、KVC常用方法二、key与keypath区别key用法keypath用法 三、批量存值操作四、字典与模型相互转化五、KVC底层原理KVC设值底层原理KVC取值底层原理 前言 KVC的全称是Key-Value Coding,翻译成中文叫做键值编码 KVC提供了一种间接访问属性方法或成员变…

基于stm32的USB虚拟U盘+FATFS+W25Q64

基于stm32的USB虚拟U盘FATFSW25Q64 本文目标:基于stm32的USB虚拟U盘FATFSW25Q64 按照本文的描述,简单跑通USB的MSC类来进行简单交互。 先决条件:拥有C语言基础,装有编译和集成的开发环境,比如:Keil uVis…

mysql其它补充

exist和in的区别 exists 用于对外表记录做筛选。 exists 会遍历外表,将外查询表的每一行,代入内查询进行判断。 当 exists 里的条件语句能够返回记录行时,条件就为真,返回外表当前记录。反之如果 exists 里的条件语句不能返回记…

使用python开发的词云图生成器2.0

使用python开发的词云图生成器2.0 更新部分词云图主要三方库工具介绍和效果工具界面: 代码 更新部分 1.支持选择字体; 2.支持选择词云图形状 词云图 词云图啊,简单来说,它可以把文本数据中的高频关键词变成不同大小、颜色的词汇…

一篇文章带你深入了解“指针”

一篇文章带你深入了解“指针” 内存和地址了解指针指针类型const修饰指针指针的运算指针与整数之间的运算指针与指针之间的运算指针的关系运算 void* 指针传值调用和传址调用数组和指针的关系野指针野指针的形成原因规避野指针 二级指针字符指针指针数组数组指针数组传参一维数…

(三)JVM实战——对象的内存布局与执行引擎详解

对象的内存布局 对象的实例化 对象的创建方式 - new的方式 - Class的newInstance():反射的方式 - Construct的newInstance() - clone:实现Cloneable接口,默认浅拷贝 - 使用反序列化:将二进制流转化为内存对象 创建对象的步骤 - 判断对象对应的类是否加载、链接、初…

基础I/O--文件系统

文章目录 回顾C文件接口初步理解文件理解文件使用和并认识系统调用open概述标记位传参理解返回值 closewriteread总结 文件描述符fd0&1&2理解 回顾C文件接口 C代码&#xff1a; #include<stdio.h> int main() { FILE *fpfopen("log.txt",&…

08 - 步骤 表输出

简介 表输出&#xff08;Table Output&#xff09;步骤是用于将 Kettle 中的数据写入关系型数据库表的步骤。它允许用户将数据流中的数据插入、更新或删除到目标数据库表中。 使用 场景 我要将处理完的数据流中的sysOrgCode 跟 plateNumber 保存记录到mysql 1、拖拽表输出…