redistemplate批量读取_redis常用操作(管道(pipeline)实现批量操。。。

更新时间:2023-06-14 04:15:07 阅读: 评论:0

redistemplate批量读取_redis常⽤操作(管道(pipeline)实现
批量操。。。
试了很多种错误的⽅法,现将⾃⼰测试成功redis管道pipeline批量操作的⽅法和redis常⽤操作以及⼀些关于springboot+redis的概念分享给⼤家
开发环境准备:
spring boot 2.x
使⽤RedisTemplate 操作
springboot项⽬pom引⼊redis依赖:
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-redis
1.4.7.RELEASE
Jedis是Redis官⽅推荐的⾯向Java的操作Redis的客户端,⽽RedisTemplate是SpringDataRedis中对JedisApi的⾼度封装。
SpringDataRedis相对于Jedis来说可以⽅便地更换Redis的Java客户端,⽐Jedis多了⾃动管理连接池的特性,⽅便与其他Spring框架进⾏搭配使⽤.
redisTemplate
1. redisTemplate
redisTemplate默认使⽤的是JDK序列化,但是可以主动设置
redisTemplate执⾏两条命令其实是在两个连接⾥完成的,因为redisTemplate执⾏完⼀个命令就会对其关闭,但是redisTemplate额外为什么提供了RedisCallback和SessionCallBack两个接⼝
StringRedisTemplate
StringRedisTemplate继承RedisTemplate,只是提供字符串的操作,复杂的Java对象还要⾃⾏处理
RedisCallback和SessionCallBack:
作⽤: 让RedisTemplate进⾏回调,通过他们可以在同⼀条连接中执⾏多个redis命令
SessionCalback提供了良好的封装,优先使⽤它,redisCallback使⽤起来有点复杂(很多⼯作需要我们⾃⼰来完成)还是优先选择SessionCalback
redis 基础操作
redisTemplate模糊匹配删除
String key = "urRole:*";
redisTemplate.delete(key);
Redis模糊查询
可以通过Redis中keys命令进⾏获取key值,具体命令格式:keys pattern
⽂中提到redis中允许模糊查询的有3个通配符,分别是:*,?,[]
其中:
*:通配任意多个字符
:通配单个字符
[]:通配括号内的某⼀个字符
使⽤通配符拿到keys
Set keysUrRole = redisTemplate.keys("urRole:" + "*");
批量查询
Set keysList = stringRedisTemplate.keys(keys);
List strings = stringRedisTemplate.opsForValue().multiGet(keysList);
Redis管道(pipeline)流操作
总的来说Redis的管道可以在⼤量数据需要⼀次性操作完成的时候,使⽤Pipeline进⾏批处理,将多次操作合并成⼀次操作,可以减少链路层的时间消耗。
流⽔线:
redis的读写速度⼗分快,所以系统的瓶颈往往是在⽹络通信中的延迟。
redis可能会在很多时候处于空闲状态⽽等待命令的到达。
为了解决这个问题,可以使⽤redis的流⽔线,流⽔线是⼀种通讯协议,类似⼀个队列批量执⾏⼀组命令。
redis的管道 pipeline批量t
//耗时:309;
@RequestMapping(value = "/redisPipeline", method = RequestMethod.POST)
@ApiOperation(value = "redis的管道 pipeline 添加数据测试")
public void redistest(){
log.info("redistest开始");
// 开始时间
long start = System.currentTimeMillis();
RedisSerializer stringSerializer = new StringRedisSerializer();
redisTemplate.tKeySerializer(stringSerializer);
redisTemplate.tValueSerializer(stringSerializer);
List result = utePipelined(new SessionCallback() {
//执⾏流⽔线
天津简介@Override
public Object execute(RedisOperations operations) throws DataAccessException {
//批量处理的内容
for (int i = 0; i < 10000; i++) {
operations.opsForValue().t("redistest:" + "k" + i, "v" + i);
}
/
/注意这⾥⼀定要返回null,最终pipeline的执⾏结果,才会返回给最外层
return null;
}
});
// 结束时间
long end = System.currentTimeMillis();
log.info("运⾏时间:"+(end-start));
}
此处与未使⽤管道流⽔线操作做对⽐后续其他操作就不⼀⼀对⽐了
未使⽤流⽔线处理10000次请求:
逻辑顺序包括哪些//耗时:5692;
猫咪行为public class RedisTest {
@Autowired
private RedisTemplate redisTemplate;
@Test
public void test(){
// 开始时间
long start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
redisTemplate.opsForValue().t("k"+i,"v"+i);
}
// 结束时间
long end = System.currentTimeMillis();
System.out.println(end-start);
}蛋糕英语怎么说
}
redis的管道 pipeline批量 delete
@RequestMapping(value = "/redisPipeline", method = RequestMethod.DELETE) @ApiOperation(value = "redis的管道 pipeline删除测试")
public void redisDeletetest(){
log.info("redistest开始");
// 开始时间
long start = System.currentTimeMillis();
RedisSerializer stringSerializer = new StringRedisSerializer();
redisTemplate.tKeySerializer(stringSerializer);
redisTemplate.tValueSerializer(stringSerializer);
//执⾏流⽔线
@Override
public Object execute(RedisOperations operations) throws DataAccessException { //批量处理的内容
自贡方言for (int i = 0; i < 20000; i++) {
//operations.opsForValue().t("redistest:"+"k"+i,"v"+i);
operations.delete("redistest:"+"k"+i);
System.out.println(i);
}
return null;
}
});
// 结束时间
long end = System.currentTimeMillis();
log.info("运⾏时间:"+(end-start));
}
redis的管道 pipeline批量 GET
/**
* redis 批量操作其中⼀种⽅式
短篇情感故事* redis pipeline 管道技术
*/
@RequestMapping(value = "/redisPipeline", method = RequestMethod.GET)
@ApiOperation(value = "redis的管道 pipeline GET测试")
public void redisPipeline(){
RedisSerializer stringSerializer = new StringRedisSerializer(); stringRedisTemplate.tKeySerializer(stringSerializer);
stringRedisTemplate.tValueSerializer(stringSerializer);
List keys=new ArrayList();
for (int i = 0; i < 200; i++) {
keys.add("redistest:"+"k"+i);
}
//调⽤ 通道批量获取
Map stringObjectMap = batchQueryByKeys(keys, true);
System.out.println(stringObjectMap.size());
}
/**
*
* @param keys
* @param uParallel 是否使⽤并⾏平⾏流
* @return
*/
public Map batchQueryByKeys(List keys,Boolean uParallel){
if(null == keys || keys.size() == 0 ){
return null;
}
if(null == uParallel){
uParallel = true;
}
List results = utePipelined(
new RedisCallback() {
致爱歌词@Override
public Object doInRedis(RedisConnection connection) throws DataAccessException { StringRedisConnection stringRedisConn = (StringRedisConnection)connection;古代奋斗生活
for(String key:keys) {
<(key);
}
return null;
}
});
if(null == results || results.size() == 0 ){return null;}
Map resultMap = null;
if(uParallel){
Map resultMapOne = Collections.synchronizedMap(new HashMap());
keys.parallelStream().forEach(t -> {
resultMapOne.put((keys.indexOf(t)));

本文发布于:2023-06-14 04:15:07,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/949809.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:操作   批量   管道
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图