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" />
     
  • 相关阅读:
    详细解释ISupportInitialize接口
    微软发布了VS2005 IDE增强工具
    Oracle中无法解析TNS的陷阱
    Oracle临时表空间为何暴涨?
    欧洲游回来
    树比较的一个另类方法
    控件的Archor属性没有作用,是.Net的BUG?
    Oracle中取字段唯一值的一个sql语句的写法
    Qt程序的翻译
    Qt程序运行到Symbian手机上
  • 原文地址:https://www.cnblogs.com/coder-lzh/p/8686722.html
Copyright © 2011-2022 走看看