美团单车如何基于Redis快速查找附近的车辆
首先是在车辆变动位置时使用
geoadd xxx xxx id
保存定位到redis
然后使用
georadius xxx xxx 1000 m whitelist
命令查询指定坐标1000米半径范围内的车辆,当然也可以指定count或者asc/desc
或者使用geohash命令缓存车辆位置信息
redis主从架构锁失效如何解决
原因:客户端发送锁请求到主节点,主节点中间宕机了,此时锁失效了
解决方案
Redlock
官方推荐的一种方式,我们最好设置三台以上的节点,每次客户端请求时需要大于1/2的节点上获取的到锁,才算获取成功。如果少于1/2的节点获取到锁,就释放锁。
使用三方锁
比如zookeeper、consul、etcd、nacos等等
redis跳表是如何实现的
一层层的list,每层下面都是一个list段

Redis底层ZSet实现压缩列表和跳表如何选择
压缩列表
其实就是紧挨着的list,类似于数组的内存方案,空间利用率高,只适合数据量少的场景,新增或者删除是性能瓶颈
跳表
实际就是多层链表,每层链表对应着子链表,特点就是查询快,新增删除也不需要全部修改,性能高。 缺点就是费内存,需要维护映射关系。
选择:数据量少->压缩列表 数据量多->跳表
dubbo背景
实际就是架构的演进 ORM->RPC->RPC->SOA
dubbo需求
实际就是为了解决三个难点 1. 服务配置 2. 服务依赖 3. 服务容量
dubbo架构
provider
提供服务,暴露服务,将自己注册到注册中心,只会第一次时注册上去,后续再变动的时候会通知注册中心
register
注册中心,负责接收服务,以及提供服务地址给消费者
consumer
消费者,启动时向register获取服务地址,长连接,然后缓存到本地
monitor
生产者每分钟发送一次数据到监控,方便统计数据
container
可以是docker,也可以是其他的,其实就是provider
dubbo注册中心
dubbo.register.address=zookeeper://xxx
dubbo.matadate-report.address=zookeeper://xxx
dubbo配置优先级
java -D dubbo.protocol.port=2181- xml配置文件
- properties配置文件
如果classpath下有多个jar,超过了一个dubbo.properties,那么会随机选择一个加载,并且打印错误日志。如果id没有在protocol中配置,默认使用name
dubbo如何配置标签
方式一
直接 java -D dubbo.labels='tag1=1;tag2=2'
方式二
环境变量 DUBBO_LABELS=tag1=1;tag2=2
效果:发送的请求上会添加 dubbo:xxx?dubbotag1=1&dubbotag2=2
dubbo注解如何使用
生产者
@Service:在指定接口上暴露服务
@EnableDubbo: 指定扫描范围
消费者
@Reference:类似@Service
@EnableDubbo:指定扫描范围
dubbo配置加载流程
- 启动指定,
Java -D - 外部化配置文件 xml properties
- ServiceConfig、referenceConfig等配置类
- dubbo.properties
dubbo服务重试
默认是重试2次,可以通过加retries参数指定重试次数
dubbo.reference.retries表示其他配置全部无效,以该配置为准
dubbo启动检查
默认情况下dubbo是会检查服务是否可用的,如果服务不可用会直接报错,可以修改配置check=false关掉
dubbo集群容错
在dubbo调用失败时,默认提供了多种方案
failover cluster
失败自动切换,常用于读操作
failfast cluster
快速失败,立即报错,常用语非幂等请求,比如新增
failsafe cluster
失败不报错,适用于日志
failback cluster
失败自动恢复,自动重发,常用于消息通知
forking cluster
并行调度多个服务器,只需要一个调用成功即返回。
broadcast cluster
广播调用所有提供者,任意一个报错,直接报错。可以配置能容忍报错的数量


