求两个set集合的交集
stringRedisTemplate.opsForSet().intersect(k1,k2);
业务场景:用户1 和 用户2 的共同关注
关注的博主发布了新的内容
推拉模式
推模式:博主发布之后 直接把内容分发到关注该播主的所有人的收件箱,这样速度快,但是数据会有冗余
拉模式: 博主发布之后,需要用户自己去博主的发件箱去拉取内容 这样速度慢,但是数据只有一份
推拉结合:对于大V 也就是粉丝数众多的 采取拉取模式 但是对于那些忠实粉丝 也就是一天能够看好几次微薄的人 也可以对这几个粉丝采取推模式 而对于一般的博主 可以采取推模式
业务场景: 某些博主发文章的时候
滚动分页
一般的分页,比如 9 8 7 6 5 4 3 2 1 0 十条数据 在查春数据的时候一次查询5条
那么第一次查询到 9 8 7 6 5 第二次查询到的是 4 3 2 1 0 ,但是如果在第一次查询和第二次查询之间, 添加了一个 10 也就是说 第一次查询之后,数据成了 10 9 8 7 6 5 4 3 2 2 0 ,那么第二次查询的时候,查询到的就是 5 4 3 2 1 ,也就是说 5 这条数据被查询到多次, 但是滚动分页 就能解决这个问题
业务场景:任何使用到分页的时候都有可能发生
解决方式: 在查询数据的时候,前端传入的参数带着上次最后一条数据,这样后端就可以知道从哪里开始往后查询多少条数据了
地理坐标–GEO
经纬度的数据结构可以存储到 GEO中 底层使用的是 zset 地理坐标会被转换成 zset中的score
业务场景:附近的商家、附近的人、计算两点之间的距离等等
具体实现:
结果:
计算两点之间的距离结果
按照区域查询–GEO
业务场景:规定一个中心点,以及距离,查询库中有哪些点是在这个距离内的,有按照 圆心半径查找的 也有按照 矩形查找的
比如:附近的人、周围的美食、景点等等
具体实现
首先插入两个地点
``java
@Override
public Result addGeographicalCoordinates() {
// 经度:116.322062纬度:39.894914
stringRedisTemplate.opsForGeo().add(“geo:shop”, new Point(116.322062,
39.894914), “北京西站”);
// 经度:116.378545纬度:39.865195
stringRedisTemplate.opsForGeo().add(“geo:shop”, new Point(116.378545,
39.865195), “北京南站”);
return Result.ok();
}
然后给出一个圆心和距离,查找附近的商家
```java
@Override
public Result nearbyShop() {
// 天安门 经度:116.397726纬度:39.903767
GeoResults<RedisGeoCommands.GeoLocation<String>> results = stringRedisTemplate.opsForGeo().search(
"geo:shop",
// GeoReference.fromCoordinate(116.397726, 39.903767), //经纬度 或者这么写,直接写坐标
GeoReference.fromCoordinate(new Point(116.397726, 39.903767)), //经纬度
new Distance(10000),
RedisGeoCommands.GeoSearchCommandArgs.newGeoSearchArgs().
includeDistance() //结果中带上距离
.limit(5) //查询前几条数据 就是前五条数据 那么如果要是分页呢 那需要自己查询出所有然后手动截取
);
if (results == null) {
return Result.ok();
}
List<GeoResult<RedisGeoCommands.GeoLocation<String>>> content = results.getContent();
for (GeoResult<RedisGeoCommands.GeoLocation<String>> shop : content) {
System.out.println("shop.getContent().getName() = " + shop.getContent().getName());
System.out.println("shop.getDistance() = " + shop.getDistance());
}
return Result.ok();
/*结果:
shop.getContent().getName() = 北京南站
shop.getDistance() = 4591.8097 METERS
shop.getContent().getName() = 北京西站
shop.getDistance() = 6531.2916 METERS
*/
}
签到功能–bitMap
业务场景:用户签到、打卡 布隆过滤器 等等
一般来讲 ,如果某个字段只有两个状态 来/没来 正确/错误 等等 都可以使用 bitMap
bitMap的底层是使用string来实现的,最大为 512M
@Override
public Result signIn() {
/*签到的key就是 用户的id+月份 value就是二进制的01010101110000*/
LocalDate now = LocalDate.now();
int monthValue = now.getMonthValue();
int dayOfMonth = now.getDayOfMonth(); // 减去一就是偏移量
Long userid = 1001L;
String key = userid.toString() + "_" + String.valueOf(monthValue);
System.out.println("monthValue = " + monthValue);
System.out.println("dayOfMonth = " + dayOfMonth);
System.out.println("key = " + key);
stringRedisTemplate.opsForValue().setBit(key, dayOfMonth - 1, true);
StringBuilder stringBuilder=new StringBuilder();
for (int i = 0; i < 30; i++) {
Boolean bit = stringRedisTemplate.opsForValue().getBit(key, i);
if (bit){
stringBuilder.append(1);
}else {
stringBuilder.append(0);
}
}
System.out.println(stringBuilder);
//000000000000000000000000000001
return Result.ok();
}
HyperLogLog(是一种算法)