github地址:https://github.com/jiangcaijun/ssmhtml
github版本号java
<!-- config redis data and client jar--> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.7.1.RELEASE</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.8.1</version> </dependency>
注意:起初,我将redis.clients jedis的version设为 2.1.0 ,致使jedis.close()方法不存在。将其版本号升高便可。node
redis.minIdle=5 redis.maxIdle=10 redis.maxTotal=50 redis.maxWaitMillis=1500 redis.testOnBorrow=true redis.numTestsPerEvictionRun=1024 redis.timeBetweenEvictionRunsMillis=30000 redis.minEvictableIdleTimeMillis=1800000 redis.softMinEvictableIdleTimeMillis=10000 redis.testWhileIdle=true redis.blockWhenExhausted=false #redis单机版信息 redis.host=182.254.xxx.xx redis.port=7001 #redis集群版信息 cluster.host1=182.254.xxx.xx cluster.port1=7001 cluster.host2=182.254.xxx.xx cluster.port2=7002 cluster.host3=182.254.xxx.xx cluster.port3=7003 cluster.host4=182.254.xxx.xx cluster.port4=7004 cluster.host5=182.254.xxx.xx cluster.port5=7005 cluster.host6=182.254.xxx.xx cluster.port6=7006
<!-- 引入jdbc、redis等配置文件 --> <context:property-placeholder location="classpath:*.properties" />
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"> <!-- jedis链接池配置 --> <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"> <!-- 最小空闲链接数 --> <property name="minIdle" value="${redis.minIdle}"/> <!-- 最大空闲链接数 --> <property name="maxIdle" value="${redis.maxIdle}"/> <!-- 最大链接数 --> <property name="maxTotal" value="${redis.maxTotal}"/> <!-- 获取链接时的最大等待毫秒数,小于零:阻塞不肯定的时间,默认-1 --> <property name="maxWaitMillis" value="${redis.maxWaitMillis}"/> <!-- 在获取链接的时候检查有效性, 默认false --> <property name="testOnBorrow" value="${redis.testOnBorrow}"/> <!-- 每次释放链接的最大数目 --> <property name="numTestsPerEvictionRun" value="${redis.numTestsPerEvictionRun}"/> <!-- 释放链接的扫描间隔(毫秒) --> <property name="timeBetweenEvictionRunsMillis" value="${redis.timeBetweenEvictionRunsMillis}"/> <!-- 链接最小空闲时间 --> <property name="minEvictableIdleTimeMillis" value="${redis.minEvictableIdleTimeMillis}"/> <!-- 链接空闲多久后释放, 当空闲时间>该值 且 空闲链接>最大空闲链接数 时直接释放 --> <property name="softMinEvictableIdleTimeMillis" value="${redis.softMinEvictableIdleTimeMillis}"/> <!-- 在空闲时检查有效性, 默认false --> <property name="testWhileIdle" value="${redis.testWhileIdle}"/> <!-- 链接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true --> <property name="blockWhenExhausted" value="${redis.blockWhenExhausted}"/> </bean> <!-- 单机版 --> <!-- 配置jedis链接池 --> <bean class="redis.clients.jedis.JedisPool"> <constructor-arg name="poolConfig" ref="poolConfig"/> <constructor-arg name="host" value="${redis.host}" /> <constructor-arg name="port" value="${redis.port}" /> </bean> <!-- 配置单机版工具类 --> <bean class="com.ssm.redis.RedisPool" /> </beans>
两种方案:使用jedis链接池(单机版)和jedis集群,上述配置为单机版linux
通常生产环境使用集群,开发环境使用单机版git
使用哪一种,能够将另外一种注释掉github
注意:若是在注入工具类的时候是按类型注入的话,那么不使用的工具类必须注释掉redis
集群版以下:spring
<!-- 集群版 --> <!-- 配置jedis集群 --> <bean class="redis.clients.jedis.JedisCluster"> <constructor-arg name="nodes"> <set> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="${cluster.host1}" /> <constructor-arg name="port" value="${cluster.port1}" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="${cluster.host2}" /> <constructor-arg name="port" value="${cluster.port2}" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="${cluster.host3}" /> <constructor-arg name="port" value="${cluster.port3}" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="${cluster.host4}" /> <constructor-arg name="port" value="${cluster.port4}" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="${cluster.host5}" /> <constructor-arg name="port" value="${cluster.port5}" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="${cluster.host6}" /> <constructor-arg name="port" value="${cluster.port6}" /> </bean> </set> </constructor-arg> </bean> <!--配置集群版工具类--> <bean class="com.ssm.redis.RedisCluster" />
package com.ssm.redis; /** * Redis工具接口 * */ public interface RedisUtil { /** * 保存 * * @param key * 键 * @param value * zhi */ public void set(String key, String value); /** * 保存并设置生存时间 * * @param key * 键 * @param value * 值 * @param seconds * 时间,秒s为单位 */ public void set(String key, String value, Integer seconds); /** * 根据key查询 * * @param key * 键 * @return 值 */ public String get(String key); /** * 删除 * * @param key * 键 */ public void del(String key); /** * 根据key设置生存时间 * * @param key * 键 * @param seconds * 时间,秒s为单位 */ public void expire(String key, Integer seconds); /** * value加一<br/> * 注意key必须是整型 * * @param key * 键 * @return 加一后的结果 */ public Long incr(String key); }
package com.ssm.redis; import org.springframework.beans.factory.annotation.Autowired; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; /** * Redis链接池工具类 */ public class RedisPool implements RedisUtil { @Autowired private JedisPool jedisPool; @Override public void set(String key, String value) { Jedis jedis = this.getJedis(); jedis.set(key, value); this.releaseJedis(jedis); } @Override public void set(String key, String value, Integer seconds) { Jedis jedis = this.getJedis(); jedis.set(key, value); jedis.expire(key, seconds); this.releaseJedis(jedis); } @Override public String get(String key) { Jedis jedis = this.getJedis(); String result = jedis.get(key); this.releaseJedis(jedis); return result; } @Override public void del(String key) { Jedis jedis = this.getJedis(); jedis.del(key); this.releaseJedis(jedis); } @Override public void expire(String key, Integer seconds) { Jedis jedis = this.getJedis(); jedis.expire(key, seconds); this.releaseJedis(jedis); } @Override public Long incr(String key) { Jedis jedis = this.getJedis(); Long count = jedis.incr(key); this.releaseJedis(jedis); return count; } /** * 获取Jedis链接 * * @return Jedis链接 */ private Jedis getJedis() { return this.jedisPool.getResource(); } /** * 释放Jedis链接,返还到链接池 * * @param jedis * jedis链接 */ private void releaseJedis(Jedis jedis) { jedis.close(); } }
package com.ssm.redis; import org.springframework.beans.factory.annotation.Autowired; import redis.clients.jedis.JedisCluster; /** * Redis集群工具类 */ public class RedisCluster implements RedisUtil { @Autowired private JedisCluster jedisCluster; @Override public void set(String key, String value) { this.jedisCluster.set(key, value); } @Override public void set(String key, String value, Integer seconds) { this.jedisCluster.set(key, value); this.jedisCluster.expire(key, seconds); } @Override public String get(String key) { return this.jedisCluster.get(key); } @Override public void del(String key) { this.jedisCluster.del(key); } @Override public void expire(String key, Integer seconds) { this.jedisCluster.expire(key, seconds); } @Override public Long incr(String key) { return this.jedisCluster.incr(key); } /** * 获取JedisCluster对象 * 能够直接使用它来进行redis操做 * * @return JedisCluster对象 */ public JedisCluster getJedisCluster() { return jedisCluster; } }
@RequestMapping(value = "/guest", method = RequestMethod.GET) public String guest(Model model,String parameter1) { LOG.info("进入guest的index"); String key = parameter1; // 1.从缓存中命中 try { String redisJson = redisUtil.get(key); if (StringUtils.isNotBlank(redisJson)) { LOG.info("从缓存中命中:"+redisJson); }else{ // 2.若是没被命中,执行原有逻辑 LOG.info("没被命中"); // 此处模拟从数据库获取数据 String json = "getFromDB()"; // 3.将查询出来的结果加入缓存 redisUtil.set(key, json); redisUtil.expire(key, 60 * 60 * 24); } } catch (Exception e) { e.printStackTrace(); } return "guest/guestIndex"; }
注意:若是redis没有启动,会在catch块中报 JedisConnectionException: Could not get a resource from the poolsql
浏览器地址栏输入 :http://127.0.0.1:8080/项目名/guest?parameter1=1,控制台输出:数据库
[ INFO ] 进入guest的index [ INFO ] 没被命中
浏览器刷新页面,控制台输出:
[ INFO ] 进入guest的index [ INFO ] 从缓存中命中:getFromDB()
测试成功,在部署redis的系统上登陆 redis-cli,利用get命令,也能够查询到该key-value值
对于某些需求,例如只须要作查询的项目,或者部分数据只作查询,不作增删改的项目(例如省市区表等),能够利用aop与redis,查询数据时先从redis中查询,若是查询不到,则到数据库中查询,而后将数据库中查询的数据放到redis中一份,下次查询时就能直接从redis中查到,不须要查询数据库了。
连接:SSM框架_6(spring与redis整合)(spring+ redis + aop ) - 开源小菜鸟2333
连接:
为了解决Jedis经过公网IP没法连接上redis的状况:DENIED Redis is running in protected mode because protected mode is enabled, no bind address was spe_NoSQL_第七城市
修改默认端口号为7001后,linux下客户端如何访问新port:./redis-cli -h 127.0.0.1 -p 7001linux redis-cli 根据端口号进入交互页面-CSDN问答