1. 参考
flea-cache使用之Redis分片模式接入 源代码
2. 依赖
jedis-3.0.1.jar
1 2 3 4 5 6
| <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.0.1</version> </dependency>
|
spring-context-4.3.18.RELEASE.jar
1 2 3 4 5 6
| <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.18.RELEASE</version> </dependency>
|
spring-context-support-4.3.18.RELEASE.jar
1 2 3 4 5
| <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.3.18.RELEASE</version> </dependency>
|
3. 基础接入
3.1 定义Flea缓存接口
IFleaCache 可参考笔者的这篇博文 Memcached接入,不再赘述。
3.2 定义抽象Flea缓存类
AbstractFleaCache 可参考笔者的这篇博文 Memcached接入,不再赘述。
3.3 定义Redis客户端接口类
RedisClient , 注意该版,相比《flea-frame-cache使用之Redis接入【旧】》博文中,废弃如下与 ShardedJedis
有关的方法:
1 2 3 4 5
| ShardedJedisPool getJedisPool();
void setShardedJedis(ShardedJedis shardedJedis);
ShardedJedis getShardedJedis();
|
《flea-frame-cache使用之Redis接入【旧】》博文中 提到了使用 Redis客户端代理方式 访问 RedisClient
, 在这版为了实现 Redis 访问异常后的重试机制,废弃了代理模式,采用了命令行模式,可参考下面的 RedisClientCommand
。
3.4 定义Redis客户端命令行
RedisClientCommand 封装了使用ShardedJedis
操作Redis缓存的公共逻辑,如果出现异常可以重试 maxAttempts
次。
抽象方法 execute
,由子类或匿名类实现。在实际调用前,需要从分布式Jedis连接池中获取分布式Jedis对象;调用结束后, 关闭分布式Jedis对象,归还给分布式Jedis连接池。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| public abstract class RedisClientCommand<T> {
private static final FleaLogger LOGGER = FleaLoggerProxy.getProxyInstance(RedisClientCommand.class);
private final ShardedJedisPool shardedJedisPool;
private final int maxAttempts;
public RedisClientCommand(ShardedJedisPool shardedJedisPool, int maxAttempts) { this.shardedJedisPool = shardedJedisPool; this.maxAttempts = maxAttempts; }
public abstract T execute(ShardedJedis connection);
public T run() { return runWithRetries(this.maxAttempts); }
private T runWithRetries(int attempts) { if (attempts <= 0) { throw new FleaCacheMaxAttemptsException("No more attempts left."); } ShardedJedis connection = null; try { connection = shardedJedisPool.getResource(); Object obj = null; if (LOGGER.isDebugEnabled()) { obj = new Object() {}; LOGGER.debug1(obj, "Get ShardedJedis = {}", connection); } T result = execute(connection); if (LOGGER.isDebugEnabled()) { LOGGER.debug1(obj, "Result = {}", result); } return result; } catch (JedisConnectionException e) { releaseConnection(connection); connection = null; if (LOGGER.isErrorEnabled()) { Object obj = new Object() {}; LOGGER.error1(obj, "Redis连接异常:", e); int currAttempts = this.maxAttempts - attempts + 1; LOGGER.error1(obj, "第 {} 次尝试失败,开始第 {} 次尝试...", currAttempts, currAttempts + 1); } return runWithRetries(attempts - 1); } finally { releaseConnection(connection); } }
private void releaseConnection(ShardedJedis connection) { if (ObjectUtils.isNotEmpty(connection)) { if (LOGGER.isDebugEnabled()) { LOGGER.debug1(new Object() {}, "Close ShardedJedis"); } connection.close(); } } }
|
3.5 定义分片模式Redis客户端实现类
FleaRedisShardedClient 主要使用 ShardedJedis
来操作 Redis 数据,它封装了Flea框架操作Redis缓存的基本操作。
它内部具体操作Redis缓存的功能,由分布式Jedis对象完成, 包含读、写、删除Redis缓存的基本操作方法。
分片模式下,单个缓存接入场景,可通过如下方式使用:
1 2 3
| RedisClient redisClient = new FleaRedisShardedClient.Builder().build();
redisClient.set("key", "value");
|
分片模式下,整合缓存接入场景,可通过如下方式使用:
1 2 3
| RedisClient redisClient = new FleaRedisShardedClient.Builder(poolName).build();
redisClient.set("key", "value");
|
当然每次都新建Redis客户端显然不可取,我们可通过Redis客户端工厂获取Redis客户端。
分片模式下,单个缓存接入场景,可通过如下方式使用:
1 2 3
| RedisClient redisClient = RedisClientFactory.getInstance();
RedisClient redisClient = RedisClientFactory.getInstance(CacheModeEnum.SHARDED);
|
分片模式下,整合缓存接入场景,可通过如下方式使用:
1 2 3
| RedisClient redisClient = RedisClientFactory.getInstance(poolName);
RedisClient redisClient = RedisClientFactory.getInstance(poolName, CacheModeEnum.SHARDED);
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
| public class FleaRedisShardedClient extends FleaRedisClient {
private ShardedJedisPool shardedJedisPool;
private int maxAttempts;
private FleaRedisShardedClient() { this(CommonConstants.FleaPoolConstants.DEFAULT_POOL_NAME); }
private FleaRedisShardedClient(String poolName) { super(poolName); init(); }
private void init() { if (CommonConstants.FleaPoolConstants.DEFAULT_POOL_NAME.equals(getPoolName())) { shardedJedisPool = RedisShardedPool.getInstance().getJedisPool(); maxAttempts = RedisShardedConfig.getConfig().getMaxAttempts(); } else { shardedJedisPool = RedisShardedPool.getInstance(getPoolName()).getJedisPool(); maxAttempts = CacheConfigUtils.getMaxAttempts(); } }
@Override public String set(final String key, final Object value) { return new RedisClientCommand<String>(this.shardedJedisPool, this.maxAttempts) { @Override public String execute(ShardedJedis connection) { if (value instanceof String) return connection.set(key, (String) value); else return connection.set(SafeEncoder.encode(key), ObjectUtils.serialize(value)); } }.run(); }
@Override public String set(final byte[] key, final byte[] value) { }
@Override public String set(final String key, final Object value, final int expiry) { }
@Override public String set(final byte[] key, final byte[] value, final int expiry) { }
@Override public String set(final String key, final Object value, final long expiry) { }
@Override public String set(final byte[] key, final byte[] value, final long expiry) { }
@Override public String set(final String key, final Object value, final SetParams params) { }
@Override public String set(final byte[] key, final byte[] value, final SetParams params) { }
@Override public byte[] get(final byte[] key) { }
@Override public Long del(final String key) { }
@Override protected Client getClientByKey(final Object key) { }
public static class Builder { } }
|
该类的构造函数初始化逻辑,可以看出我们使用了 RedisShardedPool
, 下面来介绍一下。
3.6 定义Redis分片连接池
RedisShardedPool ,上个版本我们使用 RedisPool
初始化Redis相关配置信息,为了体现Redis分片模式,这个版本里面,我们使用 RedisShardedPool
用于Redis相关配置信息的初始化,其中重点是获取分布式Jedis连接池 ShardedJedisPool
,该类其中一个构造方法如下:
1 2 3 4 5 6 7
|
public ShardedJedisPool(final GenericObjectPoolConfig poolConfig, List<JedisShardInfo> shards, Hashing algo)
|
Redis分片连接池,用于初始化分布式 Jedis 连接池。
针对单独缓存接入场景,采用默认连接池初始化的方式; 可参考如下:
1 2
| RedisShardedPool.getInstance().initialize();
|
针对整合缓存接入场景,采用指定连接池初始化的方式; 可参考如下:
1 2
| RedisShardedPool.getInstance(group).initialize(cacheServerList);
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| public class RedisShardedPool {
private static final ConcurrentMap<String, RedisShardedPool> redisPools = new ConcurrentHashMap<>();
private String poolName;
private ShardedJedisPool shardedJedisPool;
private RedisShardedPool(String poolName) { this.poolName = poolName; }
public static RedisShardedPool getInstance() { return getInstance(CommonConstants.FleaPoolConstants.DEFAULT_POOL_NAME); }
public static RedisShardedPool getInstance(String poolName) { if (!redisPools.containsKey(poolName)) { synchronized (redisPools) { if (!redisPools.containsKey(poolName)) { RedisShardedPool redisShardedPool = new RedisShardedPool(poolName); redisPools.putIfAbsent(poolName, redisShardedPool); } } } return redisPools.get(poolName); }
public void initialize() { }
public void initialize(List<CacheServer> cacheServerList) { }
public String getPoolName() { return poolName; }
public ShardedJedisPool getJedisPool() { if (ObjectUtils.isEmpty(shardedJedisPool)) { throw new FleaCacheConfigException("获取分布式Jedis连接池失败:请先调用initialize初始化"); } return shardedJedisPool; } }
|
3.7 Redis配置文件
flea-cache读取 redis.properties(Redis配置文件),用作初始化 RedisShardedPool
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| redis.switch=0
redis.systemName=FleaFrame
redis.server=127.0.0.1:10001,127.0.0.1:10002,127.0.0.1:10003
redis.password=huazie123,huazie123,huazie123
redis.weight=1,1,1
redis.connectionTimeout=2000
redis.soTimeout=2000
redis.hashingAlg=1
redis.pool.maxTotal=100
redis.pool.maxIdle=10
redis.pool.minIdle=0
redis.pool.maxWaitMillis=2000
redis.maxAttempts=5
redis.nullCacheExpiry=10
|
redis.switch
: Redis分片配置开关(1:开启 0:关闭),如果不配置也默认开启
redis.systemName
: Redis缓存所属系统名
redis.server
: Redis服务器地址
redis.password
: Redis服务登录密码
redis.weight
: Redis服务器权重分配
redis.connectionTimeout
: Redis客户端socket连接超时时间(单位:ms)
redis.soTimeout
: Redis客户端socket读写超时时间(单位:ms)
redis.hashingAlg
: Redis分布式hash算法【1 : MURMUR_HASH 2 : MD5】
redis.pool.maxTotal
: Jedis连接池最大连接数
redis.pool.maxIdle
: Jedis连接池最大空闲连接数
redis.pool.minIdle
: Jedis连接池最小空闲连接数
redis.pool.maxWaitMillis
: Jedis连接池获取连接时的最大等待时间(单位:ms)
redis.maxAttempts
: Redis客户端操作最大尝试次数【包含第一次操作】
redis.nullCacheExpiry
: 空缓存数据有效期(单位:s)
3.8 定义Redis Flea缓存类
RedisFleaCache 继承抽象Flea缓存类 AbstractFleaCache
,实现了以Flea框架操作Redis缓存的基本操作方法,其构造方法可见如需要传入Redis客户端 RedisClient
,相关使用下面介绍。
在上述基本操作方法中,实际使用Redis客户端【redisClient
】 读、写和删除Redis缓存。其中写缓存方法【putNativeValue
】在 添加的数据值为【null
】时,默认添加空缓存数据【NullCache
】 到Redis中,有效期取初始化参数【nullCacheExpiry
】。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| public class RedisFleaCache extends AbstractFleaCache {
private static final FleaLogger LOGGER = FleaLoggerProxy.getProxyInstance(RedisFleaCache.class);
private RedisClient redisClient;
private CacheModeEnum cacheMode;
public RedisFleaCache(String name, int expiry, int nullCacheExpiry, CacheModeEnum cacheMode, RedisClient redisClient) { super(name, expiry, nullCacheExpiry); this.cacheMode = cacheMode; this.redisClient = redisClient; if (CacheUtils.isClusterMode(cacheMode)) cache = CacheEnum.RedisCluster; else cache = CacheEnum.RedisSharded; }
@Override public Object getNativeValue(String key) { if (LOGGER.isDebugEnabled()) { LOGGER.debug1(new Object() {}, "KEY = {}", key); } return redisClient.get(key); }
@Override public Object putNativeValue(String key, Object value, int expiry) { if (LOGGER.isDebugEnabled()) { Object obj = new Object() {}; LOGGER.debug1(obj, "REDIS FLEA CACHE, KEY = {}", key); LOGGER.debug1(obj, "REDIS FLEA CACHE, VALUE = {}", value); LOGGER.debug1(obj, "REDIS FLEA CACHE, EXPIRY = {}s", expiry); LOGGER.debug1(obj, "REDIS FLEA CACHE, NULL CACHE EXPIRY = {}s", getNullCacheExpiry()); } if (ObjectUtils.isEmpty(value)) { return redisClient.set(key, new NullCache(key), getNullCacheExpiry()); } else { if (expiry == CommonConstants.NumeralConstants.INT_ZERO) { return redisClient.set(key, value); } else { return redisClient.set(key, value, expiry); } } }
@Override public Object deleteNativeValue(String key) { if (LOGGER.isDebugEnabled()) { LOGGER.debug1(new Object() {}, "KEY = {}", key); } return redisClient.del(key); }
@Override public String getSystemName() { if (CacheUtils.isClusterMode(cacheMode)) return RedisClusterConfig.getConfig().getSystemName(); else return RedisShardedConfig.getConfig().getSystemName(); } }
|
3.9 定义抽象Flea缓存管理类
AbstractFleaCacheManager 可参考笔者的这篇博文 Memcached接入,不再赘述。
3.10 定义Redis分片模式Flea缓存管理类
RedisShardedFleaCacheManager 继承抽象Flea缓存管理类 AbstractFleaCacheManager
,用于接入Flea框架管理Redis缓存。
它的默认构造方法,用于初始化分片模式下默认连接池的Redis客户端, 这里需要先初始化Redis连接池,默认连接池名为【default
】; 然后通过 RedisClientFactory
获取分片模式下默认连接池的Redis客户端 RedisClient
,可在 3.11 查看。
newCache
用于创建一个Redis Flea缓存, 它里面包含了 读、写、删除 和 清空 缓存的基本操作。 该方法返回的是 RedisFleaCache
的实例对象,每一类 Redis 缓存数据都对应了一个 RedisFleaCache
的实例对象。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| public class RedisShardedFleaCacheManager extends AbstractFleaCacheManager {
private RedisClient redisClient;
public RedisShardedFleaCacheManager() { RedisShardedPool.getInstance().initialize(); redisClient = RedisClientFactory.getInstance(); }
@Override protected AbstractFleaCache newCache(String name, int expiry) { int nullCacheExpiry = RedisShardedConfig.getConfig().getNullCacheExpiry(); return new RedisFleaCache(name, expiry, nullCacheExpiry, CacheModeEnum.SHARDED, redisClient); } }
|
3.11 定义Redis客户端工厂类
RedisClientFactory ,有四种方式获取 Redis 客户端:
- 一是获取分片模式下默认连接池的 Redis 客户端,应用在单个缓存接入场景【3.10 采用】;
- 二是获取指定模式下默认连接池的 Redis 客户端,应用在单个缓存接入场景;
- 三是获取分片模式下指定连接池的 Redis 客户端,应用在整合缓存接入场景;
- 四是获取指定模式下指定连接池的 Redis 客户端,应用在整合缓存接入场景。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| public class RedisClientFactory {
private static final ConcurrentMap<String, RedisClient> redisClients = new ConcurrentHashMap<>();
private RedisClientFactory() { }
public static RedisClient getInstance() { return getInstance(CommonConstants.FleaPoolConstants.DEFAULT_POOL_NAME); }
public static RedisClient getInstance(CacheModeEnum mode) { return getInstance(CommonConstants.FleaPoolConstants.DEFAULT_POOL_NAME, mode); }
public static RedisClient getInstance(String poolName) { return getInstance(poolName, CacheModeEnum.SHARDED); }
public static RedisClient getInstance(String poolName, CacheModeEnum mode) { String key = StringUtils.strCat(poolName, CommonConstants.SymbolConstants.UNDERLINE, StringUtils.valueOf(mode.getMode())); if (!redisClients.containsKey(key)) { synchronized (redisClients) { if (!redisClients.containsKey(key)) { RedisClientStrategyContext context = new RedisClientStrategyContext(poolName); redisClients.putIfAbsent(key, FleaStrategyFacade.invoke(mode.name(), context)); } } } return redisClients.get(key); } }
|
在上面 的 getInstance(String poolName, CacheModeEnum mode)
方法中,使用了 RedisClientStrategyContext
,用于定义 Redis 客户端策略上下文。根据不同的缓存模式,就可以找到对应的 Redis 客户端策略。
3.12 定义 Redis 客户端策略上下文
RedisClientStrategyContext 包含了 Redis 分片 和 Redis 集群 相关的客户端策略。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
public class RedisClientStrategyContext extends FleaStrategyContext<RedisClient, String> {
public RedisClientStrategyContext() { super(); }
public RedisClientStrategyContext(String contextParam) { super(contextParam); }
@Override protected Map<String, IFleaStrategy<RedisClient, String>> init() { Map<String, IFleaStrategy<RedisClient, String>> fleaStrategyMap = new HashMap<>(); fleaStrategyMap.put(CacheModeEnum.SHARDED.name(), new RedisShardedClientStrategy()); fleaStrategyMap.put(CacheModeEnum.CLUSTER.name(), new RedisClusterClientStrategy()); return Collections.unmodifiableMap(fleaStrategyMap); } }
|
3.13 定义分片模式 Redis 客户端策略
RedisShardedClientStrategy 用于新建分片模式Redis客户端
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public class RedisShardedClientStrategy implements IFleaStrategy<RedisClient, String> {
@Override public RedisClient execute(String poolName) throws FleaStrategyException { RedisClient originRedisClient; if (CommonConstants.FleaPoolConstants.DEFAULT_POOL_NAME.equals(poolName)) { originRedisClient = new FleaRedisShardedClient.Builder().build(); } else { originRedisClient = new FleaRedisShardedClient.Builder(poolName).build(); } return originRedisClient; } }
|
好了,到这里我们可以来测试 Redis 分片模式。
3.14 Redis接入自测
单元测试类详见 FleaCacheTest
首先,这里需要按照 Redis 配置文件中的地址部署相应的 Redis 服务,可参考笔者的 这篇博文。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| @Test public void testRedisShardedFleaCache() { try { AbstractFleaCacheManager manager = FleaCacheManagerFactory.getFleaCacheManager(CacheEnum.RedisSharded.getName()); AbstractFleaCache cache = manager.getCache("fleaparadetail"); LOGGER.debug("Cache={}", cache); cache.put("menu1", "huazie"); cache.put("menu2", null);
cache.getCacheKey(); LOGGER.debug(cache.getCacheName() + ">>>" + cache.getCacheDesc()); } catch (Exception e) { LOGGER.error("Exception:", e); } }
|
4. 进阶接入
4.1 定义抽象Spring缓存
AbstractSpringCache 可参考笔者的这篇博文 Memcached接入,不再赘述。
4.2 定义Redis Spring缓存类
RedisSpringCache 继承抽象 Spring 缓存 AbstractSpringCache
的读、写、删除 和 清空 缓存的基本操作方法,由Redis Spring缓存管理类初始化,用于对接 Spring;
它的构造方法中,必须传入一个具体Flea缓存实现类,这里我们使用 Redis Flea缓存【RedisFleaCache
】。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| public class RedisSpringCache extends AbstractSpringCache {
public RedisSpringCache(String name, IFleaCache fleaCache) { super(name, fleaCache); }
public RedisSpringCache(String name, int expiry, int nullCacheExpiry, CacheModeEnum cacheMode, RedisClient redisClient) { this(name, new RedisFleaCache(name, expiry, nullCacheExpiry, cacheMode, redisClient)); }
}
|
4.3 定义抽象Spring缓存管理类
AbstractSpringCacheManager 可参考笔者的这篇博文 Memcached接入,不再赘述。
4.4 定义Redis分片模式Spring缓存管理类
RedisShardedSpringCacheManager 继承抽象 Spring 缓存管理类 AbstractSpringCacheManager
,用于接入Spring框架管理Redis缓存;
它的默认构造方法,用于初始化分片模式下默认连接池的Redis客户端, 这里需要先初始化Redis连接池,默认连接池名为【default
】; 然后通过Redis客户端工厂类来获取Redis客户端。
它的基本实现同 RedisShardedFleaCacheManager
,唯一不同在于 newCache
的实现。方法【newCache
】用于创建一个Redis Spring缓存, 而它内部是由Redis Flea缓存实现具体的 读、写、删除 和 清空 缓存的基本操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| public class RedisShardedSpringCacheManager extends AbstractSpringCacheManager {
private RedisClient redisClient;
public RedisShardedSpringCacheManager() { RedisShardedPool.getInstance().initialize(); redisClient = RedisClientFactory.getInstance(); }
@Override protected AbstractSpringCache newCache(String name, int expiry) { int nullCacheExpiry = RedisShardedConfig.getConfig().getNullCacheExpiry(); return new RedisSpringCache(name, expiry, nullCacheExpiry, CacheModeEnum.SHARDED, redisClient); } }
|
4.5 spring 配置
如下用于配置缓存管理 redisShardedSpringCacheManager
,其中 configMap
为缓存时间(key
缓存对象名称 value
缓存过期时间)
1 2 3 4 5 6 7 8 9 10
| <bean id="redisShardedSpringCacheManager" class="com.huazie.frame.cache.redis.manager.RedisShardedSpringCacheManager"> <property name="configMap"> <map> <entry key="fleaconfigdata" value="86400"/> </map> </property> </bean>
<cache:annotation-driven cache-manager="redisShardedSpringCacheManager" proxy-target-class="true"/>
|
4.6 缓存自测
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| private ApplicationContext applicationContext;
@Before public void init() { applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); LOGGER.debug("ApplicationContext={}", applicationContext); }
@Test public void testRedisShardedSpringCache() { try { AbstractSpringCacheManager manager = (RedisShardedSpringCacheManager) applicationContext.getBean("redisShardedSpringCacheManager"); LOGGER.debug("RedisCacheManager={}", manager);
AbstractSpringCache cache = manager.getCache("fleaconfigdata"); LOGGER.debug("Cache={}", cache);
Set<String> cacheKey = cache.getCacheKey(); LOGGER.debug("CacheKey = {}", cacheKey);
} catch (Exception e) { LOGGER.error("Exception:", e); } }
|
结语
Redis 接入重构工作已经全部结束,当前版本为 Redis 分片模式。下一篇博文,我将要介绍 Redis 集群模式的接入工作,敬请期待!!!