文章目录
1 redis
1.1 集群
什么是集群:
集群就是 很多服务器组成的一个网络。指的是将多台服务器集中在一起,实现同一业务。
为什么要集群:
一台服务器不能满足开发需要的时候,需要多台服务器来支持。这个时候就需要做集群,但是集群往往伴随着分布式
1.2 分布式
分布式是指将不同的业务分布在不同的地方. web应用和数据库服务分开
2 redis集群方案
- 主从复制
- 优点:
- 处理高并发 完成 主从同步 读写分离 主备切换
- 缺点:
- 服务宕机之后,需要手动启动,会造成一些数据的丢失
- 优点:
- 哨兵模式
- 优点:
- 处理高并发 完成 主从同步 读写分离 主备切换 自动切换
- 缺点:
- 服务里面存储的数据都是一样,占用内存比较大 … 扩容比较麻烦
- 优点:
- redis-cluster(推荐)
- 优点:
- 处理高并发 完成 主从同步 读写分离 主备切换 自动切换, 分布式存储
- 缺点:麻烦一点 扩容还是比较麻烦
- 优点:
3 集群面试题
- 简单说一下你对分布式理解?
- 简单说一下你对集群理解?
- 说一下分布式和集群联系和区别
- redis集群方式有哪些?
- 简单说一下redis-cluster里面槽?
- 槽是存放数据,存放是要通过key计算槽位,选择对应的服务器来存储,获取也是同样的算法.
- 默认16384个槽位要均匀分布到主节点上面
- 为了槽里面数据安全要对主节点进行1-N从节点备份
- 简单说一下redis-cluster里面选举投票机制
- 所有主节点都参与投票,默认半数以上挂点,启动容错机制,提升从节点为主节点.
- 怎么通过命令连接redis集群 redis-cli -c -h -p
- 怎么通过jedis连接集群
Set<HostAndPort> nodes = new HashSet();
nodes.add(new HostAndPort("127.0.0.1", 6379));
nodes.add(new HostAndPort("127.0.0.1", 6380));
nodes.add(new HostAndPort("127.0.0.1", 6381));
nodes.add(new HostAndPort("127.0.0.1", 6382));
nodes.add(new HostAndPort("127.0.0.1", 6383));
nodes.add(new HostAndPort("127.0.0.1", 6384));
JedisCluster cluster = new JedisCluster(nodes);
4 ES
4.1 之前学了一款叫Luence,为什么不直接使用luence?为什么要使用ES?
- Luence 的API操作特别繁琐,用起来不方便,所以我们要学习ElastisSearch,
- 而且ES它支持分布式集群
- 通过发送restfull 风格就可以完成的数据操作
4.2 ES特点
- 分布式的实时文件存储,每个字段都被索引并可被搜索
- 分布式的实时分析搜索引擎
KB-MB-GB-TB-PB
- 可以扩展到上百台服务器,处理PB级结构化或非结构化数据
- 高度集成化的服务,你的应用可以通过简单的 RESTful API、各种语言的客户端甚至命令行与之交互。
- 上手Elasticsearch非常容易
4.3 其他的全文搜索框架
ES和Solr的比较–面试题
- ES 在实时搜索效率要高于solr
- solr它是重量级 用起来做很多配置,但是功能很强大
- 它们都是支持分布式
4.4 ES的操作
GET _search
{
"query": {
"match_all": {}
}
}
## 新增 没有指定id 会自动产生
POST crm/employee
{
"name":"zhangsan123",
"height":"190cm"
}
## 修改
POST crm/employee/1
{
"name":"zhangsan5687",
"height":"190cm"
}
## 新增 必须指定id
PUT crm/employee/1
{
"name":"zhangsan",
"height":"180cm"
}
## 删除
DELETE crm/employee/AW0fdShXJaanHBjeslX6
## 查询 根据id
GET crm/employee/1
GET crm/employee/AW0fdShXJaanHBjeslX6
GET crm/employee/1?pretty
## 控制需要查询字段
GET crm/employee/1?_source=height,name
## 只返回需要的需要 只返回字段信息
GET crm/employee/1/_source
## 修改整个文档
POST crm/employee/1
{
"age":18
}
## 修改局部文档
POST crm/employee/1/_update
{
"doc":{
"name":"zhangsan",
"sex":true,
"email":"xxxx@qq.com"
}
}
## 脚本执行
POST crm/employee/1/_update
{
"script": "ctx._source.age += 5"
}
DELETE crm/employee/1
GET itsource/blog/_search
## 批量操作
POST _bulk
{ "delete": { "_index": "itsource", "_type": "employee", "_id": "123" }}
{ "create": { "_index": "itsource", "_type": "blog", "_id": "123" }}
{ "title": "我发布的博客" }
{ "index": { "_index": "itsource", "_type": "blog" }}
{ "title": "我的第二博客" }