.build();
RedisClient redisClient = RedisClient.create(redisUri);
// [2]
StatefulRedisConnection<String, String> connect = redisClient.connect();
Map<String, String> clientCache = new ConcurrentHashMap<>();
CacheFrontend<String, String> frontend = ClientSideCaching.enable(CacheAccessor.forMap(clientCache), connect,
TrackingArgs.Builder.enabled());
// [3]
while (true) {
String cachedValue = frontend.get(“k1”);
System.out.println("k1 —> " + cachedValue);
Thread.sleep(3000);
}
}
-
构建RedisClient。
-
构建CacheFrontend。
ClientSideCaching.enable开启客户端缓存,即发送“CLIENT TRACKING”命令给Redis服务器,要求Redis开启Tracking机制。最后一个参数指定了Redis Tracking的模式,这里用的是最简单的非广播模式。这里可以看到,通过Map保存客户端缓存的内容。
- 重复查询同一个值,查看缓存是否生效。
我们可以通过Redis的Monitor命令监控Redis服务收到的命令,使用该命令就可以看到,开启客户端缓存后,Lettuce不会重复查询同一个键。
而且我们修改这个键后,Lettuce会重新查询这个键的最新值。
通过Redis的Client List命令可以查看连接的信息
CLIENT LIST
id=4 addr=192.168.56.1:50402 fd=7 name= age=23 idle=22 flags=t …
flags=t代表这个连接启动了Tracking机制。
SpringBoot应用
============
那么如何在SpringBoot上使用呢?请看下面的例子
@Bean
public CacheFrontend<String, String> redisCacheFrontend(RedisConnectionFactory redisConnectionFactory) {
StatefulRedisConnection connect = getRedisConnect(redisConnectionFactory);
if (connect == null) {
return null;
}
CacheFrontend<String, String> frontend = ClientSideCaching.enable(
CacheAccessor.forMap(new ConcurrentHashMap<>()),
connect,
TrackingArgs.Builder.enabled());
return frontend;
}
private StatefulRedisConnection getRedisConnect(RedisConnectionFactory redisConnectionFactory) {
if(redisConnectionFactory instanceof LettuceConnectionFactory) {
AbstractRedisClient absClient = ((LettuceConnectionFactory) redisConnectionFactory).getNativeClient();
if (absClient instanceof RedisClient) {
return ((RedisClient) absClient).connect();
}
}
return null;
}
其实也简单,通过RedisConnectionFactory获取一个StatefulRedisConnection连接,就可以创建CacheFrontend了。
这里RedisClient#connect方法会创建一个新的连接,这样可以将使用客户端缓存、不使用客户端缓存的连接区分。
结合Guava缓存
=========
Lettuce的StatefulRedisConnection类还提供了addListener方法,可以设置回调方法处理Redis推送的消息。
利用该方法,我们可以将Guava的缓存与Redis客户端缓存结合
@Bean
public LoadingCache<String, String> redisGuavaCache(RedisConnectionFactory redisConnectionFactory) {
// [1]
StatefulRedisConnection connect = getRedisConnect(redisConnectionFactory);
if (connect != null) {
// [2]
LoadingCache<String, String> redisCache = CacheBuilder.newBuilder()
.initialCapacity(5)
.maximumSize(100)
.expireAfterWrite(5, TimeUnit.MINUTES)
.build(new CacheLoader<String, String>() {
public String load(String key) {
String val = (String)connect.sync().get(key);
return val == null ? “” : val;
}
});
// [3]
connect.sync().clientTracking(TrackingArgs.Builder.enabled());
// [4]
connect.addListener(message -> {
if (message.getType().equals(“invalidate”)) {
List content = message.getContent(StringCodec.UTF8::decodeKey);
List keys = (List) content.get(1);
keys.forEach(key -> {
redisCache.invalidate(key);
});
}
});
return redisCache;
}
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
最后
看完上述知识点如果你深感Java基础不够扎实,或者刷题刷的不够、知识不全面
小编专门为你量身定制了一套<Java一线大厂高岗面试题解析合集:JAVA基础-中级-高级面试+SSM框架+分布式+性能调优+微服务+并发编程+网络+设计模式+数据结构与算法>
针对知识面不够,也莫慌!还有一整套的<Java核心进阶手册>,可以瞬间查漏补缺
全都是一丢一丢的收集整理纯手打出来的
更有纯手绘的各大知识体系大纲,可供梳理:Java筑基、MySQL、Redis、并发编程、Spring、分布式高性能架构知识、微服务架构知识、开源框架知识点等等的xmind手绘图~
间查漏补缺
[外链图片转存中…(img-ufOAxpFZ-1710755184678)]
全都是一丢一丢的收集整理纯手打出来的
更有纯手绘的各大知识体系大纲,可供梳理:Java筑基、MySQL、Redis、并发编程、Spring、分布式高性能架构知识、微服务架构知识、开源框架知识点等等的xmind手绘图~
[外链图片转存中…(img-GdsHhqRt-1710755184679)]
[外链图片转存中…(img-nAqoyuwR-1710755184679)]