redis使用场景和java测试案例
redis数据结构和使用场景
- strings
- lists
- sets
- sort sets
- 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测试案例的更多相关文章
- redis 适用场景、缓存选择、java实现
redis适用场景 查询多,修改少:如国家地区信息.商品分类.数据字典 缓存选择 hibernate二级缓存.mybatis二级缓存.redishibernate二级缓存.mybatis二级缓存默认不 ...
- Redis学习记录之Java中的初步使用
1.关于Redis redis下载地址:<span style="font-family: Arial, Helvetica, sans-serif;">http:// ...
- Redis应用场景-转载
1. MySql+Memcached架构的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的 ...
- Storm自带测试案例的运行
之前Storm安装之后,也知道了Storm的一些相关概念,那么怎么样才可以运行一个例子对Storm流式计算有一个感性的认识呢,那么下面来运行一个Storm安装目录自带的测试案例,我们的Storm安装在 ...
- 如何使用 Java 测试 IBM Systems Director 的 REST API
转自: http://www.ibm.com/developerworks/cn/aix/library/au-aix-systemsdirector/section2.html 如何使用 Java ...
- <转>Redis 应用场景
http://blog.csdn.net/hguisu/article/details/8836819 1. MySql+Memcached 架构的问题 Memcached采用客户端-服务器的架构, ...
- Redis集群的使用测试(Jedis客户端的使用)
Redis集群的使用测试(Jedis客户端的使用)1.Jedis客户端建议升级到最新版(当前为2.7.3),这样对3.0.x集群有比较好的支持.https://github.com/xetorthio ...
- Redis入门 – Jedis存储Java对象 - (Java序列化为byte数组方式)
Redis入门 – Jedis存储Java对象 - (Java序列化为byte数组方式) 原文地址:http://alanland.iteye.com/admin/blogs/1600685(欢迎转载 ...
- Redis应用场景-整理
1. MySql+Memcached架构的问题 Memcached采用客户端-服务器的架构,客户端和服务器端的通讯使用自定义的协议标准,只要满足协议格式要求,客户端Library可以用任何语言实现. ...
随机推荐
- BZOJ_4196_[Noi2015]软件包管理器_树链剖分
BZOJ_4196_[Noi2015]软件包管理器_树链剖分 题意: Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助 ...
- 猴子 JDFZ模拟赛
猴子(弱) Description 话说NP做梦,梦见自己变成了一只猴子,并且有很多香蕉树,这些香蕉树都种在同一直线上,而NP则在这排香蕉树的第一棵树上.NP当然想吃尽量多的香蕉,但它又不想在地上走, ...
- 第十四章——循环神经网络(Recurrent Neural Networks)(第一部分)
由于本章过长,分为两个部分,这是第一部分. 这几年提到RNN,一般指Recurrent Neural Networks,至于翻译成循环神经网络还是递归神经网络都可以.wiki上面把Recurrent ...
- mysql中利用group by过滤删除重复行
DELETEFROM peopleWHERE peopleId IN (SELECT peopleId FROM people GROUP BY peopleId HAVING count(peopl ...
- 零基础怎么学java
首先告诉你的是,作为一个初学者想转行学习Java并不是很容易,Java本身是具有一定难度的,虽然说兴趣这东西可以让我们学习不累,但是有多少人学习是因为兴趣,或者有多少人知道自己的兴趣在哪?所以我很明确 ...
- C语言sprintf和sscanf函数用法
以前刚用C语言的时候,觉得字符串很难处理,后来用多了,发现其实并非如此,C语言也提供了许多函数给程序员使用.今天记录一下两个常用的两个字符串处理函数:sprintf和sscanf 1. sprintf ...
- .NET Core微服务系列基础文章索引(目录导航Final版)
一.为啥要总结和收集这个系列? 今年从原来的Team里面被抽出来加入了新的Team,开始做Java微服务的开发工作,接触了Spring Boot, Spring Cloud等技术栈,对微服务这种架构有 ...
- 面试前必须知道的MySQL命令【explain】
前言 只有光头才能变强 刷面试题的时候,不知道你们有没有见过MySQL这两个命令:explain和profile(反正我就见过了).. 之前虽然知道这两个命令大概什么意思,但一直没有去做笔记.今天发现 ...
- .Net 反射学习
Why?为什么使用反射 MVC ORM EF 都是用的反射.反射可以让程序的扩展性,灵活性得到加强.一起即可动态创建 what 反射原理 动态加载类库 ,先添加引用类库,或者复制debug里 ...
- 学习笔记—HTML基础标签
HTML的概念 概念: HTML 是用来描述网页的一种语言. HTML 指的是超文本标记语言 (Hyper Text Markup Language) HTML 不是一种编程语言,而是一种标记语言 ( ...