您的位置:首页 > 数据库 > Redis

spring+redis集成,以及遇到的异常 Could not resolve placeholder的解决

2018-11-19 19:36 1121 查看

spring+redis

  1. 概述

    本文主要为了集成spring和redis,以及记录解决中间遇到的问题。

  2. 什么是redis?

    Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

    换句话说,Redis就像是一个HashMap,不过不是在JVM中运行,而是以一个独立进程的形式运行。

    一般说来,会被当作缓存使用。 因为它比数据库(mysql)快,所以常用的数据,可以考虑放在这里,这样就提供了性能。

  3. redis安装

    redis官网:http://redis.io
    windows版本的下载地址是: http://redis.io/download
    点击进去之后会跳转到: https://github.com/mythz/redis-windows是一个开源项目,所以从github上下载后,需要自己编译生成exe文件,这里给出我使用的编译好的redis-64.3.0.503.zip

    其中redis-server.exe是服务器启动程序,redis-cli.exe是客户端启动程序。具体的命令使用不一一赘述,在网上都有很多这种命令的介绍和使用,给出官方手册http://www.redis.cn/commands.html和简单教程http://www.runoob.com/redis/redis-commands.html

  4. jedis

    4.1什么是jedis?

    常见命令中,使用各种Redis自带客户端的命令行方式访问Redis服务。 而在实际工作中却需要用到Java代码才能访问,使用第三方jar包 :Jedis就能方便地访问Redis的各种服务了。

    4.2这里给出一个简单的测试案例TestRedisManyCommands.java

    其中的依赖,在后续spring+redis的pom文件中。

    import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import org.junit.Before;import org.junit.Test;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;public class TestRedisManyCommands {JedisPool pool;Jedis jedis;@Beforepublic void setUp() {jedis = new Jedis("localhost");}/*** Redis存储初级的字符串* CRUD*/@Testpublic void testBasicString(){//-----添加数据----------jedis.set("name","meepo");//向key-->name中放入了value-->meepoSystem.out.println(jedis.get("name"));//执行结果:meepo//-----修改数据-----------//1、在原来基础上修改jedis.append("name","dota");   //很直观,类似map 将dota append到已经有的value之后System.out.println(jedis.get("name"));//执行结果:meepodota//2、直接覆盖原来的数据jedis.set("name","poofu");System.out.println(jedis.get("name"));//执行结果:poofu//删除key对应的记录jedis.del("name");System.out.println(jedis.get("name"));//执行结果:null/*** mset相当于* jedis.set("name","meepo");* jedis.set("dota","poofu");*/jedis.mset("name","meepo","dota","poofu");System.out.println(jedis.mget("name","dota"));}/*** jedis操作Map*/@Testpublic void testMap(){Map<String,String> user=new HashMap<String,String>();user.put("name","meepo");user.put("pwd","password");jedis.hmset("user",user);//取出user中的name,执行结果:[meepo]-->注意结果是一个泛型的List//第一个参数是存入redis中map对象的key,后面跟的是放入map中的对象的key,后面的key可以跟多个,是可变参数List<String> rsmap = jedis.hmget("user", "name");System.out.println(rsmap);//删除map中的某个键值jedis.hdel("user","pwd");System.out.println(jedis.hmget("user", "pwd")); //因为删除了,所以返回的是nullSystem.out.println(jedis.hlen("user")); //返回key为user的键中存放的值的个数1System.out.println(jedis.exists("user"));//是否存在key为user的记录 返回trueSystem.out.println(jedis.hkeys("user"));//返回map对象中的所有key  [pwd, name]System.out.println(jedis.hvals("user"));//返回map对象中的所有value  [meepo, password]Iterator<String> iter=jedis.hkeys("user").iterator();while (iter.hasNext()){String key = iter.next();System.out.println(key+":"+jedis.hmget("user",key));}}/*** jedis操作List*/@Testpublic void testList(){//开始前,先移除所有的内容jedis.del("java framework");// 第一个是key,第二个是起始位置,第三个是结束位置,jedis.llen获取长度 -1表示取得所有System.out.println(jedis.lrange("java framework",0,-1));//先向key java framework中存放三条数据jedis.lpush("java framework","spring");jedis.lpush("java framework","struts");jedis.lpush("java framework","hibernate");//再取出所有数据jedis.lrange是按范围取出,// 第一个是key,第二个是起始位置,第三个是结束位置,jedis.llen获取长度 -1表示取得所有System.out.println(jedis.lrange("java framework",0,-1));}/*** jedis操作Set*/@Testpublic void testSet(){//添加jedis.sadd("sname","meepo");jedis.sadd("sname","dota");jedis.sadd("sname","poofu");jedis.sadd("sname","noname");//移除nonamejedis.srem("sname","noname");System.out.println(jedis.smembers("sname"));//获取所有加入的valueSystem.out.println(jedis.sismember("sname", "meepo"));//判断 meepo 是否是sname集合的元素System.out.println(jedis.srandmember("sname"));System.out.println(jedis.scard("sname"));//返回集合的元素个数}@Testpublic void test() throws InterruptedException {//keys中传入的可以用通配符System.out.println(jedis.keys("*")); //返回当前库中所有的key  [sose, sanme, name, dota, foo, sname, java framework, user, braand]System.out.println(jedis.keys("*name"));//返回的sname   [sname, name]System.out.println(jedis.del("sanmdde"));//删除key为sanmdde的对象  删除成功返回1 删除失败(或者不存在)返回 0System.out.println(jedis.ttl("sname"));//返回给定key的有效时间,如果是-1则表示永远有效jedis.setex("timekey", 10, "min");//通过此方法,可以指定key的存活(有效时间) 时间为秒Thread.sleep(5000);//睡眠5秒后,剩余时间将为<=5System.out.println(jedis.ttl("timekey"));   //输出结果为5jedis.setex("timekey", 1, "min");        //设为1后,下面再看剩余时间就是1了System.out.println(jedis.ttl("timekey"));  //输出结果为1System.out.println(jedis.exists("key"));//检查key是否存在System.out.println(jedis.rename("timekey","time"));System.out.println(jedis.get("timekey"));//因为移除,返回为nullSystem.out.println(jedis.get("time")); //因为将timekey 重命名为time 所以可以取得值 min//jedis 排序//注意,此处的rpush和lpush是List的操作。是一个双向链表(但从表现来看的)jedis.del("a");//先清除数据,再加入数据进行测试jedis.rpush("a", "1");jedis.lpush("a","6");jedis.lpush("a","3");jedis.lpush("a","9");System.out.println(jedis.lrange("a",0,-1));// [9, 3, 6, 1]System.out.println(jedis.sort("a")); //[1, 3, 6, 9]  //输入排序后结果System.out.println(jedis.lrange("a",0,-1));}}
  5. Spring+Redis

    5.1pom.xml

    <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.volleyfo</groupId><artifactId>jedis</artifactId><version>1.0-SNAPSHOT</version><dependencies><!-- redis相关jar --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.10</version><scope>test</scope></dependency><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId><version>1.5.0.RELEASE</version></dependency><!-- spring 相关jar --><!-- Spring 4.3.3 --><!-- Core Container 核心容器 --><!-- 核心工具类,Spring其它模块大量使用Spring-core --><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>4.3.3.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>4.3.3.RELEASE</version></dependency><!-- 运行时Spring容器 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.3.3.RELEASE</version></dependency><!-- Spring容器对第三方包的集成 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>4.3.3.RELEASE</version><type>jar</type><scope>compile</scope></dependency><!-- Spring定义Bean的支持 --><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>4.3.3.RELEASE</version></dependency><!-- 使用表达式语言在运行时查询和操作对象 --><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>4.3.3.RELEASE</version></dependency><!-- End Core Container 核心容器 --><!-- AOP --><!-- 基于代理的AOP支持 --><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>4.3.3.RELEASE</version></dependency><!-- 基于AspectJ的AOP支持 --><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>4.3.3.RELEASE</version></dependency><!-- aspectj --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.8.5</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.5</version></dependency><!-- End AOP --><!-- web --><!-- 提供基础的web集成的功能,在web项目中提供Spring容器 --><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>4.3.3.RELEASE</version></dependency><!-- 提供基于Servlet的SpringMVC --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.3.3.RELEASE</version></dependency><!-- 提供WebSocket功能 --><dependency><groupId>org.springframework</groupId><artifactId>spring-websocket</artifactId><version>4.3.3.RELEASE</version></dependency><!-- 提供Portlet环境支持 --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc-portlet</artifactId><version>4.3.3.RELEASE</version></dependency><!-- json --><dependency><groupId>org.codehaus.jackson</groupId><artifactId>jackson-core-lgpl</artifactId><version>1.9.6</version></dependency><dependency><groupId>org.codehaus.jackson</groupId><artifactId>jackson-core-asl</artifactId><version>1.9.4</version></dependency><dependency><groupId>org.codehaus.jackson</groupId><artifactId>jackson-mapper-asl</artifactId><version>1.9.4</version></dependency><dependency><groupId>org.codehaus.jackson</groupId><artifactId>jackson-mapper-lgpl</artifactId><version>1.9.6</version></dependency><!-- End web --><!-- DataAccess/Integration 数据访问/集成 --><!-- 提供以JDBC访问数据库的支持 --><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>4.3.3.RELEASE</version></dependency><!-- 提供编程式和声明式的事务支持 --><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>4.3.3.RELEASE</version></dependency><!-- 提供对 对象/关系映射技术的支持 --><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>4.3.3.RELEASE</version></dependency><!-- 提供对JMS的支持 --><dependency><groupId>org.springframework</groupId><artifactId>spring-jms</artifactId><version>4.3.3.RELEASE</version></dependency><!-- End DataAccess/Integration 数据访问/集成 --><dependency><groupId>org.codehaus.jackson</groupId><artifactId>jackson-mapper-asl</artifactId><version>1.9.13</version></dependency><!-- End Spring 4.0 --><!-- mybatis jar --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.1</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.0</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.21</version></dependency><dependency><groupId>c3p0</groupId><artifactId>c3p0</artifactId><version>0.9.1.2</version><type>jar</type></dependency><!-- 打印日志 --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.22</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.22</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><!-- jsp jar --><!-- JSP相关 --><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jsp-api</artifactId><version>2.0</version><scope>provided</scope></dependency></dependencies></project>

    5.2 applicationContext.xml

    5.3 redis.properties

    #ip地址redis.hostName=127.0.0.1#端口号redis.port=6379#如果有密码redis.password=#客户端超时时间单位是毫秒 默认是2000redis.timeout=2000#最大空闲数redis.maxIdle=10#连接池的最大数据库连接数。设为0表示无限制,如果是jedis 2.4以后用redis.maxTotalredis.maxActive=10#控制一个pool可分配多少个jedis实例,用来替换上面的redis.maxActive,如果是jedis 2.4以后用该属性redis.maxTotal=10#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。redis.maxWaitMillis=1000#连接的最小空闲时间 默认1800000毫秒(30分钟)redis.minEvictableIdleTimeMillis=300000#每次释放连接的最大数目,默认3redis.numTestsPerEvictionRun=1024#逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1redis.timeBetweenEvictionRunsMillis=30000#是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个redis.testOnBorrow=false#在空闲时检查有效性, 默认falseredis.testWhileIdle=false

    5.4 TestRedis.java

    import java.util.HashMap;import java.util.Map;import com.volleyfo.RedisUtil;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestRedis {public static void main(String[] args) throws Exception {ApplicationContext context=new ClassPathXmlApplicationContext("classpath:applicationContext.xml");RedisUtil redisUtil=(RedisUtil) context.getBean("redisUtil");//=====================testString======================redisUtil.set("name", "volleyfo");System.out.println(redisUtil.get("name"));redisUtil.del("name");System.out.println(redisUtil.get("name"));//=====================testNumber======================long incr = redisUtil.incr("number", 1);System.out.println(incr);incr =redisUtil.incr("number", 1);System.out.println(incr);//=====================testMap======================Map<String,Object> map=new HashMap<String,Object>();map.put("name", "meepo");map.put("pwd", "password");redisUtil.hmset("user", map);System.out.println(redisUtil.hget("user","name"));}}

    5.5 RedisUtil.java

    封装了 RedisTemplate 这个类,以提供更为便利的 对于 Redis 的访问

    package com.volleyfo;import java.util.List;import java.util.Map;import java.util.Set;import java.util.concurrent.TimeUnit;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.util.CollectionUtils;/*** 基于spring和redis的redisTemplate工具类* 针对所有的hash 都是以h开头的方法* 针对所有的Set 都是以s开头的方法                    不含通用方法* 针对所有的List 都是以l开头的方法*/public class RedisUtil {private RedisTemplate<String, Object> redisTemplate;public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {this.redisTemplate = redisTemplate;}//=============================common============================/*** 指定缓存失效时间* @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) {e.printStackTrace();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) {e.printStackTrace();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) {e.printStackTrace();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) {e.printStackTrace();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) {e.printStackTrace();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) {e.printStackTrace();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) {e.printStackTrace();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) {e.printStackTrace();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) {e.printStackTrace();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) {e.printStackTrace();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) {e.printStackTrace();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) {e.printStackTrace();return 0;}}/*** 获取set缓存的长度* @param key 键* @return*/public long sGetSetSize(String key){try {return redisTemplate.opsForSet().size(key);} catch (Exception e) {e.printStackTrace();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) {e.printStackTrace();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) {e.printStackTrace();return null;}}/*** 获取list缓存的长度* @param key 键* @return*/public long lGetListSize(String key){try {return redisTemplate.opsForList().size(key);} catch (Exception e) {e.printStackTrace();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) {e.printStackTrace();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) {e.printStackTrace();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) {e.printStackTrace();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) {e.printStackTrace();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) {e.printStackTrace();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) {e.printStackTrace();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) {e.printStackTrace();return 0;}}}
  6. 出现的问题与解决

    6.1异常 Could not resolve placeholder

    异常信息

    Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'jedisPoolConfig' defined in class path resource [applicationContext.xml]: Could not resolve placeholder 'redis.maxIdle' in string value "${redis.maxIdle}"; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'redis.maxIdle' in string value "${redis.maxIdle}"

    原因:新版的spring(4.3.3)不支持以下的加载方式(旧版支持,比如4.0.9)

    <context:property-placeholder location="classpath:*.properties"/>

    改为,解决

    <!-- 加载配置文件 --><context:property-placeholder location="classpath:redis.properties"/>
阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐