当前位置:网站首页>Jetcache buried some of the operation, you can't accept it

Jetcache buried some of the operation, you can't accept it

2020-11-06 01:28:00 Yin Jihuan

Explain the background

Caching is an absolute weapon to deal with high concurrency , As many business scenarios allow , You can use caching to provide performance .

Since the cache is used , It's essential to monitor the cache . For example, cache loading takes time , New time and so on .

stay JetCache The embedded point operation is carried out in the , about Redis There's no problem with caching , After that Key Is a full , The whole is Cache Of name+key, Here's the picture :

 picture

Except yes Redis Cache as a buried point , And for the local cache Caffeine We also did some embedding operations , And found that Caffeine There's something wrong with the burial point of , The problem lies in Cache Of name lost , Here's the picture :

 picture

Then I went to the official nail group and asked the maintenance personnel , Let me upgrade the version . Then I upgraded to the latest 2.6.0 Not yet. , This is not a pit for me !

Find out the reason

Do it yourself , Have ample food and clothing . Just look at the code , First of all to see Redis why Cache name There is no loss , as a result of Redis Of Config There is keyPrefix, Here's the picture :

 picture

Then I'm right Redis When operating , Will build the cache Key, structure Key I'll take it with me keyPrefix, therefore Redis Of Key It's normal .

com.alicp.jetcache.external.AbstractExternalCache

  
  1. public byte[] buildKey(K key) {
  2. try {
  3. Object newKey = key;
  4. if (key instanceof byte[]) {
  5. newKey = key;
  6. } else if (key instanceof String) {
  7. newKey = key;
  8. } else if (this.config.getKeyConvertor() != null) {
  9. newKey = this.config.getKeyConvertor().apply(key);
  10. }
  11. return ExternalKeyUtil.buildKeyAfterConvert(newKey, this.config.getKeyPrefix());
  12. } catch (IOException var3) {
  13. throw new CacheException(var3);
  14. }
  15. }

Then come to see Caffeine Of config There is no Keyprefix Of , Here's the picture :

 picture

And then building the cache Key When , No Keyprefix, So the problem is here .

com.alicp.jetcache.embedded.AbstractEmbeddedCache

  
  1. public Object buildKey(K key) {
  2. if (key == null) {
  3. return null;
  4. } else {
  5. Object newKey = key;
  6. Function<K, Object> keyConvertor = this.config.getKeyConvertor();
  7. if (keyConvertor != null) {
  8. newKey = keyConvertor.apply(key);
  9. }
  10. return newKey;
  11. }
  12. }

RedisCacheConfig Inherited ExternalCacheConfig,ExternalCacheConfig Inherited CacheConfig.

keyPrefix It's defined in ExternalCacheConfig in .

 picture

and EmbeddedCacheConfig Only inherited CacheConfig, So naturally it doesn't have keyPrefix Field .

 picture

Solution

The reason has been found out , It must be possible to solve it . The problem is that it's an open source framework , It's not your own company's internal code . But you can also clone the source code directly , To transform , Then package and publish it to your own private server .

take EmbeddedCacheConfig Also inherited ExternalCacheConfig It can be keyPrefix Go through it , And then in buildKey Where to splice .

There is also a more opportunistic approach , You don't have to change the configuration class relationship , stay config There is monitors This information , It stores the cache monitoring information , It mainly refers to the operation type corresponding to the record cache ,GET, PUT such , Then there is the execution time of each operation , The number of operations and other statistical information , Eventually, a thread will periodically output this information to the log .

So we can get monitors Medium cacheName Solve the problem in the near future .

 picture

  
  1. private String getCacheName() {
  2. List<CacheMonitor> monitors = config.getMonitors();
  3. if (CollectionUtils.isEmpty(monitors)) {
  4. return "";
  5. }
  6. DefaultCacheMonitor cacheMonitor = (DefaultCacheMonitor) monitors.get(0);
  7. String cacheName = cacheMonitor.getCacheName();
  8. return cacheName;
  9. }

Function code : https://github.com/yinjihuan/kitty

About author : Yin Jihuan , Simple technology enthusiasts ,《Spring Cloud Microservices - Full stack technology and case analysis 》, 《Spring Cloud Microservices introduction Actual combat and advanced 》 author , official account Ape world Originator . Personal wechat jihuan900 , Welcome to hook up with .

I have compiled a complete set of learning materials , Those who are interested can search through wechat 「 Ape world 」, Reply key 「 Learning materials 」 Get what I've sorted out Spring Cloud,Spring Cloud Alibaba,Sharding-JDBC Sub database and sub table , Task scheduling framework XXL-JOB,MongoDB, Reptiles and other related information .

版权声明
本文为[Yin Jihuan]所创,转载请带上原文链接,感谢