redis的特殊的数据结构

求两个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(是一种算法)

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值