springboot简化了许多的配置,大大提高了使用效率。下面介绍一下和Redis整合的一些注意事项。

首先介绍单机版的redis整合。

1.第一步当然是导入依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-redis</artifactId>
  4. </dependency>

2.配置一下application.properties文件,当然也可以使用yml文件编写,但yml格式要十分注意,严格遵循标准。

  1. # Redis数据库索引(默认为0)
  2. spring.redis.database=0
  3. # Redis服务器地址
  4. spring.redis.host=192.168.159.104
  5. # Redis服务器连接端口
  6. spring.redis.port=6379
  7. # Redis服务器连接密码(默认为空)
  8. spring.redis.password=
  9. # 连接池最大连接数(使用负值表示没有限制) 默认 8
  10. spring.redis.lettuce.pool.max-active=8
  11. # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
  12. spring.redis.lettuce.pool.max-wait=-1
  13. # 连接池中的最大空闲连接 默认 8
  14. spring.redis.lettuce.pool.max-idle=8
  15. # 连接池中的最小空闲连接 默认 0
  16. spring.redis.lettuce.pool.min-idle=0

3.配置完成即可进行使用,springboot自己提供了一个RedisTemplate,可以上手立即使用,如

  1. redisTemplate.opsForValue().set("www","1111111");
  2. redisTemplate.opsForValue().get("www");

但这样使用有一些地方不便,还需要手动序列化,不然写入的数据会以一种特殊状态存在,不便查看。

下面提供一个自己手动重写的RedisTemplate可以配好直接使用。

  1. package com.bai.config;
  2.  
  3. import com.fasterxml.jackson.annotation.JsonAutoDetect;
  4. import com.fasterxml.jackson.annotation.PropertyAccessor;
  5. import com.fasterxml.jackson.databind.ObjectMapper;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.context.annotation.Configuration;
  8. import org.springframework.data.redis.connection.RedisConnectionFactory;
  9. import org.springframework.data.redis.core.RedisTemplate;
  10. import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
  11. import org.springframework.data.redis.serializer.StringRedisSerializer;
  12. @Configuration
  13. public class RedisConfig {
  14. @Bean
  15. @SuppressWarnings("all")
  16. public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
  17. RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
  18. template.setConnectionFactory(factory);
  19. Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
  20. ObjectMapper om = new ObjectMapper();
  21. om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  22. om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
  23. jackson2JsonRedisSerializer.setObjectMapper(om);
  24. StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
  25. // key采用String的序列化方式
  26. template.setKeySerializer(stringRedisSerializer);
  27. // hash的key也采用String的序列化方式
  28. template.setHashKeySerializer(stringRedisSerializer);
  29. // value序列化方式采用jackson
  30. template.setValueSerializer(jackson2JsonRedisSerializer);
  31. // hash的value序列化方式采用jackson
  32. template.setHashValueSerializer(jackson2JsonRedisSerializer);
  33. template.afterPropertiesSet();
  34. return template;
  35. }
  36. }

这里配置了spring的自动注入注解。系统启动即可初始化。

4.使用Redis的一些常用指令,也有许多不便,下面提供一个RedisUtil方便操作,自选功能。

  1. package com.bai.utils;
  2.  
  3. import java.util.List;
  4. import java.util.Map;
  5. import java.util.Set;
  6. import java.util.concurrent.TimeUnit;
  7.  
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.data.redis.core.RedisTemplate;
  10. import org.springframework.stereotype.Component;
  11. import org.springframework.util.CollectionUtils;
  12.  
  13. @Component
  14. public class RedisUtil {
  15.  
  16. @Autowired
  17. private RedisTemplate<String, Object> redisTemplate;
  18.  
  19. public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
  20. this.redisTemplate = redisTemplate;
  21. }
  22. //=============================common============================
  23. /**
  24. * 指定缓存失效时间
  25. * @param key 键
  26. * @param time 时间(秒)
  27. * @return
  28. */
  29. public boolean expire(String key,long time){
  30. try {
  31. if(time>0){
  32. redisTemplate.expire(key, time, TimeUnit.SECONDS);
  33. }
  34. return true;
  35. } catch (Exception e) {
  36. e.printStackTrace();
  37. return false;
  38. }
  39. }
  40.  
  41. /**
  42. * 根据key 获取过期时间
  43. * @param key 键 不能为null
  44. * @return 时间(秒) 返回0代表为永久有效
  45. */
  46. public long getExpire(String key){
  47. return redisTemplate.getExpire(key,TimeUnit.SECONDS);
  48. }
  49.  
  50. /**
  51. * 判断key是否存在
  52. * @param key 键
  53. * @return true 存在 false不存在
  54. */
  55. public boolean hasKey(String key){
  56. try {
  57. return redisTemplate.hasKey(key);
  58. } catch (Exception e) {
  59. e.printStackTrace();
  60. return false;
  61. }
  62. }
  63.  
  64. /**
  65. * 删除缓存
  66. * @param key 可以传一个值 或多个
  67. */
  68. @SuppressWarnings("unchecked")
  69. public void del(String ... key){
  70. if(key!=null&&key.length>0){
  71. if(key.length==1){
  72. redisTemplate.delete(key[0]);
  73. }else{
  74. redisTemplate.delete(CollectionUtils.arrayToList(key));
  75. }
  76. }
  77. }
  78.  
  79. //============================String=============================
  80. /**
  81. * 普通缓存获取
  82. * @param key 键
  83. * @return 值
  84. */
  85. public Object get(String key){
  86. return key==null?null:redisTemplate.opsForValue().get(key);
  87. }
  88.  
  89. /**
  90. * 普通缓存放入
  91. * @param key 键
  92. * @param value 值
  93. * @return true成功 false失败
  94. */
  95. public boolean set(String key,Object value) {
  96. try {
  97. redisTemplate.opsForValue().set(key, value);
  98. return true;
  99. } catch (Exception e) {
  100. e.printStackTrace();
  101. return false;
  102. }
  103.  
  104. }
  105.  
  106. /**
  107. * 普通缓存放入并设置时间
  108. * @param key 键
  109. * @param value 值
  110. * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期
  111. * @return true成功 false 失败
  112. */
  113. public boolean set(String key,Object value,long time){
  114. try {
  115. if(time>0){
  116. redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
  117. }else{
  118. set(key, value);
  119. }
  120. return true;
  121. } catch (Exception e) {
  122. e.printStackTrace();
  123. return false;
  124. }
  125. }
  126.  
  127. /**
  128. * 递增
  129. * @param key 键
  130. * @param by 要增加几(大于0)
  131. * @return
  132. */
  133. public long incr(String key, long delta){
  134. if(delta<0){
  135. throw new RuntimeException("递增因子必须大于0");
  136. }
  137. return redisTemplate.opsForValue().increment(key, delta);
  138. }
  139.  
  140. /**
  141. * 递减
  142. * @param key 键
  143. * @param by 要减少几(小于0)
  144. * @return
  145. */
  146. public long decr(String key, long delta){
  147. if(delta<0){
  148. throw new RuntimeException("递减因子必须大于0");
  149. }
  150. return redisTemplate.opsForValue().increment(key, -delta);
  151. }
  152.  
  153. //================================Map=================================
  154. /**
  155. * HashGet
  156. * @param key 键 不能为null
  157. * @param item 项 不能为null
  158. * @return 值
  159. */
  160. public Object hget(String key,String item){
  161. return redisTemplate.opsForHash().get(key, item);
  162. }
  163.  
  164. /**
  165. * 获取hashKey对应的所有键值
  166. * @param key 键
  167. * @return 对应的多个键值
  168. */
  169. public Map<Object,Object> hmget(String key){
  170. return redisTemplate.opsForHash().entries(key);
  171. }
  172.  
  173. /**
  174. * HashSet
  175. * @param key 键
  176. * @param map 对应多个键值
  177. * @return true 成功 false 失败
  178. */
  179. public boolean hmset(String key, Map<String,Object> map){
  180. try {
  181. redisTemplate.opsForHash().putAll(key, map);
  182. return true;
  183. } catch (Exception e) {
  184. e.printStackTrace();
  185. return false;
  186. }
  187. }
  188.  
  189. /**
  190. * HashSet 并设置时间
  191. * @param key 键
  192. * @param map 对应多个键值
  193. * @param time 时间(秒)
  194. * @return true成功 false失败
  195. */
  196. public boolean hmset(String key, Map<String,Object> map, long time){
  197. try {
  198. redisTemplate.opsForHash().putAll(key, map);
  199. if(time>0){
  200. expire(key, time);
  201. }
  202. return true;
  203. } catch (Exception e) {
  204. e.printStackTrace();
  205. return false;
  206. }
  207. }
  208.  
  209. /**
  210. * 向一张hash表中放入数据,如果不存在将创建
  211. * @param key 键
  212. * @param item 项
  213. * @param value 值
  214. * @return true 成功 false失败
  215. */
  216. public boolean hset(String key,String item,Object value) {
  217. try {
  218. redisTemplate.opsForHash().put(key, item, value);
  219. return true;
  220. } catch (Exception e) {
  221. e.printStackTrace();
  222. return false;
  223. }
  224. }
  225.  
  226. /**
  227. * 向一张hash表中放入数据,如果不存在将创建
  228. * @param key 键
  229. * @param item 项
  230. * @param value 值
  231. * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间
  232. * @return true 成功 false失败
  233. */
  234. public boolean hset(String key,String item,Object value,long time) {
  235. try {
  236. redisTemplate.opsForHash().put(key, item, value);
  237. if(time>0){
  238. expire(key, time);
  239. }
  240. return true;
  241. } catch (Exception e) {
  242. e.printStackTrace();
  243. return false;
  244. }
  245. }
  246.  
  247. /**
  248. * 删除hash表中的值
  249. * @param key 键 不能为null
  250. * @param item 项 可以使多个 不能为null
  251. */
  252. public void hdel(String key, Object... item){
  253. redisTemplate.opsForHash().delete(key,item);
  254. }
  255.  
  256. /**
  257. * 判断hash表中是否有该项的值
  258. * @param key 键 不能为null
  259. * @param item 项 不能为null
  260. * @return true 存在 false不存在
  261. */
  262. public boolean hHasKey(String key, String item){
  263. return redisTemplate.opsForHash().hasKey(key, item);
  264. }
  265.  
  266. /**
  267. * hash递增 如果不存在,就会创建一个 并把新增后的值返回
  268. * @param key 键
  269. * @param item 项
  270. * @param by 要增加几(大于0)
  271. * @return
  272. */
  273. public double hincr(String key, String item,double by){
  274. return redisTemplate.opsForHash().increment(key, item, by);
  275. }
  276.  
  277. /**
  278. * hash递减
  279. * @param key 键
  280. * @param item 项
  281. * @param by 要减少记(小于0)
  282. * @return
  283. */
  284. public double hdecr(String key, String item,double by){
  285. return redisTemplate.opsForHash().increment(key, item,-by);
  286. }
  287.  
  288. //============================set=============================
  289. /**
  290. * 根据key获取Set中的所有值
  291. * @param key 键
  292. * @return
  293. */
  294. public Set<Object> sGet(String key){
  295. try {
  296. return redisTemplate.opsForSet().members(key);
  297. } catch (Exception e) {
  298. e.printStackTrace();
  299. return null;
  300. }
  301. }
  302.  
  303. /**
  304. * 根据value从一个set中查询,是否存在
  305. * @param key 键
  306. * @param value 值
  307. * @return true 存在 false不存在
  308. */
  309. public boolean sHasKey(String key,Object value){
  310. try {
  311. return redisTemplate.opsForSet().isMember(key, value);
  312. } catch (Exception e) {
  313. e.printStackTrace();
  314. return false;
  315. }
  316. }
  317.  
  318. /**
  319. * 将数据放入set缓存
  320. * @param key 键
  321. * @param values 值 可以是多个
  322. * @return 成功个数
  323. */
  324. public long sSet(String key, Object...values) {
  325. try {
  326. return redisTemplate.opsForSet().add(key, values);
  327. } catch (Exception e) {
  328. e.printStackTrace();
  329. return 0;
  330. }
  331. }
  332.  
  333. /**
  334. * 将set数据放入缓存
  335. * @param key 键
  336. * @param time 时间(秒)
  337. * @param values 值 可以是多个
  338. * @return 成功个数
  339. */
  340. public long sSetAndTime(String key,long time,Object...values) {
  341. try {
  342. Long count = redisTemplate.opsForSet().add(key, values);
  343. if(time>0) expire(key, time);
  344. return count;
  345. } catch (Exception e) {
  346. e.printStackTrace();
  347. return 0;
  348. }
  349. }
  350.  
  351. /**
  352. * 获取set缓存的长度
  353. * @param key 键
  354. * @return
  355. */
  356. public long sGetSetSize(String key){
  357. try {
  358. return redisTemplate.opsForSet().size(key);
  359. } catch (Exception e) {
  360. e.printStackTrace();
  361. return 0;
  362. }
  363. }
  364.  
  365. /**
  366. * 移除值为value的
  367. * @param key 键
  368. * @param values 值 可以是多个
  369. * @return 移除的个数
  370. */
  371. public long setRemove(String key, Object ...values) {
  372. try {
  373. Long count = redisTemplate.opsForSet().remove(key, values);
  374. return count;
  375. } catch (Exception e) {
  376. e.printStackTrace();
  377. return 0;
  378. }
  379. }
  380. //===============================list=================================
  381.  
  382. /**
  383. * 获取list缓存的内容
  384. * @param key 键
  385. * @param start 开始
  386. * @param end 结束 0 到 -1代表所有值
  387. * @return
  388. */
  389. public List<Object> lGet(String key,long start, long end){
  390. try {
  391. return redisTemplate.opsForList().range(key, start, end);
  392. } catch (Exception e) {
  393. e.printStackTrace();
  394. return null;
  395. }
  396. }
  397.  
  398. /**
  399. * 获取list缓存的长度
  400. * @param key 键
  401. * @return
  402. */
  403. public long lGetListSize(String key){
  404. try {
  405. return redisTemplate.opsForList().size(key);
  406. } catch (Exception e) {
  407. e.printStackTrace();
  408. return 0;
  409. }
  410. }
  411.  
  412. /**
  413. * 通过索引 获取list中的值
  414. * @param key 键
  415. * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推
  416. * @return
  417. */
  418. public Object lGetIndex(String key,long index){
  419. try {
  420. return redisTemplate.opsForList().index(key, index);
  421. } catch (Exception e) {
  422. e.printStackTrace();
  423. return null;
  424. }
  425. }
  426.  
  427. /**
  428. * 将list放入缓存
  429. * @param key 键
  430. * @param value 值
  431. * @param time 时间(秒)
  432. * @return
  433. */
  434. public boolean lSet(String key, Object value) {
  435. try {
  436. redisTemplate.opsForList().rightPush(key, value);
  437. return true;
  438. } catch (Exception e) {
  439. e.printStackTrace();
  440. return false;
  441. }
  442. }
  443.  
  444. /**
  445. * 将list放入缓存
  446. * @param key 键
  447. * @param value 值
  448. * @param time 时间(秒)
  449. * @return
  450. */
  451. public boolean lSet(String key, Object value, long time) {
  452. try {
  453. redisTemplate.opsForList().rightPush(key, value);
  454. if (time > 0) expire(key, time);
  455. return true;
  456. } catch (Exception e) {
  457. e.printStackTrace();
  458. return false;
  459. }
  460. }
  461.  
  462. /**
  463. * 将list放入缓存
  464. * @param key 键
  465. * @param value 值
  466. * @param time 时间(秒)
  467. * @return
  468. */
  469. public boolean lSet(String key, List<Object> value) {
  470. try {
  471. redisTemplate.opsForList().rightPushAll(key, value);
  472. return true;
  473. } catch (Exception e) {
  474. e.printStackTrace();
  475. return false;
  476. }
  477. }
  478.  
  479. /**
  480. * 将list放入缓存
  481. * @param key 键
  482. * @param value 值
  483. * @param time 时间(秒)
  484. * @return
  485. */
  486. public boolean lSet(String key, List<Object> value, long time) {
  487. try {
  488. redisTemplate.opsForList().rightPushAll(key, value);
  489. if (time > 0) expire(key, time);
  490. return true;
  491. } catch (Exception e) {
  492. e.printStackTrace();
  493. return false;
  494. }
  495. }
  496.  
  497. /**
  498. * 根据索引修改list中的某条数据
  499. * @param key 键
  500. * @param index 索引
  501. * @param value 值
  502. * @return
  503. */
  504. public boolean lUpdateIndex(String key, long index,Object value) {
  505. try {
  506. redisTemplate.opsForList().set(key, index, value);
  507. return true;
  508. } catch (Exception e) {
  509. e.printStackTrace();
  510. return false;
  511. }
  512. }
  513.  
  514. /**
  515. * 移除N个值为value
  516. * @param key 键
  517. * @param count 移除多少个
  518. * @param value 值
  519. * @return 移除的个数
  520. */
  521. public long lRemove(String key,long count,Object value) {
  522. try {
  523. Long remove = redisTemplate.opsForList().remove(key, count, value);
  524. return remove;
  525. } catch (Exception e) {
  526. e.printStackTrace();
  527. return 0;
  528. }
  529. }
  530. }

采用util方便了一些使用过程,不要忘了注入RedisUtil

  1. @Autowired
  2. private RedisUtil redisUtil;
  3. @RequestMapping(value = "/demo1")
  4. public Object demo1(){
  5. redisUtil.set("name","yknb");
  6. return redisUtil.get("name");
  7. }

此处篇幅过大,下一篇结束集群版的Redis和springboot整合。

springboot和Redis整合的更多相关文章

  1. redis(七)---- SpringBoot和redis整合

    SpringBoot和Redis整合非常简单 添加pom依赖 <dependency> <groupId>org.springframework.boot</groupI ...

  2. SpringBoot日记——Redis整合

    上一篇文章,简单记录了一下缓存的使用方法,这篇文章将把我们熟悉的redis整合进来. 那么如何去整合呢?首先需要下载和安装,为了使用方便,也可以做环境变量的配置. 下载和安装的方法,之前有介绍,在do ...

  3. SpringBoot + Mybatis + Redis 整合入门项目

    这篇文章我决定一改以往的风格,以幽默风趣的故事博文来介绍如何整合 SpringBoot.Mybatis.Redis. 很久很久以前,森林里有一只可爱的小青蛙,他迈着沉重的步伐走向了找工作的道路,结果发 ...

  4. 7.springboot+mybatis+redis整合

    选择生成的依赖 选择保存的工程路径 查询已经生成的依赖,并修改mysql的版本 <dependencies> <dependency> <groupId>org.s ...

  5. SpringBoot+Redis整合

    SpringBoot+Redis整合 1.在pom.xml添加Redis依赖 <!--整合Redis--> <dependency> <groupId>org.sp ...

  6. springboot+shiro+redis(单机redis版)整合教程-续(添加动态角色权限控制)

    相关教程: 1. springboot+shiro整合教程 2. springboot+shiro+redis(单机redis版)整合教程 3. springboot+shiro+redis(集群re ...

  7. springboot+shiro+redis(集群redis版)整合教程

    相关教程: 1. springboot+shiro整合教程 2. springboot+shiro+redis(单机redis版)整合教程 3.springboot+shiro+redis(单机red ...

  8. springboot+shiro+redis(单机redis版)整合教程

    相关教程: 1. springboot+shiro整合教程 2. springboot+shiro+redis(集群redis版)整合教程 3.springboot+shiro+redis(单机red ...

  9. springboot和Redis集群版的整合

    此篇接上一个文章springboot和Redis单机版的整合 https://www.cnblogs.com/lin530/p/12019023.html 下面接着介绍和Redis集群版的整合. 1. ...

随机推荐

  1. 配置Apache控制浏览器端的缓存的有效期

    这个非常有用的优化,mod_expires可以减少20-30%左右的重复请求,让重复的用户对指定的页面请求结果都CACHE在本地,根本不向服务器发出请求.但要注意更新快的文件不要这么做.这个模块控制服 ...

  2. 域账号修改后,导致vs中的git连接失败

    域账号修改后,导致vs中的git连接失败, fatal: Authentication failed for https://blog.csdn.net/qq_34665539/article/det ...

  3. 微服务发展规划(PS 大概分层未细化到具体系统)

    网关层 标准化认证业务前台 前置HTML 基于VUE的浏览器端渲染等特性,完全可以看成一个独立的层业务中台 a. 各个系统的业务功能,以业务功能为单位拆分出的业务服务. b. 配合业务前台所产生的聚合 ...

  4. 最新 盛天网络java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.盛天网络等10家互联网公司的校招Offer,因为某些自身原因最终选择了盛天网络.6.7月主要是做系统复习.项目复盘.Leet ...

  5. eNSP——OSPF的基础配置

    原理: 模拟实验: 拓扑图: 实验编址: 1.基本配置 根据实验编址和拓扑图进行基本配置,并测试连通性. 2.部署OSPF网络 首先使用ospf命令创建并运行OSPF,1代表进程号 接着使用area命 ...

  6. talend工具整理文件并出力文件到Excel当中

    问题描述: 每天都会生成一定的txt文件,txt文件当中含有复数个个人的信息,把每个个人信息都抽出来之后放到Excel文件的一览里面. 解决思路: 1.txt文件里面的信息有多件,每一件生成一个临时的 ...

  7. nginx 为什么受欢迎?

    优势:1.高并发 2.可扩展性 3.高可靠性 4.热部署 5.BSD许可证 如何做到以上优势呢?高并发:异步io非阻塞,占用更少资源,支持更多连接可扩展:模块化设计,第三方模块多高可靠:核心框架代码的 ...

  8. FastJson反序列化获取不到值

    今天碰到一个问题,使用fastjson反序列化,就是将JSON解析成javaBean时,一个字段值为null.后面经查,是JavaBean中的set方法写错了,fastJson解析的是利用反射通过se ...

  9. Postman和jmeter的区别

    1.创建接口用例集(没区别) Postman是Collections,Jmeter是线程组,没什么区别. 2.步骤的实现(有区别) Postman和jmeter都是创建http请求 区别1:postm ...

  10. python_openCV例程遇到error: (-215) !empty() in function cv::CascadeClassifier::detectMultiScale的简单解决方法

    需要把haar分类器训练的结果xml数据放在名为haarcascades的文件夹下进行调用. 将: face_cascade = cv2.CascadeClassifier('haarcascade_ ...