springboot整合couchbase
couchbase是一个非关系型数据库,它实际上是由couchdb+membase组成,所以它既能像couchdb那样存储json文档,也能像membase那样高速存储键值对。主要有以下几个特点:
速度快
由于是放在内存中的数据库,所有的读写操作都是直接操作内存,因此速度非常快。
高可用
主要从两个方面,一个是它自带集群方案,支持多副本模式,另一个是它自带持久化方案,可以设置定时把数据异步写到文件系统上。
配置使用方便
安装后自带web管理台,可以在管理台上对集群、桶、索引、搜索等进行管理和操作,大量减轻运维的工作,使用简单
最近在做couchbase发现教程很少
1.
Docker部署CouchBase分布式数据库:https://www.cnblogs.com/zhangyunyun/p/12363402.html
2.pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-couchbase</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.0.CR3</version>
</dependency>
</dependencies>
<build>
<finalName>${artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
3.application.properties
server.port=9099
spring.couchbase.bootstrap-hosts=192.168.221.136
spring.couchbase.username=admin
spring.couchbase.password=123456
spring.couchbase.bucket.name=ls
spring.couchbase.bucket.password=123456
spring.data.couchbase.auto-index=true
spring.couchbase.env.timeouts.connect=30000
spring.couchbase.env.timeouts.view=15000
spring.couchbase.env.timeouts.query=15000
logging.level.org.springframework.data=INFO
logging.level.com.couchbase=INFO
logging.level.com.github.corneil=DEBUG
4.CouchbaseConfig.java
@Configuration
@EnableCouchbaseRepositories("com.ls.repositorys")
public class CouchbaseConfig extends AbstractCouchbaseConfiguration {
private final static Logger logger = LoggerFactory.getLogger(CouchbaseConfig.class);
@Value("${spring.couchbase.bootstrap-hosts}")
private String host;
@Value("${spring.couchbase.bucket.password}")
private String password;
@Value("${spring.couchbase.bucket.name}")
private String name;
@Override
protected List<String> getBootstrapHosts() {
logger.info("couchbase.host:" + host);
StringTokenizer tokens = new StringTokenizer(host, ", ");
List<String> hosts = new ArrayList<String>();
while (tokens.hasMoreTokens()) {
hosts.add(tokens.nextToken());
}
return hosts;
}
@Override
public CouchbaseTemplate couchbaseTemplate() throws Exception {
CouchbaseTemplate template = super.couchbaseTemplate();
template.setWriteResultChecking(WriteResultChecking.EXCEPTION);
template.setDefaultConsistency(Consistency.READ_YOUR_OWN_WRITES);
return template;
}
@Override
protected String getBucketName() {
return name;
}
@Override
protected String getBucketPassword() {
return password;
}
@Override
protected CouchbaseEnvironment getEnvironment() {
CouchbaseEnvironment env = DefaultCouchbaseEnvironment.builder()
.connectTimeout(100000) //10000ms = 10s, default is 5s
.build();
return env;
}
@Bean(destroyMethod = "disconnect")
public Cluster cluster() {
// connect to the couchbase-server running on your local machine
return CouchbaseCluster.create(getEnvironment(),getBootstrapHosts());
}
@Bean(destroyMethod = "close")
public Bucket bucket() {
// connect to the bucket named 'default' (which must exist on your Couchbase server)
// every cache related element will use this bucket
return cluster().openBucket(name, password);
}
@Override
public IndexManager indexManager() {
return new IndexManager(true, true, true);
}
}
@N1qlPrimaryIndexed
@ViewIndexed(designDoc = "building")
public interface BuildingRepository extends CouchbasePagingAndSortingRepository<Building, String> {
List<Building> findByCompanyId(String companyId);
Page<Building> findByCompanyIdAndNameLikeOrderByName(String companyId, String name,
Pageable pageable);
@Query("#{#n1ql.selectEntity} where #{#n1ql.filter} and companyId = $1 and $2 within #{#n1ql.bucket}")
Building findByCompanyAndAreaId(String companyId, String areaId);
@Query("#{#n1ql.selectEntity} where #{#n1ql.filter} AND ANY phone IN phoneNumbers SATISFIES phone = $1 END")
List<Building> findByPhoneNumber(String telephoneNumber);
@Query("SELECT COUNT(*) AS count FROM #{#n1ql.bucket} WHERE #{#n1ql.filter} and companyId = $1")
Long countBuildings(String companyId);
Building findBuildingById(String buildingId );
TestController
@Autowired
private BuildingService buildingService;
@GetMapping("/testSave")
public String testSave() {
val building = new Building(BUILDING_1, "couchbase",
COMPANY_2, new ArrayList<>(), new ArrayList<>());
buildingService.save(building);
Building newBuilding = buildingService.findById(BUILDING_1);
return building.toString();
}
更多学习请看官网:https://github.com/spring-projects/spring-data-couchbase
参考:couchbase介绍与实践(一):https://juejin.im/post/5ad53562f265da238b7e7f3c
参考:https://github.com/deniswsrosa/couchbase-spring-data-sample