解决Redis在不同工程间的跨读取问题(redis跨工程读取)
Redis是一个开源的高效缓存系统,是现今应用非常广泛的高性能缓存解决方案之一。随着其高性能、跨平台支持等特点被越来越多的开发者所关注和采用。但是,当多个工程之间需要跨读取Redis的数据时,就可能出现问题,这个时候就需要解决Redis在不同工程间的跨读取问题。
针对不同工程间Redis的跨读取问题,最好的方法首先是在设计的时候,提前考虑这个问题,把Key的设计做好,避免不同工程之间突然产生跨读取的需求。但是有时候提前考虑实在把握不住或者受到键值设计影响,也会出现不同工程之间需要跨读取的情况。
在具体的实现中,可以使用常用的缓存中间件来解决这个问题。大家可以分别对每个工程编写相应的Redis配置文件,然后将这些工程归并到新的配置文件中,希望共享的Key设置相同的DB,可以使用配置代码如下:
spring:
redis: # DB 0
database0.pool: min-idle: 10
max-idle: 100 max-wt: -1
database: 0 host: 127.0.0.1
# DB 1 database1.pool:
min-idle: 10 max-idle: 100
max-wt: -1 database: 1
host: 127.0.0.1
当然,由于不同工程之间使用的Key不一定兼容,如果出现违背设计规范的异常也可使用路由策略来解决。有两种方式:一种是采用统一的key规则,另一种是根据Key进行类型判断,灵活分配不同的DB,代码实现如下:
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
public class RedisRouter { private RedisConfiguration redisConfiguration;
public RedisRouter(RedisConfiguration redisConfiguration) {
this.redisConfiguration = redisConfiguration; }
public int selectDB(String key) {
// 判断Key是什么类型 JSONObject jsonObject = JSON.parseObject(key);
String type = jsonObject.getString("type");
if (type.equals("typeA")) { // 对应DB0
return 0; } else if (type.equals("typeB")) {
// 对应DB1 return 1;
} else { // 其他类型默认使用DB0
return 0; }
}}
一般来说,可以通过多种方式解决Redis在不同工程间的跨读取问题:从设计上先考虑这个问题,也可以使用常见的中间件或者自定义的路由策略实现跨读取。
另外,为了充分利用Redis的高性能特性,最好及时及相关环境安装好优化插件,例如PHPRedis、Twemproxy等,这些插件可以为应用提供更高效的缓存解决方案,大家可以参考相关文档进行部署。