spring集成redis

ゝ一世哀愁。 2022-03-30 09:44 296阅读 0赞

spring集成redis

  • redis的安装
  • redis的常用配置
  • 使用配置文件的方式启动
  • 停止redis服务
  • redis的配置信息
  • redis与spring整合的配置文件
  • RedisCacheManager
  • pom.xml

redis的安装

  • 将redis的安装包解压到/usr/local下
  • sudo make,生成
  • sudo make install,将redis的命令安装到/usr/bin/目录

redis的常用配置

以下配置都在redis.conf文件中

  1. bind 127.0.0.1#把这行代码注释,因为要远程访问
  2. port 6379#可以修改,默认6379
  3. daemonize no|yes
  4. 是否以守护进程运行
  5. 如果以守护进程运行,则不会在命令行阻塞,类似于服务
  6. 如果以非守护进程运行,则当前终端被阻塞,无法使用
  7. 推荐改为yes,以守护进程运行
  8. dbfilename dump.rdb # 数据文件名称
  9. dir . #数据文件存储路径,推荐改为:dir /var/lib/redis

使用配置文件的方式启动

  1. sudo cp /usr/local/redis/redis.conf /etc/redis/
  2. sudo redis-server /etc/redis/redis.conf

停止redis服务

  1. ps ajx|grep redis
  2. sudo kill -9 redis的进程id

redis的配置信息

相当于数据的配置

  1. redis.host=192.168.56.128
  2. redis.port=6379
  3. #redis.password=""
  4. redis.database=0
  5. redis.maxIdle=400
  6. redis.maxTotal=6000
  7. redis.maxWaitMillis=1000
  8. redis.blockWhenExhausted=true
  9. redis.testOnBorrow=true
  10. redis.timeout=100000
  11. defaultCacheExpireTime=60

redis与spring整合的配置文件

  1. <!-- redis数据源 -->
  2. <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
  3. <!-- 最大空闲数 -->
  4. <property name="maxIdle" value="${redis.maxIdle}" />
  5. <!-- 最大空连接数 -->
  6. <property name="maxTotal" value="${redis.maxTotal}" />
  7. <!-- 最大等待时间 -->
  8. <property name="maxWaitMillis" value="${redis.maxWaitMillis}" />
  9. <!-- 连接超时时是否阻塞,false时报异常,ture阻塞直到超时, 默认true -->
  10. <property name="blockWhenExhausted" value="${redis.blockWhenExhausted}" />
  11. <!-- 返回连接时,检测连接是否成功 -->
  12. <property name="testOnBorrow" value="${redis.testOnBorrow}" />
  13. </bean>
  14. <!-- Spring-redis连接池管理工厂 -->
  15. <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
  16. <!-- IP地址 -->
  17. <property name="hostName" value="${redis.host}" />
  18. <!-- 端口号 -->
  19. <property name="port" value="${redis.port}" />
  20. <!-- 超时时间 默认2000-->
  21. <property name="timeout" value="${redis.timeout}" />
  22. <!-- 连接池配置引用 -->
  23. <property name="poolConfig" ref="poolConfig" />
  24. <!-- usePool:是否使用连接池 -->
  25. <property name="usePool" value="true"/>
  26. </bean>
  27. <!-- redis template definition -->
  28. <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
  29. <property name="connectionFactory" ref="jedisConnectionFactory" />
  30. <property name="keySerializer">
  31. <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
  32. </property>
  33. <property name="valueSerializer">
  34. <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
  35. </property>
  36. <property name="hashKeySerializer">
  37. <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
  38. </property>
  39. <property name="hashValueSerializer">
  40. <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
  41. </property>
  42. <!--开启事务 -->
  43. <property name="enableTransactionSupport" value="true"></property>
  44. </bean>
  45. <!--自定义redis工具类,在需要缓存的地方注入此类 -->
  46. <bean id="redisrCacheManager" class="com.ssgl.util.RedisCacheManager">
  47. <property name="redisTemplate" ref="redisTemplate" />
  48. </bean>
  49. <!--redis 结束-->

com.ssgl.util.RedisCacheManager,这个类是一个工具类,可以根据自己的需要编写

RedisCacheManager

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

pom.xml

  1. <dependency>
  2. <groupId>redis.clients</groupId>
  3. <artifactId>jedis</artifactId>
  4. <version>2.9.0</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.data</groupId>
  8. <artifactId>spring-data-redis</artifactId>
  9. <version>1.8.6.RELEASE</version>
  10. </dependency>

发表评论

表情:
评论列表 (有 0 条评论,296人围观)

还没有评论,来说两句吧...

相关阅读

    相关 spring集成redis

        sprig集成redis,我的项目架构是springMVC+spring+ibatis 用maven管理 ,下面看代码 1. 在pom文件引入redis依赖包

    相关 Spring集成Redis

    最近在做一个关于群聊的项目,由于聊天要求实时性,不可能直接访问数据库,所以使用了Redis来做缓存,这里将使用过程中遇到的问题记录一下。 使用Redis之前需要合理设计存储