Redis
 sql >> Teknologi Basis Data >  >> NoSQL >> Redis

Cara menonaktifkan Redis Caching saat dijalankan jika koneksi redis gagal

Mari kita rebus ini sedikit. Aplikasi Anda menggunakan caching (diimplementasikan dengan Redis). Jika koneksi Redis basi/tertutup atau sebaliknya, maka Anda ingin aplikasi melewati caching dan (mungkin) langsung menuju ke penyimpanan data yang mendasarinya (misalnya RDBMS). Logika Layanan aplikasi mungkin terlihat mirip dengan...

@Service
class CustomerService ... {

    @Autowired
    private CustomerRepository customerRepo;

    protected CustomerRepository getCustomerRepo() {
        Assert.notNull(customerRepo, "The CustomerRepository was not initialized!");
        return customerRepo;
    }

    @Cacheable(value = "Customers")
    public Customer getCustomer(Long customerId) {
        return getCustomerRepo().load(customerId);
    }
    ...
}

Yang penting dalam Abstraksi Caching inti Spring untuk memastikan "kehilangan" Cache adalah bahwa nilai yang dikembalikan adalah nol. Dengan demikian, Infrastruktur Spring Caching kemudian akan melanjutkan memanggil metode Layanan yang sebenarnya (yaitu getCustomer). Ingatlah saat kembalinya panggilan getCustomerRepo().load(customerId), Anda juga perlu menangani kasus saat Infrastruktur Caching Spring mencoba untuk menyimpan nilai dalam cache.

Dengan semangat menjaganya tetap sederhana , kami akan melakukannya tanpa AOP, tetapi Anda juga harus dapat mencapainya menggunakan AOP (pilihan Anda).

Yang Anda (seharusnya) butuhkan hanyalah RedisCacheManager "khusus" yang memperluas implementasi SDR CacheManager, seperti...

package example;

import org.springframework.cache.Cache;
import org.springframework.data.redis.cache.RedisCacheManager;
...

class MyCustomRedisCacheManager extends RedisCacheManager {

    public MyCustomerRedisCacheManager(RedisTemplate redisTemplate) {
        super(redisTemplate);
    }

    @Override
    public Cache getCache(String name) {
        return new RedisCacheWrapper(super.getCache(name));
    }


    protected static class RedisCacheWrapper implements Cache {

        private final Cache delegate;

        public RedisCacheWrapper(Cache redisCache) {
            Assert.notNull(redisCache, "'delegate' must not be null");
            this.delegate = redisCache;
        }

        @Override
        public Cache.ValueWrapper get(Object key) {
            try {
              delegate.get(key);
            }
            catch (Exception e) {
                return handleErrors(e);
            }
        }

        @Override
        public void put(Object key, Object value) {
            try {
                delegate.put(key, value);
            }
            catch (Exception e) {
                handleErrors(e);
            }
        }

        // implement clear(), evict(key), get(key, type), getName(), getNativeCache(), putIfAbsent(key, value) accordingly (delegating to the delegate).

        protected <T> T handleErrors(Exception e) throws Exception {
            if (e instanceof <some RedisConnection Exception type>) {
                // log the connection problem
                return null;
            }
            else if (<something different>) { // act appropriately }
            ...
            else {
                throw e;
            }
        }
    }
}

Jadi, jika Redis tidak tersedia, mungkin yang terbaik yang dapat Anda lakukan adalah mencatat masalah dan melanjutkan untuk membiarkan pemanggilan Layanan terjadi. Jelas, ini akan menghambat kinerja tetapi setidaknya akan meningkatkan kesadaran bahwa ada masalah. Jelas, ini dapat dikaitkan dengan sistem notifikasi yang lebih kuat, tetapi ini adalah contoh kasar dari kemungkinannya. Yang penting adalah, Layanan Anda tetap tersedia sementara layanan lain (mis. Redis) tempat layanan aplikasi bergantung, mungkin gagal.

Dalam implementasi ini (vs. penjelasan saya sebelumnya) saya memilih untuk mendelegasikan ke implementasi RedisCache yang mendasari dan sebenarnya untuk membiarkan Pengecualian terjadi, kemudian mengetahui sepenuhnya masalah dengan Redis ada, dan agar Anda dapat menangani Pengecualian dengan tepat. Namun, jika Anda yakin bahwa Pengecualian terkait dengan masalah koneksi saat diperiksa, Anda dapat mengembalikan "null" untuk membiarkan Infrastruktur Caching Spring berjalan seolah-olah itu adalah "kehilangan" Cache (mis. Redis Connection ==Cache miss, dalam hal ini).

Saya tahu sesuatu seperti ini akan membantu masalah Anda saat saya membangun prototipe serupa dari implementasi CacheManager "kustom" untuk GemFire ​​dan salah satu pelanggan Pivotal. Di UC tertentu, "miss" Cache harus dipicu oleh "versi kedaluwarsa" dari objek domain aplikasi di mana produksi memiliki campuran klien aplikasi yang lebih baru dan lebih lama yang terhubung ke GemFire ​​melalui Abstraksi Caching Spring. Bidang objek domain aplikasi akan berubah dalam versi aplikasi yang lebih baru misalnya.

Bagaimanapun, semoga ini membantu atau memberi Anda lebih banyak ide.

Semangat!



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bagaimana mengonfigurasi redis-cluster saat menggunakan spring-data-redis 1.7.0.M1

  2. redis dan tonton + multi memungkinkan pengguna bersamaan

  3. Cara menggunakan Daftar Terurut Redis

  4. phpredis di windows 7 64bit xampp

  5. MurmurHash - apa itu?