网站备案类型及条件网站开发公众号开发
- 作者: 五速梦信息网
- 时间: 2026年03月21日 08:12
当前位置: 首页 > news >正文
网站备案类型及条件,网站开发公众号开发,网店运营公司,wordpress 转小程序Redis存储geo数据类型基本介绍 geo 就是 geolocation 的简写形式#xff0c;代表地理坐标。redis 在 3.2 版本中加入了对 geo 的支持#xff0c;允许存储地理坐标信息#xff0c;帮助我们根据经纬度来检索数据。常见的命令有#xff1a; geoadd#xff1a;添加一个地理空… Redis存储geo数据类型基本介绍 geo 就是 geolocation 的简写形式代表地理坐标。redis 在 3.2 版本中加入了对 geo 的支持允许存储地理坐标信息帮助我们根据经纬度来检索数据。常见的命令有 geoadd添加一个地理空间信息包含经度longitude、纬度latitude、值member geoadd g1 116.378248 39.865275 bjn 116.428003 39.903738 bjz 116.322287 39.893729 bjx
添加城市
GEOADD g1 116.3883 39.9289 Beijing
GEOADD g1 121.4737 31.2304 Shanghai
GEOADD g1 114.0667 22.5485 Guangzhou geoadd GEOkey 经度longitude 纬度latitude GEOname 添加的数据如下 geopos获取一个或多个成员的地理位置经度和纬度
GEOPOS key member
GEOPOS g1 bjx geodist计算指定的两个点之间的距离并返回
GEODIST key member1 member2 [unit]geodist g1 bjn bjx km
georadius指定圆心、半径找到该圆内包含的所有 member并按照与圆心之间的距离排序返回。
GEORADIUS key longitude latitude radius [unit] [WITHDIST] [WITHCOORD] [WITHHASH] [COUNT count]GEORADIUS g1 116.397904 39.909005 10 km withdist
geohash将指定的 member 的坐标转换为 hash 字符串并返回
GEOADD key longitude latitude membergeohash g1 bjz
Java操作redis对geo数据类型的操作
添加一个地理坐标
String redisKey geo1;
redisTemplate.opsForGeo().add(redisKey,new Point(113.883078,22.553291),shenzhen);
删除一个键对应的地理成员
redisTemplate.opsForGeo().remove(String key, String member);
redisTemplate.opsForGeo().remove(redisKey, shenzhen);
查询member坐标
ListPoint list redisTemplate.opsForGeo().position(redisKey, shenzhen,guangzhou);
查询以某点画圆所圈定的member Point center new Point(113.8830,22.553); // 中点Circle circle new Circle(center, 100000); // 单位为米GeoResultsRedisGeoCommands.GeoLocationString results redisTemplate.opsForGeo().radius(redisKey, circle); // 查询的中点和半径ListString locations results.getContent().stream().map(result - result.getContent().getName()).collect(Collectors.toList()); // 获取成员的字段System.out.println(locations); // 默认是按照由近到远排序
计算两点距离
double value redisTemplate.opsForGeo().distance(redisKey, 广州, 深圳, KILOMETERS).getValue();
获取以某点画圆所圈定的member以及对应的距离
// 创建一个Point对象表示圆心的经纬度
Point center new Point(116.373, 39.157);// 创建一个Circle对象表示以center为圆心半径为120公里的圆
// 注意这里半径的单位是公里而不是米
Circle circle new Circle(center, new Distance(120, Metrics.KILOMETERS));// 使用RedisTemplate的opsForGeo().radius()方法查询圆内的member和距离
// redisKey是Redis中存储地理信息的key
// circle是查询的圆
// RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeDistance()表示返回结果中包含距离
GeoResultsRedisGeoCommands.GeoLocationObject results redisTemplate.opsForGeo().radius(redisKey, circle, RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeDistance());// 创建一个HashMap用于存储member和到圆心的距离
MapString, Double distanceMap new HashMap();// 遍历查询结果
for (GeoResultRedisGeoCommands.GeoLocationObject geoResult : results.getContent()) {// 获取member的idString member geoResult.getContent().getName().toString(); // member// 获取member到圆心的距离double distanceToCenter geoResult.getDistance().getValue(); // 到圆心的距离// 将member和距离存储到distanceMap中distanceMap.put(member, distanceToCenter);
}// 打印结果
System.out.println(distanceMap);
黑马点评中按照距离远近的顺序查询店铺具体代码实现
Overridepublic Result queryShopByType(Integer typeId, Integer current, Double x, Double y) {
// 1.判断是否需要根据坐标查询if (x null || y null) {// 不需要坐标查询按数据库查询PageShop page query().eq(type_id, typeId).page(new Page(current, SystemConstants.DEFAULT_PAGE_SIZE));// 返回数据return Result.ok(page.getRecords());}// 2.计算分页参数int from (current - 1) * SystemConstants.DEFAULT_PAGE_SIZE;int end current * SystemConstants.DEFAULT_PAGE_SIZE;// 3.查询redis、按照距离排序、分页。结果shopId、distanceString key SHOP_GEO_KEY typeId;Point center new Point(x, y); // 中点Circle circle new Circle(center, 5000); // 单位为米GeoResultsRedisGeoCommands.GeoLocationString results redisTemplate.opsForGeo().radius(key, circle, RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeDistance().sortAscending()); // 查询的中点和半径并按距离升序排序// 4.解析出idif (results null || results.getContent().isEmpty()) {return Result.ok(Collections.emptyList());}ListGeoResultRedisGeoCommands.GeoLocationString list results.getContent();if (list.size() from) {// 当前页没有数据直接返回空列表return Result.ok(Collections.emptyList());}// 4.1.截取 from ~ end的部分ListLong ids new ArrayList(list.size());MapString, Distance distanceMap new HashMap(list.size());list.stream().skip(from).limit(end - from).forEach(result - {// 4.2.获取店铺idString shopIdStr result.getContent().getName();ids.add(Long.valueOf(shopIdStr));// 4.3.获取距离Distance distance result.getDistance();distanceMap.put(shopIdStr, distance);});// 5.根据id查询ShopListString idStrList ids.stream().map(String::valueOf).collect(Collectors.toList());String idStr StrUtil.join(,, idStrList);ListShop shops query().in(id, ids).last(ORDER BY FIELD(id, idStr )).list();for (Shop shop : shops) {Distance distance distanceMap.get(shop.getId().toString());if (distance ! null) {shop.setDistance(distance.getValue());}}// 6.返回return Result.ok(shops);}
BitMap位图
把每一个 bit 位对应当月的每一天形成了映射关系。用 0 和 1 标示业务状态这种思想就称为位图BitMap。比如签到。
Redis 中是利用 string 类型数据结构实现 BitMap因此最大上限是 512M转换为 bit 则是 2^32 个 bit 位。
bitmap的操作命令有
setbit: 向指定位置offset存入一个0或1 getbit: 获取指定位置offset的bit值 bitcount: 统计bitmap中值为1的bit位的数量 bitfield: 操作查询、修改、自增bitmap中bit数组中的指定位置offset的值 bitfield_ro: 获取bitmap中bit数组并以十进制形式返回 bitop: 将多个bitmap的结果做位运算与、或、异或 bitpos: 查询bit数组中指定范围内第一个0或1出现的位置
实现签到功能
实现签到 Overridepublic Result sign() {// 获取当前用户idLong Id BaseContext.getCurrent().getId();// 获取当前时间LocalDate currentDate LocalDate.now();// 将当前时间String化// 将当前时间转为对应天数String formattedDate currentDate.format(DateTimeFormatter.ofPattern(:yyyy:MM));// 获取当日是这个月的第几天int dayOfMonth currentDate.getDayOfMonth();// redis签到redisTemplate.opsForValue().setBit(user Id formattedDate, dayOfMonth , true);return Result.ok();}
统计这个月的签到天数 Overridepublic Result GetSignDays() {Long Id BaseContext.getCurrent().getId();// 获取当前时间LocalDate currentDate LocalDate.now();// 将当前时间String化// 将当前时间转为对应天数String formattedDate currentDate.format(DateTimeFormatter.ofPattern(:yyyy:MM));// 获取当日是这个月的第几天String key user Id formattedDate;Long execute (Long)redisTemplate.execute((RedisCallbackLong) connection -connection.bitCount(key.getBytes()) // 使用字符串序列化转为字节数组);return Result.ok(execute);}
HyperLogLog 用法
首先我们理解两个概念
UV (Unique Visitor)全称 Unique Visitor也叫独立访客量是指通过互联网访问该网站的自然人。1天内同一个用户多次访问该网站只记录1次。PV (Page View)全称 Page View也叫页面访问量或点击量。用户每访问网站的一个页面记录1次 PV用户多次打开同页面则记录多次 PV。
UV 统计在服务端做会比较麻烦因为需要判断该用户是否已经统计过了需求将统计过的用户信息保存。
// TODO
- 上一篇: 网站备案可以更改吗服务器安全
- 下一篇: 网站备案流程图片快速搭建网站前端
