ScopedCacheManager : inclus dans l’étendue

  • Rversion finale: Yokohama
  • Mis à jour 30 janv. 2025
  • 7 minutes de lecture
  • L’API ScopedCacheManager fournit des méthodes pour récupérer, définir et purger les données de cache pour les applications incluses dans le périmètre.

    Cette API nécessite le module d’extension Scoped Cache (com.glide.scopedcache) et s’exécute dans l’espace de noms sn_scoped_cache . Le module d’extension est installé et activé par défaut.

    Ces méthodes nécessitent la définition d’un ou de plusieurs caches inclus dans le champ d’application et de paires de caches dans le champ d’application. Pour plus d’informations sur la création de caches délimités, consultez le Guide du développeur d’API ScopedCacheManager.

    L’utilisation de cette API avec des caches inclus dans le champ d’application offre plusieurs avantages, notamment :
    • Chaînes de mise en cache dans les applications incluses dans le périmètre qui vivent en mémoire dans les transactions.
    • Mise en cache des données d’application incluse dans le périmètre en mémoire et purge de ces données en fonction des changements apportés à la table sous-jacente.
    • Définition et utilisation des données de cache en dehors du cycle de vie de la transaction.
    • Mise en cache des résultats d’opérations ou de calculs coûteux pour un accès rapide à l’avenir.

    ScopedCacheManager – flushScopedCache(Catalogue de chaînes, clé de chaîne)

    Vide un cache entier ou une seule entrée d’un cache.

    Tableau 1. Paramètres
    Nom Type Description
    catalogue Chaîne Nom du cache défini dans la table Caches inclus dans le champ d’application [sys_scoped_cache].
    clé Chaîne Facultatif. Clé de cache. Définissez ce paramètre pour purger une seule entrée d’un cache.
    Tableau 2. Renvoie
    Type Description
    Néant

    L’exemple suivant montre comment vider la clé « abc » d’un cache nommé myCache. Pour vider tout le cache, omettez le paramètre clé.

    sn_scoped_cache.ScopedCacheManager.flushScopedCache("myCache", "abc");

    ScopedCacheManager – get(String catalog, String key)

    Obtient une valeur à partir d’un cache.

    Tableau 3. Paramètres
    Nom Type Description
    catalogue Chaîne Nom du cache défini dans la table Caches inclus dans le champ d’application [sys_scoped_cache].
    clé Chaîne Clé de cache.
    Tableau 4. Renvoie
    Type Description
    Chaîne Entrée de cache.

    L’exemple suivant montre comment compter le nombre d’enregistrements d’incidents ayant des descriptions brèves avec un nombre de caractères supérieur à la clé (50). Dans ce cas, il existe 6 enregistrements d’incidents avec de brèves descriptions de plus de 50 caractères. Cette valeur est stockée dans le cache en tant que chaîne réutilisable, vous n’avez donc pas à effectuer de calcul à chaque fois que vous souhaitez récupérer la valeur.

    var cache2 = "Cache 2"; // column pair type
    
    // Re-populate the column cache
    for (var i = 0; i < 100; i+=10) {
        var inc = new GlideRecord('incident');
        inc.query();
        var counter = 0;
        while (inc.next()) {
            if (inc.getValue('short_description').length > i)
            counter++;
        }
        sn_scoped_cache.ScopedCacheManager.put(cache2, i.toString(), counter.toString());
    }
    
    // script to get values from column cache
    gs.info(sn_scoped_cache.ScopedCacheManager.get(cache2, "50"));

    Sortie :

    scoped_app: 6

    ScopedCacheManager – getCacheEntryDetails(Catalogue de chaînes, clé de chaîne)

    Obtient les détails de l’entrée de cache, y compris la taille en octets, le type d’objet et la valeur d’entrée.

    Tableau 5. Paramètres
    Nom Type Description
    catalogue Chaîne Nom du cache défini dans la table Caches inclus dans le champ d’application [sys_scoped_cache].

    Le nom du catalogue doit être précédé du nom du périmètre et d’un caractère de caret. Par exemple, « test_cache » dans le périmètre global est précédé du préfixe « global^test_cache ».

    clé Chaîne Clé de cache.
    Tableau 6. Renvoie
    Type Description
    Chaîne Chaîne au format <ObjectType> (<EntrySize>) : <Value.toString()>.

    L’exemple suivant montre comment afficher les détails d’entrée de cache pour un cache inclus dans le champ d’application nommé test_cache.

    sn_scoped_cache.ScopedCacheManager.put("test_cache", "key1", "val1");
    gs.info(sn_scoped_cache.ScopedCacheManager.getCacheEntryDetails("global^test_cache", "key1"));

    Sortie :

    java.lang.String (48):
    val1

    ScopedCacheManager – prefixFlush(catalogue de chaînes, préfixe de chaîne)

    Purge toutes les entrées de cache dont les clés commencent par un préfixe spécifié.

    Tableau 7. Paramètres
    Nom Type Description
    catalogue Chaîne Nom du cache défini dans la table Caches inclus dans le champ d’application [sys_scoped_cache].
    préfixe Chaîne Préfixe permettant de rechercher des clés lors de la purge du cache.
    Tableau 8. Renvoie
    Type Description
    Néant

    L’exemple suivant montre comment purger les valeurs de cache pour les clés avec le préfixe a.

    sn_scoped_cache.ScopedCacheManager.put("test_cache", "aKey1", "val1");
    sn_scoped_cache.ScopedCacheManager.put("test_cache", "aKey2", "val2");
    sn_scoped_cache.ScopedCacheManager.put("test_cache", "bKey1", "val3");
    
    sn_scoped_cache.ScopedCacheManager.prefixFlush("test_cache", "a");
    
    gs.info(sn_scoped_cache.ScopedCacheManager.get("test_cache", "aKey1"));
    gs.info(sn_scoped_cache.ScopedCacheManager.get("test_cache", "aKey2"));
    gs.info(sn_scoped_cache.ScopedCacheManager.get("test_cache", "bKey1"));

    Sortie :

    *** Script: null
    *** Script: null
    *** Script: val3

    ScopedCacheManager – put(String catalog, String key, String value)

    Met une valeur dans un cache inclus dans le champ d’application pour les caches qui sont de type Table ou Colonne de table .

    Tableau 9. Paramètres
    Nom Type Description
    catalogue Chaîne Nom du cache défini dans la table Caches inclus dans le champ d’application [sys_scoped_cache].
    clé Chaîne Clé de cache.
    valide Chaîne Entrée de cache.
    Tableau 10. Renvoie
    Type Description
    Néant

    L’exemple suivant montre comment définir et récupérer une clé appelée « abc » dans un cache nommé myCache. Le cache est associé à la table Incident [incident]. L’exemple montre également comment le cache est vidé après la mise à jour du champ de description d’un enregistrement d’incident.

    //put value in cache for key "abc"
    gs.info("put key 'abc' into cache with value 'value1'");
    sn_scoped_cache.ScopedCacheManager.put("myCache", "abc", "value1");
    
    // retrieve value from cache for key "abc"
    gs.info("value of 'abc' in cache: ");
    gs.info(sn_scoped_cache.ScopedCacheManager.get("myCache", "abc")+"\n");
    
    //update an incident record (add string to the description field)
    gs.info("Updating incident record.");
    var gr = new GlideRecord("incident");
    gr.get("<incident_sys_id>");
    gr.description= "test12345";
    if (gr.update()) {
        gs.info("Record updated successfully.\n");
    };
    
    //retrieve the value from cache for key "abc"
    gs.info("Retrieving 'abc' from cache. Value should be null because a table pair was updated.");
    gs.info(sn_scoped_cache.ScopedCacheManager.get("myCache", "abc"));

    Sortie :

    scoped_app: put key 'abc' into cache with value 'value1'
    scoped_app: value of 'abc' in cache: 
    scoped_app: value1
    
    scoped_app: Updating incident record.
    scoped_app: Record updated successfully.
    
    scoped_app: Retrieving 'abc' from cache. Value should be null because a table pair was updated.
    scoped_app: null

    ScopedCacheManager – putMultiRow(Catalogue de chaînes, clé de chaîne, valeur de chaîne, ID de tableau)

    Met une entrée dans le cache et définit tous les enregistrements avec la sys_ids spécifiée comme source de vidage pour cette entrée. Cette méthode est destinée aux caches de type Table ou Paire de colonnes de table .

    Tableau 11. Paramètres
    Nom Type Description
    catalogue Chaîne Catalogue à purger. Nom du cache défini dans la table Caches inclus dans le champ d’application [sys_scoped_cache].
    clé Chaîne Clé de cache pour la nouvelle entrée.
    valide Chaîne Valeur de la nouvelle entrée.
    ID Tableau Liste des sys_ids des enregistrements à utiliser comme sources de vidage pour l’entrée. Ces enregistrements peuvent provenir de différentes tables.
    Tableau 12. Renvoie
    Type Description
    Néant

    L’exemple suivant montre comment utiliser un incident et un enregistrement utilisateur comme points de vidage. Le INC0000060 de clé de test_cache est vidé lorsque l’un des enregistrements spécifiés est mis à jour.

    // This example requires a table-row pair for the "incident" and "sys_user" tables assigned to a cache named test_cache
    var inc1ID = "1c741bd70b2322007518478d83673af3";
    var userID = "681ccaf9c0a8016400b98a06818d57c7";
    
    // update to email should invalidate the entry
    gs.info("initial put");
    putCacheEntry();
    gs.info("cache value for INC0060: " + sn_scoped_cache.ScopedCacheManager.get("test_cache", "INC0000060"));
    var gr = new GlideRecord("sys_user");
    gr.get(userID);
    gr.setValue("email", "a" + gr.getValue("email"));
    gr.update();
    gs.info("updated user email");
    gs.info("cache value: " + sn_scoped_cache.ScopedCacheManager.get("test_cache", "INC0000060"));
    
    // update to incident number should invalidate the entry.
    gs.info("second put");
    putCacheEntry();
    gs.info("cache value: " + sn_scoped_cache.ScopedCacheManager.get("test_cache", "INC0000060"));
    var gr = new GlideRecord("incident");
    gr.get(inc1ID);
    gr.setValue("number", gr.getValue("number") + "1");
    gr.update();
    gs.info("updated incident number");
    gs.info("cache value: " + sn_scoped_cache.ScopedCacheManager.get("test_cache", "INC0000060"));
    
    function putCacheEntry() {
        var incGr = new GlideRecord("incident");
        incGr.get(inc1ID);
        var userGr = new GlideRecord("sys_user");
        userGr.get(userID);
        // the cache stores that the incident is assigned to a specific user. So if the incident or user record changes, we should flush.
        sn_scoped_cache.ScopedCacheManager.putMultiRow("test_cache",incGr.getValue("number"), userGr.getValue("email"), [inc1ID, userID]);
    }

    Sortie :

    *** Script: initial put
    *** Script: cache value for INC0060: employee@example.com
    *** Script: Updating Joe Employee's primary email device based on change to user record email address
    *** Script: updated user email
    *** Script: cache value: null
    *** Script: second put
    *** Script: cache value: aemployee@example.com
    *** Script: updated incident number
    *** Script: cache value: null

    ScopedCacheManager – putRow(Catalogue de chaînes, clé de chaîne, valeur de chaîne, sysId de chaîne)

    Place une valeur dans une seule ligne (table) d’un cache. Utilisez cette méthode pour les caches de type Ligne de table ou Paire de lignes et colonnes de table .

    Tableau 13. Paramètres
    Nom Type Description
    catalogue Chaîne Nom du cache défini dans la table Caches inclus dans le champ d’application [sys_scoped_cache].
    clé Chaîne Clé de cache.
    valide Chaîne Entrée de cache.
    sysId Chaîne Facultatif. Sys_id d’une ligne dans une table, c’est-à-dire l’enregistrement suivi.
    Tableau 14. Renvoie
    Type Description
    Néant

    L’exemple suivant utilise un type de cache de paire de lignes de table nommé incident_cache. Le cache ajoute l’ID de l’appelant de l’incident et les entrées de cache associées aux sys_id de l’enregistrement modifié sont effacées.

    // build the cache:
    var number = 'INC0009009';
    var inc = new GlideRecord('incident');
    inc.addQuery('number', number);
    inc.query();
    inc.next();
    var entry = inc.caller_id.getDisplayValue();
    sn_scoped_cache.ScopedCacheManager.putRow("incident_cache", inc.getValue('number'), entry, inc.getValue('sys_id'));
    gs.info(sn_scoped_cache.ScopedCacheManager.get("incident_cache", number));
    
    // when the incident is altered, the cache entry will be flushed.
    inc = new GlideRecord('incident');
    inc.addQuery('number', number);
    inc.query();
    inc.next();
    inc.setValue('short_description', inc.getValue('short_description') + "a");
    inc.update();
    gs.info(sn_scoped_cache.ScopedCacheManager.get("incident_cache", number));

    Sortie :

    scoped_app: John Jones
    scoped_app: null