余晖落尽暮晚霞,黄昏迟暮远山寻
本站
当前位置:网站首页 > 编程知识 > 正文

springboot整合Redis、mongodb

xiyangw 2023-05-13 15:50 15 浏览 0 评论


一. springboot整合Redis

springboot整合Redis、mongodb

1.1 Nosql回顾

而传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,例如:

p1

1.2 NoSQL的类别

1.2.1键值(Key-Value)存储数据库

1.2.2 列存储数据库

NoSQL,泛指非关系型的数据库,NoSQL即Not-Only SQL,它可以作为关系型数据库的良好补充。随着互联

网web2.0网站的兴起,非关系型的数据库现在成了一个极其热门的新领域,非关系数据库产品的发展非常迅

1、High performance - 对数据库高并发读写的需求

web2.0网站要根据用户个性化信息来实时生成动态页面和提供动态信息,所以基本上无法使用动态页面静态

化技术,因此数据库并发负载非常高,往往要达到每秒上万次读写请求。关系数据库应付上万次SQL查询还勉

强顶得住,但是应付上万次SQL写数据请求,硬盘IO就已经无法承受了。其实对于普通的BBS网站,往往也存

在对高并发写请求的需求,例如网站的实时统计在线用户状态,记录热门帖子的点击次数,投票计数等,因此

这是一个相当普遍的需求。

2、Huge Storage - 对海量数据的高效率存储和访问的需求

类似Facebook,twitter,Friendfeed这样的SNS网站,每天用户产生海量的用户动态,以Friendfeed

为例,一个月就达到了2.5亿条用户动态,对于关系数据库来说,在一张2.5亿条记录的表里面进行SQL查询,

效率是极其低下乃至不可忍受的。再例如大型web网站的用户登录系统,例如腾讯,盛大,动辄数以亿计的帐

号,关系数据库也很难应付。

3、High Scalability && High Availability- 对数据库的高可扩展性和高可用性的需求

在基于web的架构当中,数据库是最难进行横向扩展的,当一个应用系统的用户量和访问量与日俱增的时候,

你的数据库却没有办法像web server和app server那样简单的通过添加更多的硬件和服务节点来扩展性能

和负载能力。对于很多需要提供24小时不间断服务的网站来说,对数据库系统进行升级和扩展是非常痛苦的事

情,往往需要停机维护和数据迁移,为什么数据库不能通过不断的添加服务器节点来实现扩展呢?

NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题

相关产品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB

典型应用: 内容缓存,主要用于处理大量数据的高访问负载。

数据模型: 一系列键值对

优势: 快速查询

劣势: 存储的数据缺少结构化


1.2.3 文档型数据库

1.2.4 图形(Graph)数据库

1.3 Redis简介

相关产品:Cassandra, HBase, Riak

典型应用:分布式的文件系统

数据模型:以列簇式存储,将同一列数据存在一起

优势:查找速度快,可扩展性强,更容易进行分布式扩展

劣势:功能相对局限

相关产品:CouchDB、MongoDB

典型应用:Web应用(与Key-Value类似,Value是结构化的)

数据模型: 一系列键值对

优势:数据结构要求不严格

劣势: 查询性能不高,而且缺乏统一的查询语法

相关数据库:Neo4J、InfoGrid、Infinite Graph

典型应用:社交网络

数据模型:图结构

优势:利用图结构相关算法。

劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。

2008年,意大利的一家创业公司Merzia推出了一款基于MySQL的网站实时统计系统LLOOGG,然而没过多久

该公司的创始人 Salvatore Sanfilippo便对MySQL的性能感到失望,于是他决定亲自为LLOOGG量身定做

一个数据库,并于2009年开发完成,这个数据库就是Redis。不过Salvatore Sanfilippo并不满足只将

Redis用于LLOOGG这一款产品,而是希望更多的人使用它,于是在同一年Salvatore Sanfilippo将

Redis开源发布,并开始和Redis的另一名主要的代码贡献者Pieter Noordhuis一起继续着Redis的开

发,直到今天。

Salvatore Sanfilippo自己也没有想到,短短的几年时间,Redis就拥有了庞大的用户群体。Hacker

News在2012年发布了一份数据库的使用情况调查,结果显示有近12%的公司在使用Redis。国内如新浪微

博、街旁网、知乎网,国外如GitHub、Stack Overflow、Flickr等都是Redis的用户。

VMware公司从2010年开始赞助Redis的开发, Salvatore Sanfilippo和Pieter Noordhuis也分别在

3月和5月加入VMware,全职开发Redis。

Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库。它通过提供多种键值数据类型来适

应不同场景下的存储需求,目前为止Redis支持的键值数据类型如下:

字符串类型

散列类型

列表类型

集合类型

有序集合类型


1.4 Redis的应用场景

1.5 Redis优缺点

1.5.1 Redis 优势

1.5.2 Redis 缺点

1.6 Redis面向互联网的解决方案

1.7 springboot整合redis

简单使用缓存的方式:

第一步:导入包

Redis 与其他 key - value 缓存产品有以下三个特点:

- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。

- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存

储。

- Redis支持数据的备份,即master-slave模式的数据备份。

Redis 提供的API支持:C、C++、C#、Clojure、Java、JavaScript、Lua、PHP、Python、

Ruby、Go、Scala、Perl等多种语言。

目前全球最大的Redis用户是新浪微博,在新浪有200多台物理机,400多个端口正在运行Redis,有+4G的数

据在Redis上来为微博用户提供服务

- 取最新的N个数据(取最新文档、排行榜等)

- 需要精确设定过期时间的应用

- 计数器应用

- 实时性要求的高并发读写

- 消息系统Pub/Sub

- 构建队列

- 缓存

对数据高并发读写(基于内存)

对海量数据的高效率存储和访问(基于内存)

对数据的可扩展性和高可用性

垂直扩展:提升硬件

水平扩展:集群

redis(ACID处理非常简单)无法做到太复杂的关系数据库模型

- 主从:一主多从,主机可写,从机备份。类似于Mysql的读写分离,存在问题是一但主节点down掉,整个

Redis不可用。

- 哨兵(2.x):启用一个哨兵程序(节点),监控其余节点的状态,根据选举策略,进行主从切换。

缺点:每个节点的数据依旧是一致的,仍无法实现分布式的数据库。

- 集群(3.x):结合上述两种模式,多主多从,实现高可用、分布式数据存储


第二步:在 application.properties 中的配置

第三步:配置代码的编写

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-data-redis</artifactId>

</dependency>

# Redis数据库索引(默认为0)

spring.redis.database=0

# Redis服务器地址

spring.redis.host=127.0.0.1

# Redis服务器连接端口

spring.redis.port=6379

# 连接池最大连接数(使用负值表示没有限制)

spring.redis.pool.max-active=8

# 连接池最大阻塞等待时间(使用负值表示没有限制)

spring.redis.pool.max-wait=-1

# 连接池中的最大空闲连接

spring.redis.pool.max-idle=8

# 连接池中的最小空闲连接

spring.redis.pool.min-idle=0

# 连接超时时间(毫秒)

spring.redis.timeout=0

@Configuration

@EnableCaching

public class CacheConfig extends CachingConfigurerSupport {

@Bean

public CacheManager cacheManager(RedisTemplate redisTemplate) {

RedisCacheManager rcm = new RedisCacheManager(redisTemplate);

// 多个缓存的名称,目前只定义了一个

rcm.setCacheNames(Arrays.asList("thisredis"));

//设置缓存过期时间(秒)

rcm.setDefaultExpiration(600);

return rcm;

}

@Bean

public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory

factory) {

StringRedisTemplate template = new StringRedisTemplate(factory);

Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new

Jackson2JsonRedisSerializer(Object.class);

ObjectMapper om = new ObjectMapper();

om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);

om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

jackson2JsonRedisSerializer.setObjectMapper(om);

template.setValueSerializer(jackson2JsonRedisSerializer);

template.afterPropertiesSet();

return template;


第四步:测试代码的编写:

二. springboot整合mongoDB

2.1 mongoDB简介

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。

在高负载的情况下,添加更多的节点,可以保证服务器性能。

MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。

MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

特点:

MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易。你可以在MongoDB记录中设置任何属性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")来实现更快的排序。你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。

}

}

@Service

public class UserService {

@Cacheable(value = "thisredis", key = "'users_'+#id")

public Users findUser(Integer id){

Users users = new Users();

users.setUsername("zhangsan");

users.setPassword("123456");

users.setId(id);

System.out.println("测试是否使用缓存");

return users;

}

@CacheEvict(value="thisredis", key="'users_'+#id",condition="#id!=1")

public void deleteUser(Integer id){

System.out.println("删除user==id:" + id);

}

}

@RunWith(SpringRunner.class)

@SpringBootTest

public class DemoApplicationTests {

@Resource

private UserService userService;

@Test

public void contextLoads() {

// 查看

System.out.println(userService.findUser(2));

// 删除

// userService.deleteUser(2);

}

}


比较指标

MongoDB(v2.4.9) Redis(v2.4.17) 比较说明

实现语言

c++ c/c++ -

协议

BSON,自定义二进制

类telnet -

性能

依赖内存,TPS较高 依赖内存,TPS非常高 Redis优于MongoDB

可操作性

丰富的数据表达,索引;最类似于关系型数据库,支持丰富的查询语句

数据丰富,较少的IO MongoDB优于Redis

如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。MongoDB安装简单。

#####2.2 mongoDB与Redis的区别

MongoDB和Redis都是NoSQL,采用结构型数据存储。二者在使用场景中,存在一定的区别,这也主要由于二者在内存映射的处理过程,持久化的处理方法不同。

MongoDB建议集群部署,更多的考虑到集群方案,Redis更偏重于进程顺序写入,虽然支持集群,也仅限于主-从模式。


比较指标

MongoDB(v2.4.9) Redis(v2.4.17) 比较说明

内存及存储

适合大数据量存储,依赖系统虚拟内存,采用镜像文件存储;内存占用率比较高,官方建议独立部署在64位系统

Redis2.0后支持虚拟内存特性(VM) 突破物理内存限制;数据可以设置时效性,类似于memcache

不同的应用场景,各有千秋

可用性

支持master-slave,replicatset(内部采用paxos选举算法,自动故障恢复),auto sharding机制,对客户端屏蔽了故障转移和切片机制

依赖客户端来实现分布式读写;主从复制时,每次从节点重新连接主节点都要依赖整个快照,无增量复制;不支持autosharding,需要依赖程序设定一致性hash机制

MongoDB优于Redis;单点问题上,MongoDB应用简单,相对用户透明,Redis比较复杂,需要客户端主动解决.(MongoDB一般使用replicasets和sharding相结合,replicasets侧重高可用性以及高可靠,sharding侧重性能,水平扩展)

可靠性

从1.8版本后,采用binlog方式(类似Mysql) 支持持久化

依赖快照进行持久化;AOF增强可靠性;增强性的同时,影响访问性能

一致性

不支持事务,靠客户端保证

支持事务,比较脆,仅能保证事务中的操作按顺序执行

Redis优于MongoDB

数据分析

内置数据分析功能(mapreduce)

不支持 MongoDB优于Redis

应用场景

海量数据的访问效率提升

较小数据量的性能和运算

MongoDB优于Redis

#####2.3 mongoDB基本操作

// 查看所有数据库

show dbs

// 创建数据库

use DATABASE_NAME

// 查看当前数据

db

// 删除当前数据库(先切换,再删除)

use DATABASE_NAME

db.dropDatabase()

// 创建集合(也可以直接插入值的时候自动创建)

db.createCollection(name, options)

// 查看集合

show collections

// 删除集合


2.4 springboot整合mongoDB

第一步:配置

第二步:代码编写

db.collection.drop()

// 插入数据

db.COLLECTION_NAME.insert(document)

// 更新数据

db.collection.update(

<query>,

<update>,

{

upsert: <boolean>,

multi: <boolean>,

writeConcern: <document>

}

)

// 例如:db.test.update({'title':'MongoDB测试'},{$set:{'title':'Test'}},

{multi:true})

// 删除数据

db.collection.remove(

<query>,

{

justOne: <boolean>,

writeConcern: <document>

}

)

// 注意:条件为空意味着全部删除,例如:db.test.remove({})

// 查询

db.collection.find(query, projection)

db.collection.findOne(query, projection)

// 例如:db.test.find({"num": {$gt:50}, $or: [{"author": "千锋"},{"title":

"springboot整合mongoDB"}]}).pretty()

// 分页

db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

// 排序

db.COLLECTION_NAME.find().sort({KEY:1}) // db.col.find({},

{"title":1,_id:0}).sort({"num":-1})

spring.data.mongodb.uri=mongodb://localhost:27017/student

#spring.data.mongodb.uri=mongodb://name:pass@localhost:27017/test,其中name是用户

名,pass是密码

#如果要配置多个数据库,则中间用","分割,例如

spring.data.mongodb.uri=mongodb://192.168.1.1:20000,192.168.1.2:20000,192.168.25

2.12:20000/test

@Repository

public class StudentDAO {

@Resource

private MongoTemplate mongoTemplate;

/**

* 添加

*/

public void save(Student student){


mongoTemplate.save(student);

}

/**

* 查询所有

*/

public List<Student> findAll(){

return mongoTemplate.findAll(Student.class);

}

/**

* 查询ID

*/

public Student findById(String id){

return mongoTemplate.findById(id, Student.class);

}

/**

* 条件查询

*/

public List<Student> findByName(String name){

Query query = new Query(Criteria.where("name").is(name));

return mongoTemplate.find(query, Student.class);

}

/**

* 修改

*/

public void update(Student student) {

Query query=new Query(Criteria.where("id").is(student.getId()));

Update update= new Update().set("name", student.getName()).set("sex",

student.getSex());

//更新查询返回结果集的第一条

mongoTemplate.updateFirst(query,update,Student.class);

//更新查询返回结果集的所有

// mongoTemplate.updateMulti(query,update,TestEntity.class);

}

/**

* 删除

*/

public void delete(Integer id) {

Query query=new Query(Criteria.where("id").is(id));

mongoTemplate.remove(query,Student.class);

}

}

相关推荐

辞旧迎新,新手使用Containerd时的几点须知

相信大家在2020年岁末都被Kubernetes即将抛弃Docker的消息刷屏了。事实上作为接替Docker运行时的Containerd在早在Kubernetes1.7时就能直接与Kubelet集成使...

分布式日志系统ELK+skywalking分布式链路完整搭建流程

开头在分布式系统中,日志跟踪是一件很令程序员头疼的问题,在遇到生产问题时,如果是多节点需要打开多节点服务器去跟踪问题,如果下游也是多节点且调用多个服务,那就更麻烦,再者,如果没有分布式链路,在生产日志...

Linux用户和用户组管理

1、用户账户概述-AAA介绍AAA指的是Authentication、Authorization、Accounting,即认证、授权和审计。?认证:验证用户是否可以获得权限,是3A的第一步,即验证身份...

linux查看最后N条日志

其实很简单,只需要用到tail这个命令tail-100catalina.out输入以上命令,就能列出catalina.out的最后100行。...

解决linux系统日志时间错误的问题

今天发现一台虚拟机下的系统日志:/var/log/messages,文件时间戳不对,跟正常时间差了12个小时。按网上说的执行了servicersyslogrestart重启syslog服务,还是不...

全程软件测试(六十二):软件测试工作如何运用Linux—读书笔记

从事过软件测试的小伙们就会明白会使用Linux是多么重要的一件事,工作时需要用到,面试时会被问到,简历中需要写到。对于软件测试人员来说,不需要你多么熟练使用Linux所有命令,也不需要你对Linux...

Linux运维之为Nginx添加错误日志(error_log)配置

Nginx错误日志信息介绍配置记录Nginx的错误信息是调试Nginx服务的重要手段,属于核心功能模块(nginx_core_module)的参数,该参数名字为error_log,可以放在不同的虚机主...

Linux使用swatchdog实时监控日志文件的变化

1.前言本教程主要讲解在Linux系统中如何使用swatchdog实时监控日志文件的变化。swatchdog(SimpleWATCHDOG)是一个简单的Perl脚本,用于监视类Unix系统(比如...

syslog服务详解

背景:需求来自于一个客户想将服务器的日志转发到自己的日志服务器上,所以希望我们能提供这个转发的功能,同时还要满足syslog协议。1什么是syslog服务1.1syslog标准协议如下图这里的fa...

linux日志文件的管理、备份及日志服务器的搭建

日志文件存放目录:/var/log[root@xinglog]#cd/var/log[root@xinglog]#lsmessages:系统日志secure:登录日志———————————...

运维之日志管理简介

日志简介在运维过程中,日志是必不可少的东西,通过日志可以快速发现问题所在。日志分类日志分类,对不同的日志进行不同维度的分析。操作系统日志操作系统是基础,应用都是在其之上;操作系统日志的分析,可以反馈出...

Apache Log4j 爆核弹级漏洞,Spring Boot 默认日志框架就能完美躲过

这两天沸沸扬扬的Log4j2漏洞门事件炒得热火朝天:突发!ApacheLog4j2报核弹级漏洞。。赶紧修复!!|Java技术栈|Java|SpringBoot|Spring...

Linux服务器存在大量log日志,如何快速定位错误?

来源:blog.csdn.net/nan1996jiang/articlep/details/109550303针对大量log日志快速定位错误地方tail/head简单命令使用:附加针对大量log日志...

Linux中查看日志文件的正确姿势,求你别tail走天下了!

作为一个后端开发工程师,在Linux中查看查看文件内容是基本操作了。尤其是通常要分析日志文件排查问题,那么我们应该如何正确打开日志文件呢?对于我这种小菜鸡来说,第一反应就是cat,tail,vi(或...

分享几款常用的付费日志系统,献给迷茫的你!

概述在前一篇文章中,我们分享了几款免费的日志服务器。他们各有各的特点,但是大家有不同的需求,有时免费的服务器不能满足大家的需要,下面推荐几款付费的日志服务器。1.Nagios日志服务器Nagio...

取消回复欢迎 发表评论: