JaveWeb项目使用redis缓存,封装工具类,存储String,Map,List,Set类型数据。及其它个人初步见解

第一步:依赖包导入(pom.xml)

<!-- 这两个包分别是Jedis与redisTemplate的使用,其实redisTemplate底层用到了Jedis,后面工具类我会说明两个用法区别-->
<dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.8.1</version>
</dependency>

<dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
            <version>1.7.1.RELEASE</version>
</dependency>​​​​​​​

 

第二步:数据源与配置文件(ApplicationContext-redis.xml  与  redis.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"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
                        http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.springframework.org/schema/aop 
                        http://www.springframework.org/schema/aop/spring-aop.xsd
                        http://www.springframework.org/schema/context 
                        http://www.springframework.org/schema/context/spring-context.xsd
                        http://www.springframework.org/schema/tx 
                        http://www.springframework.org/schema/tx/spring-tx.xsd
    ">
    <!-- 加载配置 -->
    <context:property-placeholder location="classpath:redis.properties" />
    
    <!-- jedis连接池配置 -->
   <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> 
        <property name="maxIdle" value="${redis.maxIdle}" />
        <property name="maxWaitMillis" value="${redis.maxWait}" />
        <property name="testOnBorrow" value="${redis.testOnBorrow}" />
        <property name="maxTotal" value="${redis.maxTotal}" /> 
        <property name="blockWhenExhausted" value="true" /> 
    </bean> 

    <!-- jedis连接工程的配置 -->
    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> 
        <property name="hostName" value="${redis.host}" />
        <property name="port" value="${redis.port}" />
        <property name="poolConfig" ref="jedisPoolConfig" /> 
        <property name="password" value="" />
        <property name="usePool" value="true"/> 
        <property name="timeout" value="${redis.timeout}"></property>
    </bean>

    <!-- redisTemplate配置 -->
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">   
        <property name="connectionFactory"   ref="jedisConnectionFactory" />  
         
         <!-- 对key的默认序列化器。默认值是StringSerializer -->
        <property name="keySerializer">   
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />   
        </property>      
        <!-- 是对value的默认序列化器,默认值是取自DefaultSerializer的JdkSerializationRedisSerializer。 -->
        <property name="valueSerializer">
            <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
        </property>  
        <!-- 存储Map时key需要的序列化配置 -->
        <property name="hashKeySerializer">     
           <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>     
        </property>  
        <!-- 存储Map时value需要的序列化配置 --> 
        <property name="hashValueSerializer">   
           <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>     
        </property> 
     </bean>
     
</beans>
#redis中心
#绑定的主机地址
redis.host=127.0.0.1
#指定Redis监听端口,默认端口为6379
redis.port=6379
#授权密码(可以不使用,默认无密码,如果需要,去安装目录下修改配置)
redis.password=******
#最大空闲数:空闲链接数大于maxIdle时,将进行回收
redis.maxIdle=100
#最大连接数:能够同时建立的“最大链接个数”
redis.maxTotal=200
#最大等待时间:单位ms
redis.maxWait=1000
#使用连接时,检测连接是否成功 
redis.testOnBorrow=false
#当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
redis.timeout=10000

 

第三步:工具类封装(redisTemplate 和 Jedis各方法的使用)

/**
 * redis工具类
 * @author cg
 * @date 2018年11月27日
 */
@Service("redisDaoSupport")
public class RedisDaoSupport{


    //使用注解,引入redisTemplate对象
    @Resource(name="redisTemplate")
    RedisTemplate<String, Object> redisTemplate;

    
    /**
     * 删除/判断(修改此处暂不写,其实就是先删再存)
     */
    //删除key和对应的value
    public void delete(String key){
        redisTemplate.delete(key);
    }
    //删除多个key和对应的value
    public void delete(List<String> keys){
        redisTemplate.delete(keys);
    }
    //判断是否含key
    public Boolean hasKey(String key){
        return redisTemplate.hasKey(key);
    }

    
    /**
     * 方式一:以Object形式存取,其实就是强行把各类型.toString之后存取,注意原则怎么存的怎么取,然后强转
     */
    //保存key-Object
    public void set(String key,Object obj){
        redisTemplate.opsForValue().set(key, obj);
    }
    //获取key-Object
    public Object get(String key){
        return redisTemplate.opsForValue().get(key);
    }
    //保存key-Object,同时设置失效时间(秒),也可毫秒,分,时,天,具体进入TimeUnit查看更改。因为redis版本过低  我不支持毫秒级别及以下的 过期时间类型,如有需求升高版本就行
    public void setAndTimeOut(String key,Object obj, Integer expise){
        redisTemplate.opsForValue().set(key, obj, expise,TimeUnit.SECONDS);
    }
    

    /**
     * 方式二:以各类型结构形式存取各对象,使用redisTemplate包方法
     */
    //String存储
    public void setString(String key,String str){
        redisTemplate.opsForValue().set(key, str);
    }
    //String存储(设置失效)
    public void setStringAndTimeOut(String key,String str,Integer expise){
        redisTemplate.opsForValue().set(key, str);
        redisTemplate.expire(key, expise, TimeUnit.SECONDS);
    }
    //String获取
    public String getString(String key){
        return redisTemplate.opsForValue().get(key).toString();
    }
    
    
    //List存储
    public void setList(String key,List<Object> value2){
        redisTemplate.opsForList().leftPush(key,value2);  
    }
    //List存储(设置失效)
    public void setListAndTimeOut(String key,List<Object> value2,Integer expise){
        redisTemplate.opsForList().leftPush(key,value2); 
        redisTemplate.expire(key, expise, TimeUnit.SECONDS);
    }
    //List获取
    @SuppressWarnings("unchecked")
    public List<Object> getList(String key){
        return (List<Object>)redisTemplate.opsForList().leftPop(key); 
    }
    
    
    //Map存储
    public void setMap(String key,Map<Object,Object> value3){
        redisTemplate.opsForHash().putAll(key,value3);
    }
    //Map存储(设置失效)
    public void setMapAndTimeOut(String key,Map<Object,Object> value3,Integer expise){
        redisTemplate.opsForHash().putAll(key,value3);
        redisTemplate.expire(key, expise, TimeUnit.SECONDS);    
    }
    //Map获取
    public Map<Object,Object> getMap(String key){
        return redisTemplate.opsForHash().entries(key);   
    }
    //取所有key
    public Set<Object> getMapKeys(String key){            
        return redisTemplate.opsForHash().keys(key); 
    }
    //取所有value
    public List<Object> getMapValues(String key){         
        return redisTemplate.opsForHash().values(key);
    }
    //取对应Map对应key值 
    public Object getValueByMapKey(String map,String key){
        return redisTemplate.opsForHash().get(map, key);
    }
    
    
    //Set存储
    public void setSet(String key,Set<Object> set){
        redisTemplate.opsForSet().add(key, set); 
    }
    //Set存储(设置失效)
    public void setSetAndTimeOut(String key,Set<Object> set,Integer expise){
        redisTemplate.opsForSet().add(key, set); 
        redisTemplate.expire(key, expise, TimeUnit.SECONDS);
    }
    //Set获取
    public Set<Object> getSet(String key){  
        return redisTemplate.opsForSet().members(key); 
    }
    

    /**
     * 方式三:使用依赖包Jedis相应方法进行(Set,Map,List)类型结构形式存取各对象
     */
    
    //先获取Jedis
    public Jedis getJedis(){
        Properties pros = getPprVue();
        String host = pros.getProperty("redis.host");        //地址
        String port = pros.getProperty("redis.port");        //端口
        String pass = pros.getProperty("redis.pass");        //密码
        Jedis jedis = new Jedis(host,Integer.parseInt(port));
        jedis.auth(pass);
        return jedis;
        
    }
    //读取redis.properties 配置文件
    public Properties getPprVue(){
        InputStream inputStream = DbFH.class.getClassLoader().getResourceAsStream("redis.properties");
        Properties p = new Properties();
        try {
            p.load(inputStream);
            inputStream.close();
        } catch (IOException e) {
            //读取配置文件出错
            e.printStackTrace();
        }
        return p;
    }
    
     //新增(存储Map)
    public String addMap(String key, Map<String, String> map) {
         Jedis jedis = getJedis();
         String result = jedis.hmset(key,map);
         jedis.close();
         return result;
    }
    //获取map
    public Map<String,String> getMap2(String key){
        Jedis jedis = getJedis();
        Map<String, String> map = new HashMap<String, String>();
        Iterator<String> iter=jedis.hkeys(key).iterator();
         while (iter.hasNext()){  
             String ikey = iter.next();  
             map.put(ikey, jedis.hmget(key,ikey).get(0));
             }
         jedis.close();
         return map;
    }
    
    //新增(存储List)
    public void addList(String key, List<String> list){
        Jedis jedis = getJedis();
        jedis.del(key); //开始前,先移除所有的内容  
        for(String value:list){
            jedis.rpush(key,value); 
        }
        jedis.close();
    }
    
    //获取List
    public List<String> getList2(String key){
        Jedis jedis = getJedis();
        List<String> list = jedis.lrange(key,0,-1);
        jedis.close();
        return list;
    }
    
    //新增(存储set)
    public void addSet(String key, Set<String> set){
        Jedis jedis = getJedis();
        jedis.del(key);
        for(String value:set){
            jedis.sadd(key,value); 
        }
        jedis.close();
    }
    
    //获取Set
    public Set<String> getSet2(String key){
        Jedis jedis = getJedis();
        Set<String> set = jedis.smembers(key);
        jedis.close();
        return set;
    }
    
    /*
    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("spring/ApplicationContext-redis.xml");
        RedisTemplate redisTemplate=(RedisTemplate) context.getBean("redisTemplate");
        System.out.println(redisTemplate.opsForHash().get("key", "username"));
        System.out.println(redisTemplate.opsForHash().get("key", "age"));
    }*/
}

 

第四步:通过Debug来模拟测试

//##############jquery请求准备(简易的)###############

<button class="btn" onclick="testRedis()">redis封装测试</button><br /><br/>

//redis测试
            function testRedis() {
                $.post(' http://127.0.0.1:8080/cg/appRedisDemo/redisDemo', {
                    
                }, function(rescnt) {
                    console.log(rescnt);
                })

            }

 

/**
 * RedisDemo
 * @author cg
 * @date 2018年11月28日
 */
@Controller
@RequestMapping(value="/appRedisDemo")
public class RedisDemoController extends BaseController{
    
    @Resource(name="redisDaoSupport")
    private RedisDaoSupport redisDaoSupport;
    
    /**
     * 请讲接口 http://127.0.0.1:8080/项目名称/appRedisDemo/redisDemo.do
     * demo展示的测试redisDaoSupport各封装方法,前提打开redis服务端
     * 具体redis的应用场景->百度下即可
     */
    @SuppressWarnings("unchecked")
    @RequestMapping(value="/redisDemo")
    @ResponseBody
    public Object redis(){
        
        Map<String,Object> map = new HashMap<String,Object>();
    
        //为避免错误,通过以下步骤来清理也就是理解为初始化,测试做准备,完全没必要
        redisDaoSupport.set("aaa","111" );// debug处
        redisDaoSupport.set("bbb","222" );
        redisDaoSupport.set("ccc","333" );
        redisDaoSupport.set("ddd","444" );
        redisDaoSupport.set("eee","555" );
        System.err.println(redisDaoSupport.hasKey("aaa"));//debug处
        System.err.println(redisDaoSupport.hasKey("bbb"));
        System.err.println(redisDaoSupport.hasKey("ccc"));
        System.err.println(redisDaoSupport.hasKey("ddd"));
        System.err.println(redisDaoSupport.hasKey("eee"));
        redisDaoSupport.delete("aaa");// debug处
        redisDaoSupport.delete("bbb");
        redisDaoSupport.delete("ccc");
        redisDaoSupport.delete("ddd");
        redisDaoSupport.delete("eee");
        System.err.println(redisDaoSupport.hasKey("aaa"));//判断缓存里是否有key      debug处
        System.err.println(redisDaoSupport.hasKey("bbb"));//判断缓存里是否有key
        System.err.println(redisDaoSupport.hasKey("ccc"));//判断缓存里是否有key
        System.err.println(redisDaoSupport.hasKey("ddd"));//判断缓存里是否有key
        System.err.println(redisDaoSupport.hasKey("eee"));//判断缓存里是否有key
        
        //模拟数据
        String value1="大家好";//String                                           debug处
        Map<Object, Object> value2 = new HashMap<Object, Object>();//Map
        value2.put("name", "岗子");
        value2.put("age", "22");
        List<Object> value3 = new ArrayList<Object>();//List
        value3.add("你们好啊1");
        value3.add("你们好啊1");
        Set<Object> value4 = new HashSet<Object>();//Set
        value4.add("你们好啊2");
        value4.add("你们好啊3");
        Map<Object, Object> value5 = new HashMap<Object, Object>();//Map
        List<Object> value6 = new ArrayList<Object>();//List
        value6.add("你们好啊1");
        value6.add("你们好啊1");
        value5.put("xxxxxxxxxx", value3);
        value5.put("yyyyyyyyyy", value6);
        System.out.println("######################################################################");
        
        //测试方式一(未设置失效情况)
        redisDaoSupport.set("aaa",value1 );//debug处
        redisDaoSupport.set("bbb",value2 );
        redisDaoSupport.set("ccc",value3 );
        redisDaoSupport.set("ddd",value4 );
        redisDaoSupport.set("eee",value5 );
        System.err.println(redisDaoSupport.get("aaa"));    //debug处    输出:大家好
        System.err.println(redisDaoSupport.get("bbb"));    //debug处    输出:{name=admin, age=22}
        System.err.println(redisDaoSupport.get("ccc"));    //debug处    输出:[你们好啊1, 你们好啊1]
        System.err.println(redisDaoSupport.get("ddd"));    //debug处    输出:[你们好啊2, 你们好啊3]
        System.err.println(redisDaoSupport.get("eee"));    //debug处   输出: {xxxxxxxxxx=[你们好啊1, 你们好啊1],           yyyyyyyyyy=[你们好啊1, 你们好啊1]}
        System.err.println(redisDaoSupport.hasKey("aaa")); //debug处
        System.err.println(redisDaoSupport.hasKey("bbb"));
        System.err.println(redisDaoSupport.hasKey("ccc"));
        System.err.println(redisDaoSupport.hasKey("ddd"));
        redisDaoSupport.delete("aaa"); //debug处                                                                                     
        redisDaoSupport.delete("bbb");
        redisDaoSupport.delete("ccc");
        redisDaoSupport.delete("ddd");
        redisDaoSupport.delete("eee");
        System.out.println("######################################################################");
        
        //测试方式一(设置失效情况)
        redisDaoSupport.setAndTimeOut("aaa", value1, 30);//debug处
        redisDaoSupport.setAndTimeOut("bbb", value2, 90);
        redisDaoSupport.setAndTimeOut("ccc", value3, 40);
        redisDaoSupport.setAndTimeOut("ddd", value4, 40);
        redisDaoSupport.setAndTimeOut("eee",value5,90 );
        System.err.println(redisDaoSupport.hasKey("aaa"));//debug处
        System.err.println(redisDaoSupport.hasKey("bbb"));
        System.err.println(redisDaoSupport.hasKey("ccc"));
        System.err.println(redisDaoSupport.hasKey("ddd"));
        System.err.println(redisDaoSupport.hasKey("eee"));
        System.err.println(redisDaoSupport.get("aaa"));    //根据失效时间,来进行debug下一步 
        System.err.println(redisDaoSupport.get("bbb"));    //根据失效时间,debug处
        System.err.println(redisDaoSupport.get("ccc"));    //根据失效时间,debug处
        System.err.println(redisDaoSupport.get("ddd"));    //根据失效时间,debug处
        System.err.println(redisDaoSupport.get("eee"));    //根据失效时间,debug处
        redisDaoSupport.delete("aaa");//debug处
        redisDaoSupport.delete("bbb");
        redisDaoSupport.delete("ccc");
        redisDaoSupport.delete("ddd");
        redisDaoSupport.delete("eee");
        System.out.println("######################################################################");
        
        
        
        //测试方式二(未设置失效情况)
        redisDaoSupport.setString("aaa",value1 );//  debug处
        redisDaoSupport.setMap("bbb",value2 );
        redisDaoSupport.setList("ccc",value3 );
        redisDaoSupport.setSet("ddd",value4 );
        redisDaoSupport.setMap("eee",value5 );
        System.err.println(redisDaoSupport.getString("aaa"));//debug处      输出:大家好
        System.err.println(redisDaoSupport.getMap("bbb"));//debug处             输出:{name=admin, age=22}
        System.err.println(redisDaoSupport.getList("ccc"));//debug处          输出:[你们好啊1, 你们好啊1]
        System.err.println(redisDaoSupport.getSet("ddd"));//debug处            输出:[[你们好啊2, 你们好啊3]]   通过此处初步就可看出两种方式的不同,后面也会通过redis可视化工具看出
        System.err.println(redisDaoSupport.getMap("eee"));//debug处            输出:{xxxxxxxxxx=[你们好啊1, 你们好啊1], yyyyyyyyyy=[你们好啊1, 你们好啊1]}
        System.err.println(redisDaoSupport.getMapValues("bbb"));//debug处  输出:[admin, 22]
        System.err.println(redisDaoSupport.getValueByMapKey("bbb", "age"));//debug处    输出:22
        redisDaoSupport.delete("aaa");//debug处
        redisDaoSupport.delete("bbb");
        redisDaoSupport.delete("ccc");
        redisDaoSupport.delete("ddd");
        redisDaoSupport.delete("eee");
        System.out.println("######################################################################");
        
        
        //测试方式二(设置失效情况)
        redisDaoSupport.setStringAndTimeOut("aaa", value1, 30);//代表30秒后失效  debug处
        redisDaoSupport.setMapAndTimeOut("bbb", value2, 60);
        redisDaoSupport.setListAndTimeOut("ccc", value3, 90);
        redisDaoSupport.setSetAndTimeOut("ddd", value4, 120);
        redisDaoSupport.setMapAndTimeOut("eee", value5, 150);
        System.err.println(redisDaoSupport.getString("aaa"));//根据失效时间,debug处
        System.err.println(redisDaoSupport.getMap("bbb"));//根据失效时间,debug处
        System.err.println(redisDaoSupport.getList("ccc"));//根据失效时间,debug处
        System.err.println(redisDaoSupport.getSet("ddd"));//根据失效时间,debug处
        System.err.println(redisDaoSupport.getMap("eee"));//根据失效时间,debug处
        System.err.println(redisDaoSupport.getValueByMapKey("eee", "xxxxxxxxxx"));//根据失效时间,debug处
        redisDaoSupport.delete("aaa");//debug处
        redisDaoSupport.delete("bbb");
        redisDaoSupport.delete("ccc");
        redisDaoSupport.delete("ddd");
        redisDaoSupport.delete("eee");
        System.out.println("######################################################################");
        
        
        
        //测试方式一存储,方式二获取(会发现除String类型外,其余类型获取会报redis里的结构转换错误(nested exception is redis.clients.jedis.exceptions.JedisDataException:),可以大致判断redisTemplate最底层是使用用了Jedis)
        redisDaoSupport.set("aaa",value1 );//debug处
        redisDaoSupport.set("bbb",value2 );
        redisDaoSupport.set("ccc",value3 );
        redisDaoSupport.set("ddd",value4 );
        redisDaoSupport.set("eee",value5 );
        System.err.println(redisDaoSupport.getString("aaa"));//debug处
        System.err.println(redisDaoSupport.getMap("bbb"));//debug处  报错:WRONGTYPE Operation against a key holding the wrong kind of value; nested exception is redis.clients.jedis.exceptions.JedisDataException: WRONGTYPE Operation against a key holding the wrong kind of value
        System.err.println(redisDaoSupport.getList("ccc"));//debug处
        System.err.println(redisDaoSupport.getSet("ddd"));//debug处
        System.err.println(redisDaoSupport.getMap("eee"));//debug处
        
        //测试方式二存储,方式一获取(会发现除String类型外,其余类型获取会报redis里的结构转换错误,如上)
        redisDaoSupport.setString("aaa",value1 );//  debug处
        redisDaoSupport.setMap("bbb",value2 );
        redisDaoSupport.setList("ccc",value3 );
        redisDaoSupport.setSet("ddd",value4 );
        redisDaoSupport.setMap("eee",value5 );
        System.err.println(redisDaoSupport.get("aaa"));//  debug处
        System.err.println(redisDaoSupport.get("bbb"));//  debug处
        System.err.println(redisDaoSupport.get("ccc"));//  debug处
        System.err.println(redisDaoSupport.get("ddd"));//  debug处
        System.err.println(redisDaoSupport.get("eee"));//  debug处
        System.out.println("######################################################################");
        
        
        
        redisDaoSupport.delete("aaa");
        redisDaoSupport.delete("bbb");
        redisDaoSupport.delete("ccc");
        redisDaoSupport.delete("ddd");
        redisDaoSupport.delete("eee");
        System.err.println(redisDaoSupport.hasKey("aaa"));
        System.err.println(redisDaoSupport.hasKey("bbb"));
        System.err.println(redisDaoSupport.hasKey("ccc"));
        System.err.println(redisDaoSupport.hasKey("ddd"));
        System.err.println(redisDaoSupport.hasKey("eee"));
        System.out.println("######################################################################");
        
        
        
        
        //测试方式一存储Map,获取时对Object进行类型强转Map<Object, List<Object>>
        redisDaoSupport.set("eee",value5);//存储Map
        Map<Object, List<Object>> map2 =(Map<Object, List<Object>>)redisDaoSupport.get("eee");
        List<Object> list = map2.get("xxxxxxxxxx");
        for (Object object : list) {
            System.err.println(object); //  debug处
        }
        
        System.out.println("######################################################################");
        map.put("result", "测试完成");
        return AppUtil.returnObject(new PageData(), map);
    }

    
    
}

最后:通过可视化工具查看各存储结构,了解本质不同之处

方式一:以Object形式存取,其实就是强行把各类型.toString之后存取

 

方式二:以各类型结构形式存取各对象,使用redisTemplate包方法

 

 

好了,我也不知道我说了啥,写了一大堆,也不知道理解是不是有误,感谢大家查看,评论就关了,若有疑问或错误恳请邮件通知,感谢探讨,谢谢。chengang8750@qq.com


版权声明:本文为weixin_42164766原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。