> 文章列表 > 数据层的解决方案(NOSQL)

数据层的解决方案(NOSQL)

数据层的解决方案(NOSQL)

1.Redis

1.Redis是一款key-value存储结构的内存结构的内存级NoSQL数据库

支持多种数据存储

支持持久化

支持集群

2.服务器的启动命令:

redis-server.exe redis.windows.conf

3.客户端启动命令

redis-cli.exe

4.SpringBoot整合Redis

1.导入相应的依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2.做相应的配置

spring:redis:host: localhostport: 6379client-type: jedis

主机:localhost

默认端口:6379

5.RedisTemplate提供各种数据库存储类型的接口

@SpringBootTest
class Springboot16RedisApplicationTests {@Resourceprivate RedisTemplate redisTemplate;
​@Testvoid set() {//选择操作的数据类型  调用set方法ValueOperations ops = redisTemplate.opsForValue();ops.set(1,"hello");}@Testvoid get() {//选择操作的数据类型  调用set方法ValueOperations ops = redisTemplate.opsForValue();Object o = ops.get(1);System.out.println(o);}
​@Test//通过添加两个键和一个值void hset() {HashOperations hashOperations = redisTemplate.opsForHash();hashOperations.put("key1","a","aaa");}@Testvoid hget() {//选择操作的数据类型  调用set方法HashOperations hashOperations = redisTemplate.opsForHash();Object o = hashOperations.get("key1", "a");System.out.println(o);}
​
}

6.jedis和redis的区别:

1.jedis连接Redis服务器是直连模式当多线程模式下使用jedis会存在线程安全问题,解决方案可以通过配置连接池使每个连接专用,这样整体性能就大受影响。

2.lettcus基于Netty框架进行与Redis服务器连接,底层设计中采用StatefulRedisConnection。 StatefulRedisConnection自身是线程安全的,可以保障并发访问安全问题,所以一个连接可以被多线程复用。当然lettcus也支持多连接实例一起工作。

<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId>
</dependency>
spring:redis:host: localhostport: 6379client-type: jedis

2.Mongodb

MongoDB是一个开源、高性能、无模式的文档型数据库,实际上是指动态类型的模式 ,而不是RDBMS(SQL)数据库中可用的静态类型的模式。

1.导入相应的依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

2.配置客户端

spring:data:mongodb:uri: mongodb://localhost/lin

3.客户端读写

@SpringBootTest
class Springboot17MonogodbApplicationTests {@Resourceprivate MongoTemplate mongoTemplate;@Testvoid contextLoads() {Book book = new Book();book.setId(2);book.setType("111");book.setDescription("111");book.setName("11111");mongoTemplate.save(book);}@Testvoid findAll(){List<Book> all = mongoTemplate.findAll(Book.class);System.out.println(all);}
​
}

4.MongoDB的CRUD

1.基础查询

查询全部:db.集合.find(); 查第一条:db.集合.findOne() 查询指定数量文档:db.集合.find().limit(10) //查10条文档 跳过指定数量文档:db.集合.find().skip(20) //跳过20条文档 统计:db.集合.count() 排序:db.集合.sort({age:1}) //按age升序排序 投影:db.集合名称.find(条件,{name:1,age:1}) //仅保留name与age域

2.条件查询

基本格式:db.集合.find({条件}) 模糊查询:db.集合.find({域名:/正则表达式/}) //等同SQL中的like,比like强大,可以执行正则所有规则 条件比较运算:db.集合.find({域名:{$gt:值}}) //等同SQL中的数值比较操作,例如:name>18 包含查询:db.集合.find({域名:{$in:[值1,值2]}}) //等同于SQL中的in 条件连接查询:db.集合.find({$and:[{条件1},{条件2}]}) //等同于SQL中的and、or

3.ElasticSearch(ES)

ElasticSearch是一个分布式搜索全文搜素引擎

1.elasticsearch的运行elasticsearch.bat

2.创建、查询、删除索引

3.创建索引并指定规则

{"mappings":{"properties":{"id":{"type":"keyword"},"name":{"type":"text","analyzer":"ik_max_word","copy_to":"all"
​},"description":{"type":"text","analyzer":"ik_max_word","copy_to":"all"},"all":{"type":"text","analyzer":"ik_max_word"},"type":{"type":"text"}
​}}
}

4.创建文档

5.查询文档

6.删除文档

 

7.条件查询

 

8.修改文档(全量修改)

PUT http://localhost:9200/books/_doc/1

{ "name":"springboot", "type":"springboot", "description":"springboot" }

9.修改文档(修改部分)

POST http://localhost:9200/books/_update/1

{ "doc":{ "name":"springboot" } }

10.springboot整合es

1.导入相应的依赖

<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>

2.配置

spring:datasource:druid:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/ssm_db?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=trueusername: rootpassword: "123456"
#  elasticsearch:
#    uris: http://localhost:9200
​
​
mybatis-plus:global-config:db-config:table-prefix: tbl_id-type: autoconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

3.相关操作

@SpringBootTest
class Springboot18EsApplicationTests {@Resourceprivate BookDao bookDao;
​private RestHighLevelClient client;//测试启动时执行的方法@BeforeEachvoid setUp() {//创建客户端HttpHost host=HttpHost.create("http://localhost:9200");RestClientBuilder builder= RestClient.builder(host);client = new RestHighLevelClient(builder);}//执行完测试方法之后执行的方法@AfterEachvoid tearDown() throws IOException {client.close();}
​@Testvoid createTestIndex() throws IOException {CreateIndexRequest request=new CreateIndexRequest("books");client.indices().create(request, RequestOptions.DEFAULT);}
​//@Testvoid testCreateIndexByIK() throws IOException {CreateIndexRequest request = new CreateIndexRequest("books");String json = "{\\n" +"    \\"mappings\\":{\\n" +"        \\"properties\\":{\\n" +"            \\"id\\":{\\n" +"                \\"type\\":\\"keyword\\"\\n" +"            },\\n" +"            \\"name\\":{\\n" +"                \\"type\\":\\"text\\",\\n" +"                \\"analyzer\\":\\"ik_max_word\\",\\n" +"                \\"copy_to\\":\\"all\\"\\n" +"\\n" +"            },\\n" +"             \\"description\\":{\\n" +"                \\"type\\":\\"text\\",\\n" +"                \\"analyzer\\":\\"ik_max_word\\",\\n" +"                 \\"copy_to\\":\\"all\\"\\n" +"            },\\n" +"            \\"all\\":{\\n" +"                \\"type\\":\\"text\\",\\n" +"                \\"analyzer\\":\\"ik_max_word\\"\\n" +"            },\\n" +"            \\"type\\":{\\n" +"                \\"type\\":\\"text\\"\\n" +"            }\\n" +"\\n" +"        }\\n" +"    }\\n" +"}";//设置请求中的参数request.source(json, XContentType.JSON);
​client.indices().create(request, RequestOptions.DEFAULT);}//添加文档@Testvoid creatDoc() throws IOException {Book book = bookDao.selectById(2);IndexRequest request=new IndexRequest("books").id(book.getId().toString());String json= JSON.toJSONString(book);request.source(json,XContentType.JSON);client.index(request,RequestOptions.DEFAULT);}
​//所有@Testvoid creatDocAll() throws IOException {List<Book> bookList = bookDao.selectList(null);//创建一个批处理的容器BulkRequest bulkRequest = new BulkRequest();for (Book book : bookList) {IndexRequest request=new IndexRequest("books").id(book.getId().toString());String json= JSON.toJSONString(book);request.source(json,XContentType.JSON);bulkRequest.add(request);}/* IndexRequest request=new IndexRequest("books").id(book.getId().toString());String json= JSON.toJSONString(book);request.source(json,XContentType.JSON);*/client.bulk(bulkRequest,RequestOptions.DEFAULT);}//按id查询文档@Testvoid findById() throws IOException {GetRequest request=new GetRequest("books","2");GetResponse res = client.get(request, RequestOptions.DEFAULT);String sourceAsString = res.getSourceAsString();System.out.println(sourceAsString);}
​//按条件查询@Testvoid findByCondition() throws IOException {SearchRequest request=new SearchRequest("books");
​//添加查询条件SearchSourceBuilder builder=new SearchSourceBuilder();//all中包含了name 和 descriptionSearchSourceBuilder query = builder.query(QueryBuilders.termQuery("all", "spring"));request.source(builder);
​SearchResponse search = client.search(request, RequestOptions.DEFAULT);//拿到所有的命中结果SearchHits hits = search.getHits();for (SearchHit hit : hits) {String sourceAsString = hit.getSourceAsString();System.out.println(sourceAsString);}
​}
}