前言
Redis是比较著名的NoSql数据库,主要用于存放KV型数据等非关系行数据,但随着Redis的发展,它所能做的功能越来越多,能够实现的场景包括但不限于:缓存,配置,排行榜,计数,分布式锁,限流,消息队列等等,当然我们提到他最多的时候是应用在缓存场景,因为redis是为缓存而生.
集成
添加Maven包
这里使用了spring-boot-starter-data-redis
,它自带的客户端连接工具是lettuce
.
当然你也可以使用redisson
或者jedis
,不过需要先排除lettuce
,再引入对应的包
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
如果使用FastJson序列化 也需要引入fastjson ,你喜欢Jackson的话,不想写?
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.70</version></dependency>
application.yml配置
spring:redis:database:0#选择第一个数据库,可选0-15host:127.0.0.1port:6379password:#无密码留空,有密码则设置密码
添加配置类
@ConfigurationpublicclassMyRedisConfig{/***指定FastJson序列化*@paramredisConnectionFactory*@return*/@BeanpublicRedisTemplateredisTemplate(RedisConnectionFactoryredisConnectionFactory){RedisTemplate<Object,Object>template=newRedisTemplate();template.setConnectionFactory(redisConnectionFactory);GenericFastJsonRedisSerializerjsonRedisSerializer=newGenericFastJsonRedisSerializer();template.setDefaultSerializer(jsonRedisSerializer);template.setKeySerializer(jsonRedisSerializer);template.setValueSerializer(jsonRedisSerializer);returntemplate;}}
这里使用的是FastJson
序列化,并指定默认序列化方式,Key序列化方式和Value序列化方式都是FastJson.
在业务中注入方式为
@AutowiredprivateRedisTemplate<String,Object>redisTemplate;
其中<String,Object>
部分可以根据序号更换为其他类型
测试使用
一定要测试呀,我同事项目组,项目上线之后发现redis配置有问题,线程不释放,用上一段时间就卡死...
单线程 存储 100000 数据测试 : 取第二次测试结果耗时 17834 ms
@GetMapping("/string1")publicRstring1(){longstart=System.currentTimeMillis();for(inti=0;i<100000;i++){Stringuuid=UUID.randomUUID().toString();redisTemplate.opsForValue().set(uuid,uuid);}longend=System.currentTimeMillis();returnR.success("redisTemplate单线程,存储100000key:需要时间",end-start);}
100线程 并发 存储 100000 数据测试 :取第二次测试结果耗时 2795 ms
@GetMapping("/string100")publicResultVostring100()throwsInterruptedException{redisTemplate.hasKey("123");CountDownLatchcountDownLatch=newCountDownLatch(100000);ExecutorServicepool=Executors.newFixedThreadPool(100);longstart=System.currentTimeMillis();for(inti=0;i<100000;i++){pool.execute(()->{Stringuuid=UUID.randomUUID().toString();redisTemplate.opsForValue().set(uuid,uuid);countDownLatch.countDown();});}countDownLatch.await();longend=System.currentTimeMillis();returnResultVo.success("redisTemplate100线程并发,存储100000Key需要时间",end-start);}
管道 存储 100000 数据测试 :取第二次测试结果耗时 2071 ms
@GetMapping("/stringPipe")publicResultVostringPipe()throwsInterruptedException{longstart=System.currentTimeMillis();redisTemplate.executePipelined((RedisCallback)redisConnection->{for(inti=0;i<100000;i++){byte[]uuid=UUID.randomUUID().toString().getBytes();redisConnection.set(uuid,uuid);}returnnull;},redisTemplate.getDefaultSerializer());longend=System.currentTimeMillis();returnResultVo.success("redisTemplate管道,存储100000Key需要时间",end-start);}
作者:ZOUZDC
链接:https://juejin.cn/post/7028963866063306760