zoukankan      html  css  js  c++  java
  • spring整合redis-----ShardedJedisPool实现

    redis是一个非常优秀的缓存框架,良好的api,强悍的性能,是现在非常非常火的缓存框架。下面来介绍一下spring中是如何整合redis的

    分析:

    • 需要引入依赖
    • 需要配置连接池,就是一个xml文件,然后参数写在properties中
    • 需要写一个工具类,主要方法有,从这个连接池中得到redis资源,销毁redis资源。
    • 需要再写一个service,这个就是具体的得到redis实例之后,保存缓存save方法,取得缓存get方法。具体是按照自己业务逻辑来实现。比如说key如何生成了,反正最后都是用的一个redis的api。这里就简单演示一下。

    pom.xml

    <!-- redis -->
        <dependency>
          <groupId>redis.clients</groupId>
          <artifactId>jedis</artifactId>
          <version>2.8.1</version>
          <type>jar</type>
        </dependency>
    View Code

    redis.xml

    <?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:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    
        <context:property-placeholder location="classpath:redis.properties" />
    
        <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig" />
    
        <bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool" scope="singleton" >
            <constructor-arg index="0" ref="jedisPoolConfig" />
            <constructor-arg index="1">
                <list>
                    <bean class="redis.clients.jedis.JedisShardInfo">
                        <constructor-arg name="host" value="${redis.host}"/>
                        <constructor-arg name="port" value="${redis.port}"/>
                        <constructor-arg name="timeout" value="${redis.timeout}"/>
                    </bean>
                </list>
            </constructor-arg>
        </bean>
    
    </beans>
    View Code

    redis.properties
    redis.host=127.0.0.1
    redis.port=6379
    redis.timeout=3000
    View Code
    RedisPool.java
    package com.mmall.service;
    
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.stereotype.Service;
    import redis.clients.jedis.ShardedJedis;
    import redis.clients.jedis.ShardedJedisPool;
    
    import javax.annotation.Resource;
    
    /**
     * Created by 敲代码的卡卡罗特
     * on 2018/4/1 14:21.
     */
    @Service("redisPool")
    @Slf4j
    public class RedisPool {
        @Resource(name = "shardedJedisPool")
        private ShardedJedisPool shardedJedisPool;
    
        public ShardedJedis instance() {
            return shardedJedisPool.getResource();
        }
        public void safeClose(ShardedJedis shardedJedis) {
            try {
                if (shardedJedis != null) {
                    shardedJedis.close();
                }
            } catch (Exception e) {
                log.error("return redis resource exception", e);
            }
        }
    }
    View Code

    CacheService.java

    
    
    package com.mmall.service;
    
    import com.google.common.base.Joiner;
    import com.mmall.beans.CacheKeyConstants;
    import com.mmall.util.JsonMapper;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.stereotype.Service;
    import redis.clients.jedis.ShardedJedis;
    
    import javax.annotation.Resource;
    
    /**
     * Created by 敲代码的卡卡罗特
     * on 2018/4/1 14:22.
     */
    @Service
    @Slf4j
    public class SysCacheService {
        @Resource(name = "redisPool")
        private RedisPool redisPool;
    
        //保存value
        public void saveCache(String toSavedValue, int timeoutSeconds, CacheKeyConstants prefix) {
            saveCache(toSavedValue, timeoutSeconds, prefix, null);
        }
        //保存value
        public void saveCache(String toSavedValue, int timeoutSeconds, CacheKeyConstants prefix, String... keys) {
            if (toSavedValue == null) {
                return;
            }
            ShardedJedis shardedJedis = null;
            try {
                String cacheKey = generateCacheKey(prefix, keys);
                shardedJedis = redisPool.instance();
                shardedJedis.setex(cacheKey, timeoutSeconds, toSavedValue);
            } catch (Exception e) {
                log.error("save cache exception, prefix:{}, keys:{}", prefix.name(), JsonMapper.obj2String(keys), e);
            } finally {
                redisPool.safeClose(shardedJedis);
            }
        }
        //如何生成key
        private String generateCacheKey(CacheKeyConstants prefix, String... keys) {
            String key = prefix.name();
            if (keys != null && keys.length > 0) {
                key += "_" + Joiner.on("_").join(keys);
            }
            return key;
        }
        //根据key得到value
        public String getFromCache(CacheKeyConstants prefix, String... keys) {
            ShardedJedis shardedJedis = null;
            String cacheKey = generateCacheKey(prefix, keys);
            try {
                shardedJedis = redisPool.instance();
                String value = shardedJedis.get(cacheKey);
                return value;
            } catch (Exception e) {
                log.error("get from cache exception, prefix:{}, keys:{}", prefix.name(), JsonMapper.obj2String(keys), e);
                return null;
            } finally {
                redisPool.safeClose(shardedJedis);
            }
        }
    
    }
    View Code
    
    
    

    然后在application.xml中引入redis的配置文件就ok

    <import resource="redis.xml" />
     
  • 相关阅读:
    Atitit.Java exe bat  作为windows系统服务程序运行
    Atitit. Object-c语言 的新的特性  attilax总结
    Atitit. Object-c语言 的新的特性  attilax总结
    Atitit。Time base gc 垃圾 资源 收集的原理与设计
    Atitit。Time base gc 垃圾 资源 收集的原理与设计
    Atitit.go语言golang语言的新的特性  attilax总结
    Atitit.go语言golang语言的新的特性  attilax总结
    Atitit.pdf 预览 转换html attilax总结
    Atitit.pdf 预览 转换html attilax总结
    Atitit.office word  excel  ppt pdf 的web在线预览方案与html转换方案 attilax 总结
  • 原文地址:https://www.cnblogs.com/coder-lzh/p/8686722.html
Copyright © 2011-2022 走看看