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));
}

redis使用场景和java测试案例的更多相关文章

  1. redis 适用场景、缓存选择、java实现

    redis适用场景 查询多,修改少:如国家地区信息.商品分类.数据字典 缓存选择 hibernate二级缓存.mybatis二级缓存.redishibernate二级缓存.mybatis二级缓存默认不 ...

  2. Redis学习记录之Java中的初步使用

    1.关于Redis redis下载地址:<span style="font-family: Arial, Helvetica, sans-serif;">http:// ...

  3. Redis应用场景-转载

    1.  MySql+Memcached架构的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的 ...

  4. Storm自带测试案例的运行

    之前Storm安装之后,也知道了Storm的一些相关概念,那么怎么样才可以运行一个例子对Storm流式计算有一个感性的认识呢,那么下面来运行一个Storm安装目录自带的测试案例,我们的Storm安装在 ...

  5. 如何使用 Java 测试 IBM Systems Director 的 REST API

    转自: http://www.ibm.com/developerworks/cn/aix/library/au-aix-systemsdirector/section2.html 如何使用 Java ...

  6. <转>Redis 应用场景

    http://blog.csdn.net/hguisu/article/details/8836819 1.  MySql+Memcached 架构的问题 Memcached采用客户端-服务器的架构, ...

  7. Redis集群的使用测试(Jedis客户端的使用)

    Redis集群的使用测试(Jedis客户端的使用)1.Jedis客户端建议升级到最新版(当前为2.7.3),这样对3.0.x集群有比较好的支持.https://github.com/xetorthio ...

  8. Redis入门 – Jedis存储Java对象 - (Java序列化为byte数组方式)

    Redis入门 – Jedis存储Java对象 - (Java序列化为byte数组方式) 原文地址:http://alanland.iteye.com/admin/blogs/1600685(欢迎转载 ...

  9. Redis应用场景-整理

    1.  MySql+Memcached架构的问题 Memcached采用客户端-服务器的架构,客户端和服务器端的通讯使用自定义的协议标准,只要满足协议格式要求,客户端Library可以用任何语言实现. ...

随机推荐

  1. 运用BT在centos下搭建一个博客论坛

    在日常的工作和学习中,我们都很希望有自己的工作站,就是自己的服务器,自己给自己搭建一个博客或者是论坛,用于自己来写博客和搭建网站论坛.现在我们就用一个简单的方法来教大家如何30分钟内部署一个博客网站. ...

  2. 第三天 Java语言基础

    一.三元运算符 三元运算符,也称为三目运算符或问号冒号运算符.即有三个表达式参与的运算表达式.既然是个运算符,那么运算完必须有运算结果. 1)三元运算符的格式 (表达式1)?表达式2:表达式3: 2) ...

  3. token.go

    package sego // 字串类型,可以用来表达 //    1. 一个字元,比如"中"又如"国", 英文的一个字元是一个词 //    2. 一个分词, ...

  4. LinkedBlockingQueue简介

    LinkedBlockingQueue是一个单向链表实现的阻塞队列,先进先出的顺序.支持多线程并发操作. 相比于数组实现的ArrayBlockingQueue的有界,LinkedBlockingQue ...

  5. C++11中list特有版本的算法

    与其他的容器不一样,链表类型的list和forward_list定义了几个成员函数形式的算法,这些函数和前面的所总结的通用算法不同,对于list来说,最好使用自己的特有算法,下面介绍一下主要的几个算法 ...

  6. 【二分+容斥+莫比乌斯反演】BZOJ2440 完全平方数

    Description 求第k个没有完全平方因子的数,k<=1e9. Solution 这其实就是要求第k个µ[i](莫比乌斯函数)不为0的数. 然而k太大数组开不下来是吧,于是这么处理. 二分 ...

  7. BZOJ_3685_普通van Emde Boas树_权值线段树

    BZOJ_3685_普通van Emde Boas树_权值线段树 Description 设计数据结构支持: 1 x  若x不存在,插入x 2 x  若x存在,删除x 3    输出当前最小值,若不存 ...

  8. create react app 项目部署在Spring(Tomcat)项目中

    网上看了许多,大多数都是nginx做成静态项目,但是这样局限性太多,与Web项目相比许多服务端想做的验证都很麻烦,于是开始了艰难的探索之路,终于在不经意间试出来了,一把辛酸... 正常的打包就不说了. ...

  9. Python任务调度模块 – APScheduler,实现定时任务

    1.安装 pip install apscheduler 安装完毕 2. 简单任务 首先,来个最简单的例子,看看它的威力. # coding:utf-8 from apscheduler.schedu ...

  10. 基于 Maven 的多模块 Java ( Spring ) 项目构建

    索引: 开源Spring解决方案--lm.solution 参看代码 GitHub: solution/pom.xml pojo/pom.xml mapper/pom.xml common/pom.x ...