Spring和Redis整合详解
Spring和Redis整合详解
官方主页
Spring
Spring Redis
概述
Redis是一个开源(BSD许可)的内存数据结构存储,用作数据库,缓存和消息代理。
简单来说,它是一个以(key,value)的形式存储数据的数据库.
官网:https://redis.io/download 去下载对应的版本。
Spring已经为我们对Redis做了很好的封装,我们需要做的就是配置和Sercice的调用。
Git地址:
Gitee
项目地址:
品茗IT-同步发布
品茗IT 提供在线支持:
一键快速构建Spring项目工具
一键快速构建SpringBoot项目工具
一键快速构建SpringCloud项目工具
一站式Springboot项目生成
如果大家正在寻找一个java的学习环境,或者在开发中遇到困难,可以加入我们的java学习圈,点击即可加入,共同学习,节约学习时间,减少很多在学习中遇到的难题。
开始搭建
依赖Jar包
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>${redis.version}</version>
</dependency>
<dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId><version>${spring.redis.version}</version>
</dependency>
Spring-redis配置
在spring的xml中,配置redis的连接池,并按照spring的规范,定义redisTemplate,方便service的调用。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-4.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.0.xsd "><bean id="annotationPropertyConfigurerRedis"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="order" value="1" /><property name="ignoreUnresolvablePlaceholders" value="true" /><property name="locations"><list><value>classpath:redis.properties</value></list></property></bean><!-- redis数据源 --><bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"><!-- 最大空闲数 --><property name="maxIdle" value="${redis.maxIdle}" /><!-- 最大空连接数 --><property name="maxTotal" value="${redis.maxTotal}" /><!-- 最大等待时间 --><property name="maxWaitMillis" value="${redis.maxWaitMillis}" /><!-- 返回连接时,检测连接是否成功 --><property name="testOnBorrow" value="${redis.testOnBorrow}" /></bean><!-- Spring-redis连接池管理工厂 --><bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"><!-- IP地址 --><property name="hostName" value="${redis.host}" /><!-- 端口号 --><property name="port" value="${redis.port}" /><property name="password" value="${redis.password}" /><!-- 超时时间 默认2000--><property name="timeout" value="${redis.timeout}" /><!-- 连接池配置引用 --><property name="poolConfig" ref="poolConfig" /><!-- usePool:是否使用连接池 --><property name="usePool" value="true"/></bean><!-- redis template definition --><bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"><property name="connectionFactory" ref="jedisConnectionFactory" /><property name="keySerializer"><bean class="org.springframework.data.redis.serializer.StringRedisSerializer" /></property><property name="valueSerializer"><bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" /></property><property name="hashKeySerializer"><bean class="org.springframework.data.redis.serializer.StringRedisSerializer" /></property><property name="hashValueSerializer"><bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" /></property><!--开启事务 --> <property name="enableTransactionSupport" value="true"></property> </bean><!--自定义redis工具类,在需要缓存的地方注入此类 --> <bean id="redisService" class="com.cff.springwork.redis.service.RedisService"> <constructor-arg name="redisTemplate" ref="redisTemplate" /> </bean>
</beans>
这里,我们用到了redis.properties配置文件。
redis.properties:
redis.maxTotal=10
redis.maxIdle=5
redis.maxWaitMillis=2000
redis.testOnBorrow=true
redis.host=192.168.0.1
redis.port=20806
redis.timeout=0
redis.password=test
redis.testWhileIdle=true
redis.timeBetweenEvictionRunsMillis=30000
redis.numTestsPerEvictionRun=50
Redis调用的service
我们可以编写一个完整的service,方便以后使用。
RedisService:
package com.cff.springwork.redis.service;import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ScanOptions;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.util.CollectionUtils;public class RedisService {private Logger log = LoggerFactory.getLogger(this.getClass());private final RedisTemplate<String, Object> redisTemplate;public RedisService(RedisTemplate<String, Object> redisTemplate) {this.redisTemplate = redisTemplate;}/*** 指定缓存失效时间** @param key 键* @param time 时间(秒)* @return*/public boolean expire(String key, long time) {try {if (time > 0) {redisTemplate.expire(key, time, TimeUnit.SECONDS);}return true;} catch (Exception e) {log.error("redis error: ", e);return false;}}/*** 根据key 获取过期时间** @param key 键 不能为null* @return 时间(秒) 返回0代表为永久有效*/public long getExpire(String key) {return redisTemplate.getExpire(key, TimeUnit.SECONDS);}/*** 判断key是否存在** @param key 键* @return true 存在 false不存在*/public boolean hasKey(String key) {try {return redisTemplate.hasKey(key);} catch (Exception e) {log.error("redis error: ", e);return false;}}/*** 删除缓存** @param key 可以传一个值 或多个*/@SuppressWarnings("unchecked")public void del(String... key) {if (key != null && key.length > 0) {if (key.length == 1) {redisTemplate.delete(key[0]);} else {redisTemplate.delete(CollectionUtils.arrayToList(key));}}}// ============================String=============================/*** 普通缓存获取** @param key 键* @return 值*/public Object get(String key) {return key == null ? null : redisTemplate.opsForValue().get(key);}/*** 普通缓存放入** @param key 键* @param value 值* @return true成功 false失败*/public boolean set(String key, Object value) {try {redisTemplate.opsForValue().set(key, value);return true;} catch (Exception e) {log.error("redis error: ", e);return false;}}/*** 普通缓存放入并设置时间** @param key 键* @param value 值* @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期* @return true成功 false 失败*/public boolean set(String key, Object value, long time) {try {if (time > 0) {redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);} else {set(key, value);}return true;} catch (Exception e) {log.error("redis error: ", e);return false;}}/*** 递增** @param key 键* @param by 要增加几(大于0)* @return*/public long incr(String key, long delta) {if (delta < 0) {throw new RuntimeException("递增因子必须大于0");}return redisTemplate.opsForValue().increment(key, delta);}/*** 递减** @param key 键* @param by 要减少几(小于0)* @return*/public long decr(String key, long delta) {if (delta < 0) {throw new RuntimeException("递减因子必须大于0");}return redisTemplate.opsForValue().increment(key, -delta);}// ================================Map=================================/*** HashGet** @param key 键 不能为null* @param item 项 不能为null* @return 值*/public Object hget(String key, String item) {return redisTemplate.opsForHash().get(key, item);}/*** 获取hashKey对应的所有键值** @param key 键* @return 对应的多个键值*/public Map<Object, Object> hmget(String key) {return redisTemplate.opsForHash().entries(key);}/*** HashSet** @param key 键* @param map 对应多个键值* @return true 成功 false 失败*/public boolean hmset(String key, Map<String, Object> map) {try {redisTemplate.opsForHash().putAll(key, map);return true;} catch (Exception e) {log.error("redis error: ", e);return false;}}/*** HashSet 并设置时间** @param key 键* @param map 对应多个键值* @param time 时间(秒)* @return true成功 false失败*/public boolean hmset(String key, Map<String, Object> map, long time) {try {redisTemplate.opsForHash().putAll(key, map);if (time > 0) {expire(key, time);}return true;} catch (Exception e) {log.error("redis error: ", e);return false;}}/*** 向一张hash表中放入数据,如果不存在将创建** @param key 键* @param item 项* @param value 值* @return true 成功 false失败*/public boolean hset(String key, String item, Object value) {try {redisTemplate.opsForHash().put(key, item, value);return true;} catch (Exception e) {log.error("redis error: ", e);return false;}}/*** 向一张hash表中放入数据,如果不存在将创建** @param key 键* @param item 项* @param value 值* @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间* @return true 成功 false失败*/public boolean hset(String key, String item, Object value, long time) {try {redisTemplate.opsForHash().put(key, item, value);if (time > 0) {expire(key, time);}return true;} catch (Exception e) {log.error("redis error: ", e);return false;}}/*** 删除hash表中的值** @param key 键 不能为null* @param item 项 可以使多个 不能为null*/public void hdel(String key, Object... item) {redisTemplate.opsForHash().delete(key, item);}/*** 判断hash表中是否有该项的值** @param key 键 不能为null* @param item 项 不能为null* @return true 存在 false不存在*/public boolean hHasKey(String key, String item) {return redisTemplate.opsForHash().hasKey(key, item);}/*** hash递增 如果不存在,就会创建一个 并把新增后的值返回** @param key 键* @param item 项* @param by 要增加几(大于0)* @return*/public double hincr(String key, String item, double by) {return redisTemplate.opsForHash().increment(key, item, by);}/*** hash递减** @param key 键* @param item 项* @param by 要减少记(小于0)* @return*/public double hdecr(String key, String item, double by) {return redisTemplate.opsForHash().increment(key, item, -by);}// ============================set=============================/*** 根据key获取Set中的所有值** @param key 键* @return*/public Set<Object> sGet(String key) {try {return redisTemplate.opsForSet().members(key);} catch (Exception e) {log.error("redis error: ", e);return null;}}/*** 根据value从一个set中查询,是否存在** @param key 键* @param value 值* @return true 存在 false不存在*/public boolean sHasKey(String key, Object value) {try {return redisTemplate.opsForSet().isMember(key, value);} catch (Exception e) {log.error("redis error: ", e);return false;}}/*** 将数据放入set缓存** @param key 键* @param values 值 可以是多个* @return 成功个数*/public long sSet(String key, Object... values) {try {return redisTemplate.opsForSet().add(key, values);} catch (Exception e) {log.error("redis error: ", e);return 0;}}/*** 将set数据放入缓存** @param key 键* @param time 时间(秒)* @param values 值 可以是多个* @return 成功个数*/public long sSetAndTime(String key, long time, Object... values) {try {Long count = redisTemplate.opsForSet().add(key, values);if (time > 0)expire(key, time);return count;} catch (Exception e) {log.error("redis error: ", e);return 0;}}/*** 获取set缓存的长度** @param key 键* @return*/public long sGetSetSize(String key) {try {return redisTemplate.opsForSet().size(key);} catch (Exception e) {log.error("redis error: ", e);return 0;}}/*** 移除值为value的** @param key 键* @param values 值 可以是多个* @return 移除的个数*/public long setRemove(String key, Object... values) {try {Long count = redisTemplate.opsForSet().remove(key, values);return count;} catch (Exception e) {log.error("redis error: ", e);return 0;}}// ===============================list=================================/*** 获取list缓存的内容** @param key 键* @param start 开始* @param end 结束 0 到 -1代表所有值* @return*/public List<Object> lGet(String key, long start, long end) {try {return redisTemplate.opsForList().range(key, start, end);} catch (Exception e) {log.error("redis error: ", e);return null;}}/*** 获取list缓存的长度** @param key 键* @return*/public long lGetListSize(String key) {try {return redisTemplate.opsForList().size(key);} catch (Exception e) {log.error("redis error: ", e);return 0;}}/*** 通过索引 获取list中的值** @param key 键* @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推* @return*/public Object lGetIndex(String key, long index) {try {return redisTemplate.opsForList().index(key, index);} catch (Exception e) {log.error("redis error: ", e);return null;}}/*** 将list放入缓存** @param key 键* @param value 值* @param time 时间(秒)* @return*/public boolean lSet(String key, Object value) {try {redisTemplate.opsForList().rightPush(key, value);return true;} catch (Exception e) {log.error("redis error: ", e);return false;}}/*** 将list放入缓存** @param key 键* @param value 值* @param time 时间(秒)* @return*/public boolean lSet(String key, Object value, long time) {try {redisTemplate.opsForList().rightPush(key, value);if (time > 0)expire(key, time);return true;} catch (Exception e) {log.error("redis error: ", e);return false;}}/*** 将list放入缓存** @param key 键* @param value 值* @param time 时间(秒)* @return*/public boolean lSet(String key, List<Object> value) {try {redisTemplate.opsForList().rightPushAll(key, value);return true;} catch (Exception e) {log.error("redis error: ", e);return false;}}/*** 将list放入缓存** @param key 键* @param value 值* @param time 时间(秒)* @return*/public boolean lSet(String key, List<Object> value, long time) {try {redisTemplate.opsForList().rightPushAll(key, value);if (time > 0)expire(key, time);return true;} catch (Exception e) {log.error("redis error: ", e);return false;}}/*** 根据索引修改list中的某条数据** @param key 键* @param index 索引* @param value 值* @return*/public boolean lUpdateIndex(String key, long index, Object value) {try {redisTemplate.opsForList().set(key, index, value);return true;} catch (Exception e) {log.error("redis error: ", e);return false;}}/*** 移除N个值为value** @param key 键* @param count 移除多少个* @param value 值* @return 移除的个数*/public long lRemove(String key, long count, Object value) {try {Long remove = redisTemplate.opsForList().remove(key, count, value);return remove;} catch (Exception e) {log.error("redis error: ", e);return 0;}}// ===============================sorted set=================================/*** 向有序集合添加一个成员的* * ZADD key score1 member1 [score2 member2] **/public boolean zadd(String key, Object member, double score, long time) {try {redisTemplate.opsForZSet().add(key, member, score);if (time > 0)expire(key, time);return true;} catch (Exception e) {log.error("redis error: ", e);return false;}}/*** ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 通过分数返回有序集合指定区间内的成员**/public Set<Object> zRangeByScore(String key, double minScore, double maxScore) {try {return redisTemplate.opsForZSet().rangeByScore(key, minScore, maxScore);} catch (Exception e) {log.error("redis error: ", e);return null;}}/*** ZSCORE key member 返回有序集中,成员的分数值**/public Double zscore(String key, Object member) {try {return redisTemplate.opsForZSet().score(key, member);} catch (Exception e) {log.error("redis error: ", e);return null;}}/*** ZRANK key member 返回有序集合中指定成员的索引**/public Long zrank(String key, Object member) {try {return redisTemplate.opsForZSet().rank(key, member);} catch (Exception e) {log.error("redis error: ", e);return null;}}/*** Zscan 迭代有序集合中的元素(包括元素成员和元素分值)**/public Cursor<ZSetOperations.TypedTuple<Object>> zscan(String key) {try {Cursor<ZSetOperations.TypedTuple<Object>> cursor = redisTemplate.opsForZSet().scan(key, ScanOptions.NONE);return cursor;} catch (Exception e) {log.error("redis error: ", e);return null;}}
}
详细完整代码,可以在Spring组件化构建中选择查看,并下载。
快速构建项目
Spring组件化构建
喜欢这篇文章么,喜欢就加入我们一起讨论Spring技术吧!
Spring和Redis整合详解相关推荐
- Spring和Ehcache整合详解
Spring和Ehcache整合详解 一.官方主页 Spring Cache 二.概述 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点. Spring 提供了对缓存功能的抽象: ...
- Spring和WebSocket整合详解
Spring和WebSocket整合详解 本篇编写日期较早,代码冗余较多,新博文:Spring和WebSocket整合并建立简单的Web聊天室 官方主页 Spring WebSocket 概述 Web ...
- Spring和Security整合详解
Spring和Security整合详解 一.官方主页 Spring Security 二.概述 Spring 是一个非常流行和成功的 Java 应用开发框架.Spring Security 基于 Sp ...
- Spring和Email整合详解
Spring和Email整合详解 官方主页 Spring Email 概述 Spring Mail API都在org.springframework.mail及其子包org.springframewo ...
- Spring和Ldap整合详解
Spring和Ldap整合详解 官方主页 Spring Spring Ldap 概述 LDAP(Light Directory Access Portocol),它是基于X.500标准的轻量级目录访问 ...
- Spring和Elasticsearch全文搜索整合详解
Spring和Elasticsearch全文搜索整合详解 一.概述 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web ...
- Spring和Spring Mvc整合详解
Spring和Spring Mvc整合详解 官方主页 Spring Spring Mvc SpringMvc 5,可以参考这一篇<Spring和Spring Mvc 5整合详解> 概述 S ...
- java集成redis集群_spring集成redis cluster详解
客户端采用最新的jedis 2.7 1.maven依赖: redis.clients jedis 2.7.3 2.增加spring 配置 classpath:connect-redis.propert ...
- Springboot整合redis配置详解
Springboot整合redis配置详解 1.导入依赖 <dependency><groupId>org.springframework.boot</groupId&g ...
最新文章
- php ajax弹出框传值,PHP_Yii2.0 模态弹出框+ajax提交表单,如题 我们使用模态弹出框+ajax - phpStudy...
- PHP学习总结(正则表达式、日期与时间)
- 排队器拦截_过滤器(Filter)和拦截器(Interceptor)的执行顺序和区别
- 转】.NET强名称工具(Sn.exe)使用详解
- MRBS开源会议室预订系统安装
- 解决内网用户不能正常访问内部WEB服务器问题
- CentOS 7 多网卡绑定
- wrong ELF class: ELFCLASS64
- WinForm timer 控件
- [家里蹲大学数学杂志]第392期中山大学2015年泛函分析考博试题回忆版
- 一键抠图工具有哪些?这5款亲测好用
- librdkafka 封装的C++类
- 软件构造之java类图
- 计算机游戏cpu,玩游戏选什么CPU 10款2017适合玩游戏的处理器推荐 (全文)
- phpstudy编写php扩展,PHP_探讨:如何编写PHP扩展,用C/C++扩展PHP的优缺点:优点 - phpStudy...
- 网络TDR测试软件,高分辨率TDR测试以及应用
- 肯德基创始人,在1009次失败后...
- 顺序表的定义及基本操作
- ikeas电子商务在covid 19时期就已经很糟糕了,它绝对崩溃了
- 男人健康八年一个转折
热门文章
- ar面部识别_世界首款面部识别App通过智能手机识别 加入增强现实AR功能
- Deep CARs:使用Pytorch学习框架实现迁移学习
- 学长带路学吉他,这几招足够了
- 百度网盘免费提速下载(另推荐两个最近很火的网盘)
- 推荐技术简历撰写指南(后附模板)
- SPOON资源库中查找表
- 聚名:cn这个域名好不好?Cn域名还有其他种类吗?
- 如何提高自己的学习能力?
- 长江职业学院计算机系分数线,长江职业学院录取分数线2021是多少分(附历年录取分数线)...
- 业务创新的“全集”:4个阶段及14种创新模式