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可以用任何语言实现. ...
随机推荐
- bzoj4476 [Jsoi2015]送礼物
化简式子 $M>=m+ans*(r-l+k)$ 发现$M,m$确定时,总区间长度越小越好,于是假定右端点为最小值$M+ans*l>=m+ans*r+ans*k$, 右面都确定了,但最大值仍 ...
- bzoj 3505 [Cqoi2014]数三角形 组合
ans=所有的三点排列-共行的-共列的-斜着一条线的 斜着的枚举每个点和原点的gcd,反过来也可以,还能左右,上下挪 #include<cstdio> #include<cstrin ...
- ||与&&的返回值
当你准备携带你的配剑杀向江湖的时候,当你准备进入js这门语言的时候,你会遇到很多||与&&的问题.那么对于他们的返回值你知道多少呢? 在此之前我们来聊一个大家都知道的知识:js中值转换 ...
- Postman----支持markdown可自动生成接口文档
1.postman支持markdown作为集合中的请求,对集合和文件夹进行文字描述的方式,您可以嵌入屏幕截图和其他图像已获得更多描述性的介绍. 2.已markdown语法为准,填写自己想要展示的内容 ...
- 在Eclipse上Maven环境配置使用
1. 安装配置Maven: 1.1 从Apache网站 http://maven.apache.org/ 下载并且解压缩安装Apache Maven. Maven下载地址: http://maven. ...
- 线性表概述及单链表的Java实现
一.线性表概述 线性表是指一组数据元素之间具有线性关系的元素序列,它表现为:除第一个元素没有直接前驱元素.最后一个元素没有直接后继元素外,其余所有元素都有且仅有一个直接前驱元素和直接后继元素. 根据存 ...
- Bootstrap优秀模板-ColorAdmin.4.3.0
老牌的Bootstrap商业模板,提供HTML.AngularJS.AngularJS5.Vue.React多种环境,风格覆盖Flat.Material.Apple.Transparent甚至Face ...
- Kubernetes集群部署史上最详细(一)Kubernetes集群安装
适用部署结构以及版本 本系列中涉及的部署方式和脚本适用于1.13.x和1.14,而且采取的是二进制程序部署方式. 脚本支持的部署模式 最小部署模式 3台主机,1台为k8s的master角色,其余2台为 ...
- 讲解:为什么重写equals时必须重写hashCode方法
一 :string类型的==和equals的区别: 结论:"=="是判断两个字符串的内存地址是否相等,equals是比较两个字符串的值是否相等,具体就不做扩展了,有兴趣的同学可以去 ...
- SpringIOC原理简述
IOC:控制反转(Inversion of Control,英文缩写为 IOC) 简单来讲就是把代码的控制权从调用方(用户)转变成被调用方(服务端) 以前的代码控制权在调用方,所以要每当程序要更新修改 ...