当前位置: 首页 > news >正文

redis使用场景和java测试案例

redis数据结构和使用场景

  1. strings
  2. lists
  3. sets
  4. sort sets
  5. hashes

strings

  • token
  • session
  • validateCode
  • 分布锁
  • lists

  • 最近联系人
  • sets

  • 优惠卷
  • 激活码
  • 用户标签
  • sort sets

  • 排行榜
  • hashes

  • 购物车
  • bitmaps

  • 用户签到
  • 在线状态
  • hyperloglog

  • ip去重复统计
  • geo

  • 附近的人
  • 摇一摇
  • 两位距离

主要使用场景对应的java源码

 /**
   * 代金卷例子.
   * set结构保证了value的唯一性.
   */
  @Test
  public void setCoupon() {
    final String COUPON_KEY = "coupon";

    for (int i = 0; i < 100; i++) {
      redisTemplate.opsForSet().add(COUPON_KEY, String.format("abc%s", i));
      redisTemplate.opsForSet().add(COUPON_KEY, String.format("abc%s", i));
    }
    Assert.assertEquals(Long.valueOf(100), redisTemplate.opsForSet().size(COUPON_KEY));
    redisTemplate.opsForSet().pop(COUPON_KEY);
    Assert.assertEquals(Long.valueOf(99), redisTemplate.opsForSet().size(COUPON_KEY));

  }

  /**
   * 用户消费top10.
   * sortList结构做实时排名.
   */
  @Test
  public void sortListTop() {
    final String CONSUMPTION_KEY = "consumption";

    redisTemplate.opsForZSet().add(CONSUMPTION_KEY, "person1", 1);
    redisTemplate.opsForZSet().add(CONSUMPTION_KEY, "person2", 2);
    redisTemplate.opsForZSet().add(CONSUMPTION_KEY, "person3", 1);

    for (Object o : redisTemplate.opsForZSet().rangeByScore(CONSUMPTION_KEY, 1, 1)) {
      System.out.println(o);
    }

  }

  @Test
  public void distributeLock2() {

    new Thread(() -> {
      for (int i = 0; i < 5; i++) {
        queue2();
      }
    }).start();
  }

  /**
   * 地理位置测试.
   */
  @Test
  public void geoTest() {
    BoundGeoOperations boundGeoOperations = redisTemplate.boundGeoOps("CHINA:CITY");
    Point nanjing = new Point(118.803805, 32.060168);
    boundGeoOperations.add(nanjing, "南京市");
    Point beijing = new Point(116.397039, 39.9077);
    boundGeoOperations.add(beijing, "北京市");
    Point shanghai = new Point(120.52, 30.40);
    boundGeoOperations.add(shanghai, "上海市");
    //geodist:获取两个地理位置的距离
    Distance distance = boundGeoOperations.distance("南京市", "北京市", Metrics.KILOMETERS);
    System.out.println("南京市到北京市之间的距离是:" + distance.getValue() + "km");

    Distance distance2 = boundGeoOperations.distance("南京市", "上海市", Metrics.KILOMETERS);
    System.out.println("南京市到上海市之间的距离是:" + distance2.getValue() + "km");

    //geohash:获取某个地理位置的geohash值
    List<String> list = boundGeoOperations.hash("南京市");
    System.out.println("南京市的geoHash = " + list.get(0));

    //geopos:获取某个地理位置的坐标
    List<Point> pointList = boundGeoOperations.position("南京市");
    System.out.println("南京市的经纬度为 = " + pointList.get(0));

    //georadius:根据给定地理位置坐标获取指定范围内的地理位置集合
    //查询南京市1000KM范围内的城市
    Circle within = new Circle(nanjing, 1000000);
    //设置geo查询参数
    RedisGeoCommands.GeoRadiusCommandArgs geoRadiusArgs = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs();
    //查询返回结果包括距离和坐标
    geoRadiusArgs = geoRadiusArgs.includeCoordinates().includeDistance();
    //按查询出的坐标距离中心坐标的距离进行排序
    geoRadiusArgs.sortAscending();
    //限制查询返回的数量
    geoRadiusArgs.limit(2);
    GeoResults<RedisGeoCommands.GeoLocation<String>> geoResults = boundGeoOperations.radius(within, geoRadiusArgs);
    List<GeoResult<RedisGeoCommands.GeoLocation<String>>> geoResultList = geoResults.getContent();
    for (GeoResult geoResult : geoResultList) {
      System.out.println("geoRadius  " + geoResult.getContent());
    }

    //georadiusbymember:根据给定地理位置获取指定范围内的地理位置集合
    geoRadiusArgs.limit(1);
    geoResults = boundGeoOperations.radius("南京市", new Distance(1000000), geoRadiusArgs);
    geoResultList = geoResults.getContent();
    for (GeoResult geoResult : geoResultList) {
      System.out.println("geoRadiusByMember  " + geoResult.getContent());
    }
    //删除位置信息,此命令不是geo提供的,是使用zrem命令删除的
   boundGeoOperations.remove("南京市");
  }

  /**
   * 查看用户在线状态情况 1在线,0离线.
   */
  @Test
  public void bitmapTest() {
    final String onlineKey = "online:";
    for (int i = 0; i < 100; i++) {
      redisTemplate.opsForValue().setBit(onlineKey, i, i % 2 == 0);
    }
    for (int i = 0; i < 10; i++) {

      System.out.println(i + "=" + redisTemplate.opsForValue().getBit(onlineKey, i));
    }
    System.out.println("online:" + redisConfig.bitCount(onlineKey));
  }

  /**
   * 统一数组里数据唯一性.
   * IP地址去重复.
   */
  @Test
  public void hyperLogLogTest() {
    final String loglogKey = "loglog:";

    String[] arr = new String[100];
    for (int i = 0; i < 100; i++) {
      arr[i] = "A" + new Random().nextInt(10) + 1;
    }
    redisTemplate.opsForHyperLogLog().add(loglogKey, arr);
    System.out.println("loglog:" + redisTemplate.opsForHyperLogLog().size(loglogKey));
  }

转载于:https://www.cnblogs.com/lori/p/10457011.html

相关文章:

  • 数据库迁移
  • 无监督学习新突破!华为美研所提出自动编码变换网络AET
  • YII AssetManager分析 最小化脚本文件
  • 迅速搭建简易静态服务器
  • 在CMD窗口中使用javac和java命令进行编译和执行带有包名的具有继承关系的类
  • 4.56MariaDB密码重置4.57MariaDB慢查询日志
  • 第一次作业(2)
  • 基于遗传算法的优化问题求解
  • LSMTree - SStable 初体验
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • 242. Valid Anagram(C++)
  • 冒泡排序及回调函数的使用
  • HTML5基础(四)
  • 决战燕京城-10 前往天寿山
  • ubuntu设置源
  • chrome扩展demo1-小时钟
  • JS实现简单的MVC模式开发小游戏
  • Markdown 语法简单说明
  • mysql中InnoDB引擎中页的概念
  • nfs客户端进程变D,延伸linux的lock
  • node学习系列之简单文件上传
  • PHP 7 修改了什么呢 -- 2
  • PHP CLI应用的调试原理
  • React16时代,该用什么姿势写 React ?
  • Vue--数据传输
  • 力扣(LeetCode)965
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 批量截取pdf文件
  • 扑朔迷离的属性和特性【彻底弄清】
  • 为什么要用IPython/Jupyter?
  • 带你开发类似Pokemon Go的AR游戏
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • #NOIP 2014#Day.2 T3 解方程
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (二)windows配置JDK环境
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (附源码)计算机毕业设计ssm电影分享网站
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (三)c52学习之旅-点亮LED灯
  • (四)Linux Shell编程——输入输出重定向
  • (转)3D模板阴影原理
  • (转)Scala的“=”符号简介
  • (转)甲方乙方——赵民谈找工作
  • (转载)OpenStack Hacker养成指南
  • .Net MVC + EF搭建学生管理系统
  • .NET Reactor简单使用教程
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .net网站发布-允许更新此预编译站点
  • [ C++ ] STL---string类的模拟实现
  • [ IO.File ] FileSystemWatcher
  • [] 与 [[]], -gt 与 > 的比较
  • [2010-8-30]
  • [8-23]知识梳理:文件系统、Bash基础特性、目录管理、文件管理、文本查看编辑处理...