Spring+Dubbo集成Redis的两种解决方案

Posted YClimb

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring+Dubbo集成Redis的两种解决方案相关的知识,希望对你有一定的参考价值。


全文字数:3056

阅读时间:10分钟

坐稳了没?要开车了哦


当下我们的系统数据库压力都非常大,解决数据库的瓶颈问题势在必行,为了解决数据库的压力等需求,我们常用的是各种缓存,比如redis,本文就来简单讲解一下如何集成redis缓存存储,附github源码。


环境准备

   
     
     
   
  1. · redis

  2. · IDEA 开发工具

  3. · JDK 1.8及以上

  4. · Maven 4.0及以上

redis的搭建网上有很多例子,这里就不细讲了,友友们可以网上浏览安装一波,下面我们就直接讲如何在spring中集成redis。

资源配置

1、spring集成redis

第一步我们先设置maven的pom.xml引用,代码如下:

   
     
     
   
  1. <dependency>

  2.    <groupId>org.springframework.data</groupId>

  3.    <artifactId>spring-data-redis</artifactId>

  4.    <version>1.6.0.RELEASE</version>

  5. </dependency>

  6. <dependency>

  7.    <groupId>redis.clients</groupId>

  8.    <artifactId>jedis</artifactId>

  9.    <version>2.7.3</version>

  10. </dependency>

设置完引用以后,就可以开始着手编写redis在spring中的配置文件了,下面直接上代码 applicationContext.xml 文件:

   
     
     
   
  1. <!-- redis -->

  2. <import resource="spring-redis.xml" />

spring-redis.xml 文件:

   
     
     
   
  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <beans xmlns="http://www.springframework.org/schema/beans"

  3.       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  4.       xmlns:context="http://www.springframework.org/schema/context"

  5.       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 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd">

  6.    <!-- 加载redis参数 -->

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

  8.    <!-- 自动注解 -->

  9.    <!--<context:component-scan base-package="service.impl" />-->

  10.    <!-- jedis 连接池配置参数: -->

  11.    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">

  12.        <!-- 设置最大连接数 -->

  13.        <property name="maxTotal" value="${redis.maxActive}"></property>

  14.        <!-- 设置最大空闲数 -->

  15.        <property name="maxIdle" value="${redis.maxIdle}"></property>

  16.        <!-- 设置超时时间 -->

  17.        <property name="maxWaitMillis" value="${redis.maxWait}"></property>

  18.        <property name="testOnBorrow" value="${redis.testOnBorrow}"></property>

  19.        <property name="testOnReturn" value="${redis.testOnReturn}"></property>

  20.    </bean>

  21.    <!-- jedis 连接池 连接本地redis服务 构造器注入 -->

  22.    <bean id="pool" class="redis.clients.jedis.JedisPool">

  23.        <constructor-arg index="0" ref="poolConfig"/>

  24.        <constructor-arg index="1" value="${redis.host}"/>

  25.        <constructor-arg index="2" value="${redis.port}"/>

  26.        <constructor-arg index="3" value="${redis.maxWait}"/>

  27.        <constructor-arg index="4" value="${redis.pass}"/>

  28.    </bean>

  29.    <!-- redis cache config -->

  30.    <bean id="redisCache" class="client.RedisCache">

  31.        <property name="pool" ref="pool"/>

  32.    </bean>

  33. </beans>

此文件主要描述了jedis的连接池和配置参数,需要注意的是,jedis的版本不同可能会导致具体的参数不一样,比如2.5.1,大家引用的时候如果有其他版本可以看看源码中的属性参数。

下面是 redis.properties 配置文件,主要配置具体的参数值:

   
     
     
   
  1. # Redis settings

  2. redis.host=localhost

  3. redis.port=6379

  4. redis.pass=123456

  5. redis.maxIdle=25

  6. redis.maxActive=100

  7. redis.maxWait=1000

  8. redis.testOnBorrow=false

  9. redis.testOnReturn=false

2、Redis客户端编写

环境和资源已经配置完成,下一次可以开始编写我们的redis客户端程序了,代码如下:

   
     
     
   
  1. package client;

  2. import com.alibaba.fastjson.JSON;

  3. import redis.clients.jedis.Jedis;

  4. import redis.clients.jedis.JedisPool;

  5. import redis.clients.jedis.JedisPoolConfig;

  6. import java.util.ResourceBundle;

  7. /**

  8. *

  9. * <p>

  10. *     Redis客户端访问

  11. * </p>

  12. *

  13. * Created by yclimb on 2017/6/8.

  14. */

  15. public class RedisClient {

  16.    /**

  17.     * 池化管理jedis链接池

  18.     */

  19.    public static JedisPool jedisPool;

  20.    static {

  21.        //读取相关的配置

  22.        ResourceBundle resourceBundle = ResourceBundle.getBundle("redis");

  23.        int maxActive = Integer.parseInt(resourceBundle.getString("redis.pool.maxActive"));

  24.        int maxIdle = Integer.parseInt(resourceBundle.getString("redis.pool.maxIdle"));

  25.        int maxWait = Integer.parseInt(resourceBundle.getString("redis.pool.maxWait"));

  26.        String ip = resourceBundle.getString("redis.ip");

  27.        int port = Integer.parseInt(resourceBundle.getString("redis.port"));

  28.        JedisPoolConfig config = new JedisPoolConfig();

  29.        //设置最大连接数

  30.        config.setMaxTotal(maxActive);

  31.        //设置最大空闲数

  32.        config.setMaxIdle(maxIdle);

  33.        //设置超时时间

  34.        config.setMaxWaitMillis(maxWait);

  35.        //初始化连接池

  36.        jedisPool = new JedisPool(config, ip, port);

  37.    }

  38.    /**

  39.     * 向缓存中设置字符串内容

  40.     * @param key key

  41.     * @param value value

  42.     * @return

  43.     * @throws Exception

  44.     */

  45.    public static boolean  set(String key,String value) throws Exception{

  46.        Jedis jedis = null;

  47.        try {

  48.            jedis = jedisPool.getResource();

  49.            jedis.set(key, value);

  50.            return true;

  51.        } catch (Exception e) {

  52.            e.printStackTrace();

  53.            return false;

  54.        }finally{

  55.            jedisPool.returnResource(jedis);

  56.        }

  57.    }

  58.    /**

  59.     * 向缓存中设置对象

  60.     * @param key

  61.     * @param value

  62.     * @return

  63.     */

  64.    public static boolean  set(String key,Object value){

  65.        Jedis jedis = null;

  66.        try {

  67.            String objectJson = JSON.toJSONString(value);

  68.            jedis = jedisPool.getResource();

  69.            jedis.set(key, objectJson);

  70.            return true;

  71.        } catch (Exception e) {

  72.            e.printStackTrace();

  73.            return false;

  74.        }finally{

  75.            jedisPool.returnResource(jedis);

  76.        }

  77.    }

  78.    /**

  79.     * 删除缓存中得对象,根据key

  80.     * @param key

  81.     * @return

  82.     */

  83.    public static boolean del(String key){

  84.        Jedis jedis = null;

  85.        try {

  86.            jedis = jedisPool.getResource();

  87.            jedis.del(key);

  88.            return true;

  89.        } catch (Exception e) {

  90.            e.printStackTrace();

  91.            return false;

  92.        }finally{

  93.            jedisPool.returnResource(jedis);

  94.        }

  95.    }

  96.    /**

  97.     * 根据key 获取内容

  98.     * @param key

  99.     * @return

  100.     */

  101.    public static Object get(String key){

  102.        Jedis jedis = null;

  103.        try {

  104.            jedis = jedisPool.getResource();

  105.            Object value = jedis.get(key);

  106.            return value;

  107.        } catch (Exception e) {

  108.            e.printStackTrace();

  109.            return false;

  110.        }finally{

  111.            jedisPool.returnResource(jedis);

  112.        }

  113.    }

  114.    /**

  115.     * 根据key 获取对象

  116.     * @param key

  117.     * @return

  118.     */

  119.    public static <T> T get(String key,Class<T> clazz){

  120.        Jedis jedis = null;

  121.        try {

  122.            jedis = jedisPool.getResource();

  123.            String value = jedis.get(key);

  124.            return JSON.parseObject(value, clazz);

  125.        } catch (Exception e) {

  126.            e.printStackTrace();

  127.            return null;

  128.        }finally{

  129.            jedisPool.returnResource(jedis);

  130.        }

  131.    }

  132. }

此文件是一个简单的redis客户端,可以直接使用此客户端操作jedis的存取方法,Test类如下:

   
     
     
   
  1. package test;

  2. import client.RedisClient;

  3. import entity.City;

  4. import org.junit.Test;

  5. /**

  6. *

  7. * <p>

  8. *  测试独立redis 客户端

  9. * </p>

  10. *

  11. * Created by yclimb on 2017/6/8.

  12. */

  13. public class SimpleClient {

  14.    @Test

  15.    public void userCache(){

  16.        //向缓存中保存对象

  17.        City city = new City();

  18.        city.setCity("city");

  19.        city.setCity("1");

  20.        city.setLastUpdate("2222");

  21.        //调用方法处理

  22.        boolean reusltCache = RedisClient.set("city1", city);

  23.        if (reusltCache) {

  24.            System.out.println("向缓存中保存对象成功。");

  25.        }else{

  26.            System.out.println("向缓存中保存对象失败。");

  27.        }

  28.    }

  29.    @Test

  30.    public void getUserInfo(){

  31.        City city = RedisClient.get("city1", City.class);

  32.        if (city != null) {

  33.            System.out.println("从缓存中获取的对象," + city.getCity() + "@" + city.getLastUpdate());

  34.        }

  35.    }

  36. }

此时,我们的第一个简单的redis客户端就已经成功了;但是,平时我们都是使用rpc分布式架构,所以说我们还需要一个service接口化的redis存储器,方便dubbo服务调用,下面我们就一起来编写dubbo的redis service存储器。

3、dubbo服务化的redis存储器

首先,我们需要定义一个redis的缓存配置类,主要用户获取和关闭redis连接,需要使用资源配置时的jedis pool,代码如下:

   
     
     
   
  1. package client;

  2. import org.apache.commons.logging.Log;

  3. import org.apache.commons.logging.LogFactory;

  4. import redis.clients.jedis.Jedis;

  5. import redis.clients.jedis.JedisPool;

  6. import java.io.Serializable;

  7. /**

  8. * redis 缓存配置

  9. * @author yclimb

  10. */

  11. public class RedisCache implements Serializable {

  12.    /**

  13.     * 日志记录

  14.     */

  15.    private static final Log LOG = LogFactory.getLog(RedisCache.class);

  16.    /**

  17.     * redis 连接池

  18.     */

  19.    private JedisPool pool;

  20.    public void setPool(JedisPool pool) {

  21.        this.pool = pool;

  22.    }

  23.    /*static {

  24.        if (pool == null) {

  25.            //读取相关的配置

  26.            ResourceBundle resourceBundle = ResourceBundle.getBundle("redis");

  27.            int maxActive = Integer.parseInt(resourceBundle.getString("redis.maxActive"));

  28.            int maxIdle = Integer.parseInt(resourceBundle.getString("redis.maxIdle"));

  29.            int maxWait = Integer.parseInt(resourceBundle.getString("redis.maxWait"));

  30.            String host = resourceBundle.getString("redis.host");

  31.            int port = Integer.parseInt(resourceBundle.getString("redis.port"));

  32.            String pass = resourceBundle.getString("redis.pass");

  33.            JedisPoolConfig config = new JedisPoolConfig();

  34.            //设置最大连接数

  35.            config.setMaxTotal(maxActive);

  36.            //设置最大空闲数

  37.            config.setMaxIdle(maxIdle);

  38.            //设置超时时间

  39.            config.setMaxWaitMillis(maxWait);

  40.            //初始化连接池

  41.            pool = new JedisPool(config, host, port, 2000, pass);

  42.        }

  43.    }*/

  44.    /**

  45.     * 获取jedis

  46.     *

  47.     * @return jedis

  48.     */

  49.    public Jedis getResource() {

  50.        Jedis jedis = null;

  51.        try {

  52.            jedis = pool.getResource();

  53.        } catch (Exception e) {

  54.            LOG.info("can't get the redis resource");

  55.        }

  56.        return jedis;

  57.    }

  58.    /**

  59.     * 关闭连接

  60.     *

  61.     * @param jedis j

  62.     */

  63.    public void disconnect(Jedis jedis) {

  64.        jedis.disconnect();

  65.    }

  66.    /**

  67.     * 将jedis 返还连接池

  68.     *

  69.     * @param jedis j

  70.     */

  71.    public void returnResource(Jedis jedis) {

  72.        if (null != jedis) {

  73.            try {

  74.                pool.returnResource(jedis);

  75.            } catch (Exception e) {

  76.                LOG.info("can't return jedis to jedisPool");

  77.            }

  78.        }

  79.    }

  80.    /**

  81.     * 无法返还jedispool,释放jedis客户端对象

  82.     *

  83.     * @param jedis j

  84.     */

  85.    public void brokenResource(Jedis jedis) {

  86.        if (jedis != null) {

  87.            try {

  88.                pool.returnBrokenResource(jedis);

  89.            } catch (Exception e) {

  90.                LOG.info("can't release jedis Object");

  91.            }

  92.        }

  93.    }

  94. }

默认使用spring中给的配置文件,自动注入,也可以使用代码中注释的静态代码块,这个看个人需求。

有了缓存配置和jedis pool,此时我们就可以开始编写增删改查的service存储器了,代码如下:

接口: RedisCacheStorageService.java

   
     
     
   
  1. package service;

  2. import java.util.Map;

  3. /**

  4. * 缓存存储接口

  5. * @author yclimb

  6. *

  7. * @param <K> key

  8. * @param <V> value

  9. */

  10. public interface RedisCacheStorageService<K, V> {

  11.    /**

  12.     * 在redis数据库中插入 key  和value

  13.     *

  14.     * @param key

  15.     * @param value

  16.     * @return

  17.     */

  18.    boolean set(K key, V value);

  19.    /**

  20.     * 在redis数据库中插入 key  和value 并且设置过期时间

  21.     *

  22.     * @param key

  23.     * @param value

  24.     * @param exp   过期时间 s

  25.     * @return

  26.     */

  27.    boolean set(K key, V value, int exp);

  28.    /**

  29.     * 根据key 去redis 中获取value

  30.     *

  31.     * @param key

  32.     * @return

  33.     */

  34.    V get(K key);

  35.    /**

  36.     * 删除redis库中的数据

  37.     *

  38.     * @param key

  39.     * @return

  40.     */

  41.    boolean remove(K key);

  42.    /**

  43.     * 设置哈希类型数据到redis 数据库

  44.     *

  45.     * @param cacheKey 可以看做一张表

  46.     * @param key      表字段

  47.     * @param value

  48.     * @return

  49.     */

  50.    boolean hset(String cacheKey, K key, V value);

  51.    /**

  52.     * 获取哈希表数据类型的值

  53.     *

  54.     * @param cacheKey

  55.     * @param key

  56.     * @return

  57.     */

  58.    V hget(String cacheKey, K key);

  59.    /**

  60.     * 获取哈希类型的数据

  61.     *

  62.     * @param cacheKey

  63.     * @return

  64.     */

  65.    Map<K, V> hget(String cacheKey);

  66. }

实现类: RedisCacheStorageServiceImpl.java

   
     
     
   
  1. package service.impl;

  2. import client.RedisCache;

  3. import com.alibaba.fastjson.JSON;

  4. import org.apache.commons.lang3.StringUtils;

  5. import org.apache.commons.logging.Log;

  6. import org.apache.commons.logging.LogFactory;

  7. import org.springframework.beans.factory.annotation.Autowired;

  8. import org.springframework.stereotype.Service;

  9. import redis.clients.jedis.Jedis;

  10. import service.RedisCacheStorageService;

  11. import java.util.HashMap;

  12. import java.util.Map;

  13. /**

  14. * redis 缓存存储器实现

  15. * @author yclimb

  16. *

  17. * @param <V>

  18. */

  19. @Service

  20. public class RedisCacheStorageServiceImpl<V> implements RedisCacheStorageService<String, V> {

  21.    /**

  22.     * 日志记录

  23.     */

  24.    public static final Log LOG = LogFactory.getLog(RedisCacheStorageServiceImpl.class);

  25.    /**

  26.     * 默认过时时间(60 * 60 * 24)

  27.     */

  28.    private static final int EXPIRE_TIME = 86400;

  29.    @Autowired

  30.    private RedisCache redisCache;

  31.    /**

  32.     * 在redis数据库中插入 key和value

  33.     *

  34.     * @param key k

  35.     * @param value v

  36.     * @return boolean

  37.     */

  38.    @Override

  39.    public boolean set(String key, V value) {

  40.        // 设置默认过时时间

  41.        return set(key, value, EXPIRE_TIME);

  42.    }

  43.    /**

  44.     * 在redis数据库中插入 key和value 并且设置过期时间

  45.     *

  46.     * @param key k

  47.     * @param value v

  48.     * @param exp   过期时间 s

  49.     * @return boolean

  50.     */

  51.    @Override

  52.    public boolean set(String key, V value, int exp) {

  53.        Jedis jedis = null;

  54.        // 将key 和value  转换成 json 对象

  55.        String jKey = JSON.toJSONString(key);

  56.        String jValue = JSON.toJSONString(value);

  57.        // 操作是否成功

  58.        boolean isSucess = true;

  59.        if (StringUtils.isEmpty(jKey)) {

  60.            LOG.info("key is empty");

  61.            return false;

  62.        }

  63.        try {

  64.            // 获取客户端对象

  65.            jedis = redisCache.getResource();

  66.            // 执行插入

  67.            jedis.setex(jKey, exp, jValue);

  68.        } catch (Exception e) {

  69.            LOG.info("client can't connect server");

  70.            isSucess = false;

  71.            if (null != jedis) {

  72.                // 释放jedis对象

  73.                redisCache.brokenResource(jedis);

  74.            }

  75.            return false;

  76.        } finally {

  77.            if (isSucess) {

  78.                // 返还连接池

  79.                redisCache.returnResource(jedis);

  80.            }

  81.        }

  82.        return true;

  83.    }

  84.    /**

  85.     * 根据key去redis中获取value

  86.     *

  87.     * @param key k

  88.     * @return obj

  89.     */

  90.    @Override

  91.    public V get(String key) {

  92.        Jedis jedis = null;

  93.        // 将key 和value  转换成 json 对象

  94.        String jKey = JSON.toJSONString(key);

  95.        V jValue = null;

  96.        // key 不能为空

  97.        if (StringUtils.isEmpty(jKey)) {

  98.            LOG.info("key is empty");

  99.            return null;

  100.        }

  101.        try {

  102.            // 获取客户端对象

  103.            jedis = redisCache.getResource();

  104.            // 执行查询

  105.            String value = jedis.get(jKey);

  106.            // 判断值是否非空

  107.            if (StringUtils.isEmpty(value)) {

  108.                return null;

  109.            } else {

  110.                jValue = (V) JSON.parse(value);

  111.            }

  112.            // 返还连接池

  113.            redisCache.returnResource(jedis);

  114.        } catch (Exception e) {

  115.            LOG.info("client can't connect server");

  116.            if (null != jedis) {

  117.                // 释放jedis对象

  118.                redisCache.brokenResource(jedis);

  119.            }

  120.        }

  121.        return jValue;

  122.    }

  123.    /**

  124.     * 删除redis库中的数据

  125.     *

  126.     * @param key k

  127.     * @return boolean

  128.     */

  129.    @Override

  130.    public boolean remove(String key) {

  131.        Jedis jedis = null;

  132.        // 将key 和value  转换成 json 对象

  133.        String jKey = JSON.toJSONString(key);

  134.        // 操作是否成功

  135.        boolean isSucess = true;

  136.        if (StringUtils.isEmpty(jKey)) {

  137.            LOG.info("key is empty");

  138.            return false;

  139.        }

  140.        try {

  141.            jedis = redisCache.getResource();

  142.            // 执行删除

  143.            jedis.del(jKey);

  144.        } catch (Exception e) {

  145.            LOG.info("client can't connect server");

  146.            isSucess = false;

  147.            if (null != jedis) {

  148.                // 释放jedis对象

  149.                redisCache.brokenResource(jedis);

  150.            }

  151.            return false;

  152.        } finally {

  153.            if (isSucess) {

  154.                // 返还连接池

  155.                redisCache.returnResource(jedis);

  156.            }

  157.        }

  158.        return true;

  159.    }

  160.    /**

  161.     * 设置哈希类型数据到redis数据库

  162.     *

  163.     * @param cacheKey 可以看做一张表

  164.     * @param key      表字段

  165.     * @param value v

  166.     * @return boolean

  167.     */

  168.    @Override

  169.    public boolean hset(String cacheKey, String key, V value) {

  170.        Jedis jedis = null;

  171.        // 将key 和value  转换成 json 对象

  172.        String jKey = JSON.toJSONString(key);

  173.        String jCacheKey = JSON.toJSONString(cacheKey);

  174.        String jValue = JSON.toJSONString(value);

  175.        // 操作是否成功

  176.        boolean isSucess = true;

  177.        if (StringUtils.isEmpty(jCacheKey)) {

  178.            LOG.info("cacheKey is empty");

  179.            return false;

  180.        }

  181.        try {

  182.            jedis = redisCache.getResource();

  183.            // 执行插入哈希

  184.            jedis.hset(jCacheKey, jKey, jValue);

  185.        } catch (Exception e) {

  186.            LOG.info("client can't connect server");

  187.            isSucess = false;

  188.            if (null != jedis) {

  189.                // 释放jedis对象

  190.                redisCache.brokenResource(jedis);

  191.            }

  192.            return false;

  193.        } finally {

  194.            if (isSucess) {

  195.                // 返还连接池

  196.                redisCache.returnResource(jedis);

  197.            }

  198.        }

  199.        return true;

  200.    }

  201.    /**

  202.     * 获取哈希表数据类型的值

  203.     *

  204.     * @param cacheKey cacheK

  205.     * @param key k

  206.     * @return obj

  207.     */

  208.    @Override

  209.    public V hget(String cacheKey, String key) {

  210.        Jedis jedis = null;

  211.        // 将key 和value  转换成 json 对象

  212.        String jKey = JSON.toJSONString(key);

  213.        String jCacheKey = JSON.toJSONString(cacheKey);

  214.        V jValue = null;

  215.        if (StringUtils.isEmpty(jCacheKey)) {

  216.            LOG.info("cacheKey is empty");

  217.            return null;

  218.        }

  219.        try {

  220.            // 获取客户端对象

  221.            jedis = redisCache.getResource();

  222.            // 执行查询

  223.            String value = jedis.hget(jCacheKey, jKey);

  224.            // 判断值是否非空

  225.            if (StringUtils.isEmpty(value)) {

  226.                return null;

  227.            } else {

  228.                jValue = (V) JSON.parse(value);

  229.            }

  230.            // 返还连接池

  231.            redisCache.returnResource(jedis);

  232.        } catch (Exception e) {

  233.            LOG.info("client can't connect server");

  234.            if (null != jedis) {

  235.                // 释放jedis对象

  236.                redisCache.brokenResource(jedis);

  237.            }

  238.        }

  239.        return jValue;

  240.    }

  241.    /**

  242.     * 获取哈希类型的数据

  243.     *

  244.     * @param cacheKey cacheK

  245.     * @return map

  246.     */

  247.    @Override

  248.    public Map<String, V> hget(String cacheKey) {

  249.        String jCacheKey = JSON.toJSONString(cacheKey);

  250.        // 非空校验

  251.        if (StringUtils.isEmpty(jCacheKey)) {

  252.            LOG.info("cacheKey is empty!");

  253.            return null;

  254.        }

  255.        Jedis jedis = null;

  256.        Map<String, V> result = null;

  257.        try {

  258.            jedis = redisCache.getResource();

  259.            // 获取列表集合

  260.            Map<String, String> map = jedis.hgetAll(jCacheKey);

  261.            if (null != map) {

  262.                for (Map.Entry<String, String> entry : map.entrySet()) {

  263.                    if (result == null) {

  264.                        result = new HashMap<String, V>();

  265.                    }

  266.                    result.put((String) JSON.parse(entry.getKey()), (V) JSON.parse(entry.getValue()));

  267.                }

  268.            }

  269.        } catch (Exception e) {

  270.            LOG.info("client can't connect server");

  271.            if (null != jedis) {

  272.                // 释放jedis对象

  273.                redisCache.brokenResource(jedis);

  274.            }

  275.        }

  276.        return result;

  277.    }

  278. }

到这里我们的存储器就编写完成了,接下来就是看看如何注入dubbo服务了,下面是注入的示例代码:

   
     
     
   
  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <beans xmlns="http://www.springframework.org/schema/beans"

  3.    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"

  4.    xsi:schemaLocation="http://www.springframework.org/schema/beans

  5.        http://www.springframework.org/schema/beans/spring-beans.xsd

  6.        http://code.alibabatech.com/schema/dubbo

  7.        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

  8.    <!-- redis -->

  9.    <dubbo:service timeout="${dubbo-timeout}" retries="${dubbo-retries}" interface="com.yc.redis.RedisCacheStorageService" ref="redisCacheStorageServiceImpl" group="${service.group}" />

  10. </beans>

OK,代码编写完成,这里dubbo服务调用的代码我就不贴上了,各位可以自己试一试,到这里一套基于jedis的简单示例就完成了。

结语





- END -


weixin : yclimb


陪伴是最长情的告白

陌生的城市里相遇是缘携手同行



以上是关于Spring+Dubbo集成Redis的两种解决方案的主要内容,如果未能解决你的问题,请参考以下文章

阿里技术文档:Redis+Nginx+设计模式+Spring全家桶+Dubbo精选

Java大厂技术文档:Redis+Nginx+设计模式+Spring全家桶+Dubbo精选

Dubbo

大厂技术资料:Redis+Nginx+Spring全家桶+Dubbo精选

大厂技术文档:Redis+Nginx+Spring全家桶+Dubbo精选

打造仿猫眼项目 以Dubbo为核心解锁微服务