HCL Commerce Version 9.1.10.0 or later

HCL Cache en Redis

Redis es la base de datos remota que almacena datos HCL Cache y también se utiliza para replicar invalidaciones en memorias caché locales. A efectos de resolución de problemas y administrativos, es posible que a veces tenga que utilizar la línea de mandatos de Redis para consultar o configurar la base de datos.

Esta página incluye una lista de mandatos y conceptos que puede encontrar útiles al aprender o solucionar problemas del sistema de memoria caché. Para obtener una lista completa de mandatos, consulte el sitio de Redis.

En este documento se presupone que ha instalado Redis en el clúster de Kubernetes con los gráficos Bitnami, pero los mandatos deben funcionar en todas las distribuciones.

Note: Cambiar el contenido de la memoria caché directamente en la base de datos de Redis puede romper la coherencia de la memoria caché. La forma soportada de operar con la memoria caché es utilizando las API de memoria caché o del gestor de memoria caché.

Acceso a la interfaz de línea de mandatos de Redis (redis-cli)

Se puede acceder a la línea de mandatos de Redis con el redis-cli mandato dentro del contenedor:
kubectl exec -it redis-master-0 -n redis -c redis -- bash
redis-cli
Por ejemplo, si desea ejecutar el mandato DBSIZE desde fuera del contenedor, emitirá el mandato siguiente.
kubectl exec -it redis-master-0 -n redis -c redis -- redis-cli DBSIZE

La mayoría de los mandatos de Redis solo se aplican al servidor local. Si está ejecutando un clúster, primero debe identificar el servidor que contiene la memoria caché.

Objetos de HCL Cache

La denominación de los objetos de memoria caché sigue el convenio {cache-<namespace>-<cachename>}-<type>-<id>.

El espacio de nombres le permite compartir Redis para varios entornos y distinguir entre Auth y Live. El prefijo también contiene el nombre de la memoria caché y está entre corchetes { }. Para entornos de clúster, esto garantiza que todo el contenido de la memoria caché se cree en el mismo nodo. Esta es una decisión de diseño para fines de rendimiento.

Los dos tipos de objeto principales son -data (contenido de memoria caché) y -dep, para dependencias. Por ejemplo:
"{cache-demoqalive-baseCache}-data-/search/resources/org.springframework.web.servlet.DispatcherServlet.class:DC_Envtype:DC_PathToken_1=api:DC_PathToken_2=v2:DC_PathToken_3=categories:storeId=11:langId=-1:contractId=-11005:depthAndLimit=11,11:UTF-8:requestType=GET"
"{cache-demoqalive-baseCache}-dep-storeId:categoryId:11:10506"
Consultar HCL Cache
El mandato KEYS se puede utilizar para inspeccionar el contenido de la memoria caché de Redis en un entorno TEST. Este mandato no debe utilizarse en un entorno real/ de producción porque puede bloquear la hebra Redis. En producción, utilice el mandato SCAN (y sus variaciones) en su lugar, porque recupera datos en fragmentos con un cursor.
La interfaz redis-cli proporciona un atajo para ejecutar el SCAN mandato --scan que sigue automáticamente al cursor.
I have no name!@redis-master-0:/$ redis-cli --scan --pattern "{cache-demoqalive-baseCache}-*"
"{cache-demoqalive-baseCache}-data-/search/resources/org.springframework.web.servlet.DispatcherServlet.class:DC_Envtype:DC_PathToken_1=api:DC_PathToken_2=v2:DC_PathToken_3=products:catalogId=11501:contractId=-11005:langId=-1:partNumber=BD-BEDS-0002:storeId=11:UTF-8:requestType=GET"
"{cache-demoqalive-baseCache}-dep-WCT+ESINDEX"
"{cache-demoqalive-baseCache}-dep-storeId:partNumber:11:LR-FNTR-0002"
"{cache-demoqalive-baseCache}-dep-storeId:categoryId:11:10506"
"{cache-demoqalive-baseCache}-dep-storeId:partNumber:11:BD-BEDS-0002"
"{cache-demoqalive-baseCache}-data-/search/resources/org.springframework.web.servlet.DispatcherServlet.class:DC_Envtype:DC_PathToken_1=api:DC_PathToken_2=v2:DC_PathToken_3=products:catalogId=11501:langId=-1:partNumber=LR-FNTR-0002:storeId=11:UTF-8:requestType=GET"
"{cache-demoqalive-baseCache}-data-/search/resources/org.springframework.web.servlet.DispatcherServlet.class:DC_Envtype:DC_PathToken_1=api:DC_PathToken_2=v2:DC_PathToken_3=categories:storeId=11:langId=-1:contractId=-11005:depthAndLimit=11,11:UTF-8:requestType=GET"
..

Las claves de memoria caché (-data) se almacenan como objetos HASH y contienen el valor almacenado en memoria caché junto con metadatos.

El mandato HGETALL se puede utilizar para recuperar el contenido de una entrada de memoria caché:

Por ejemplo:
127.0.0.1:6379> HGETALL "{cache-demoqalive-baseCache}-data-/search/resources/org.springframework.web.servlet.DispatcherServlet.class:DC_Envtype:DC_PathToken_1=api:DC_PathToken_2=v2:DC_PathToken_3=categories:storeId=11:langId=-1:contractId=-11005:id=10501,10516:UTF-8:requestType=GET"
 1) "created-by"
 2) "demoqalivequery-app-d7ff6c649-ch78j"
 3) "created-at"
 4) "1636061491787"
 5) "dependencies"
 6) "WCT+ESINDEX;;;WCT+FULL_ESINDEX;;;"
 7) "value"
 8) "\x04\x04\t>0com.ibm.ws.cache.servlet.FragmentComposerMemento\x00\x00\x00\x00P\x00 \x02\x00\x00\x00\n>\x0eattributeBytes\x16\x00>\nattributes\x16\x00>\x11characterEncoding\x16\x00>\x13consumeSubfragments \x00>\x0bcontainsESI \x00>\x0bcontentType\x16\x00>\bcontents\x16\x00>\x15externalCacheFragment\x16\x00>\x14externalCacheGroupId\x16\x00>\x0boutputStyle#\x00\x16\x01B\x01\t>4com.ibm.ws.cache.servlet.CacheProxyRequest$Attribute\xdb\x97\x83\x0cL\xc2!\x1d\x00\x00\x00\x02>\x03key\x16\x00>\x05value\x16\x00\x16\x04;\xff>\x15REST_REQUEST_RESOURCE>\x15/api/v2/categories?id\x01\x00\x00\x01B\x03\x16\x04\t>0com.ibm.ws.cache.servlet.DefaultStatusSideEffect\xe2\xe3\xc1\xc89\x19\x01y\x00\x00\x00\x01>\nstatusCode#\x00\x16\x00\x00\x00\xc8\x04\t>)com.ibm.ws.cache.servlet.HeaderSideEffect\x8a\xc4#[9\xfb\xfc=\x00\x00\x00\x03>\x04name\x16\x00>\x03set \x009\xf4\x16\x00\x16>\x0cContent-Type\x00>\x10application/jsonC\a\xaf!{\"contents\":[{\"name\":\"Kitchen\",\"identifier\":\"Kitchen\",\"shortDescription\":\"Create a kitchen that suits your needs and fits your lifestyle\",\"resourceId\":\"https://www.demoqalive.andres.svt.hcl.com/search/resources/api/v2/categories?storeId=11&id=10516&id=10501&contractId=-11005&langId=-1\",\"uniqueID\":\"10516\",\"parentCatalogGroupID\":\"/10516\",\"thumbnail\":\"/hclstore/EmeraldCAS/images/catalog/kitchen/category/dep_kitchen.jpg\",\"seo\":{\"href\":\"/kitchen\"},\"storeID\":\"11\",\"sequence\":\"5.0\",\"fullImage\":\"/hclstore/EmeraldCAS/images/catalog/kitchen/category/dep_kitchen.jpg\",\"id\":\"10516\",\"links\":{\"parent\":{\"href\":\"/search/resources/api/v2/categories?storeId=11&id=-1\"},\"children\":[\"href: /search/resources/api/v2/categories?storeId=11&id=10518\",\"href: /search/resources/api/v2/categories?storeId=11&id=10517\"],\"self\":{\"href\":\"/search/resources/api/v2/categories?storeId=11&id=10516\"}},\"description\":\"Create a kitchen that suits your needs and fits your lifestyle\"},{\"name\":\"Living Room\",\"identifier\":\"LivingRoom\",\"shortDescription\":\"Bring your living space together with comfort and style\",\"resourceId\":\"https://www.demoqalive.andres.svt.hcl.com/search/resources/api/v2/categories?storeId=11&id=10516&id=10501&contractId=-11005&langId=-1\",\"uniqueID\":\"10501\",\"parentCatalogGroupID\":\"/10501\",\"thumbnail\":\"/hclstore/EmeraldCAS/images/catalog/livingroom/category/dep_livingroom.jpg\",\"seo\":{\"href\":\"/living-room\"},\"storeID\":\"11\",\"sequence\":\"1.0\",\"fullImage\":\"/hclstore/EmeraldCAS/images/catalog/livingroom/category/dep_livingroom.jpg\",\"id\":\"10501\",\"links\":{\"parent\":{\"href\":\"/search/resources/api/v2/categories?storeId=11&id=-1\"},\"children\":[\"href: /search/resources/api/v2/categories?storeId=11&id=10503\",\"href: /search/resources/api/v2/categories?storeId=11&id=10502\",\"href: /search/resources/api/v2/categories?storeId=11&id=10504\"],\"self\":{\"href\":\"/search/resources/api/v2/categories?storeId=11&id=10501\"}},\"description\":\"Bring your living space together with comfort and style\"}]}\x01\x01\x00\x00\x00\x01"
 9) "expiry-at"
10) "1636075891787"
El mandato TTL muestra el tiempo de vida restante para una entrada. Cuando la hora caduca, Redis suprime la entrada.
127.0.0.1:6379> TTL "{cache-demoqalive-baseCache}-data-/search/resources/org.springframework.web.servlet.DispatcherServlet.class:DC_Envtype:DC_PathToken_1=api:DC_PathToken_2=v2:DC_PathToken_3=categories:storeId=11:langId=-1:contractId=-11005:id=10501,10516:UTF-8:requestType=GET"
(integer) 13609
Información de ID de dependencia
La información de dependencia se almacena en conjuntos que enlazan con los cache-ids. Redis tiene varios mandatos para operar en conjuntos. SCARD muestra el tamaño del conjunto (número de ID de memoria caché enlazados al ID de dependencia).
127.0.0.1:6379> SCARD "{cache-demoqalive-baseCache}-dep-WCT+ESINDEX"
(integer) 9

SMEMBERS lista todos los cache-ids para una dependencia. Este mandato solo debe utilizarse para ID de dependencia pequeños. Para dependencia ID que pueden enlazar con un gran número de cache-ids, se debe utilizar SSCAN en su lugar.

127.0.0.1:6379> SMEMBERS "{cache-demoqalive-baseCache}-dep-WCT+ESINDEX"
1) "/search/resources/org.springframework.web.servlet.DispatcherServlet.class:DC_Envtype:DC_PathToken_1=api:DC_PathToken_2=v2:DC_PathToken_3=categories:storeId=11:langId=-1:contractId=-11005:depthAndLimit=11,11:UTF-8:requestType=GET"
2) "/search/resources/org.springframework.web.servlet.DispatcherServlet.class:DC_Envtype:DC_PathToken_1=api:DC_PathToken_2=v2:DC_PathToken_3=urls:storeId=11:identifier=tables:langId=-1:UTF-8:requestType=GET"
3) "/search/resources/org.springframework.web.servlet.DispatcherServlet.class:DC_Envtype:DC_PathToken_1=api:DC_PathToken_2=v2:DC_PathToken_3=urls:storeId=11:identifier=home:langId=-1:UTF-8:requestType=GET"
4) "/search/resources/org.springframework.web.servlet.DispatcherServlet.class:DC_Envtype:DC_PathToken_1=api:DC_PathToken_2=v2:DC_PathToken_3=urls:storeId=11:identifier=sleepy-head-elegant-queen-bed-bd-beds-0002:langId=-1:UTF-8:requestType=GET"
5) "/search/resources/org.springframework.web.servlet.DispatcherServlet.class:DC_Envtype:DC_PathToken_1=api:DC_PathToken_2=v2:DC_PathToken_3=products:contractId=-11005:id=14033,14057,14082,14100,14111,14156,14178,14220:langId=-1:storeId=11:UTF-8:requestType=GET"
6) "/search/resources/org.springframework.web.servlet.DispatcherServlet.class:DC_Envtype:DC_PathToken_1=store:DC_PathToken_2=11:DC_PathToken_3=sitecontent:DC_PathToken_4=suggestions:catalogId=11501:langId=-1:contractId=-11005:suggestType=Category:UTF-8:requestType=GET"
7) "/search/resources/org.springframework.web.servlet.DispatcherServlet.class:DC_Envtype:DC_PathToken_1=api:DC_PathToken_2=v2:DC_PathToken_3=categories:storeId=11:langId=-1:contractId=-11005:id=10501,10516:UTF-8:requestType=GET"
8) "/search/resources/org.springframework.web.servlet.DispatcherServlet.class:DC_Envtype:DC_PathToken_1=api:DC_PathToken_2=v2:DC_PathToken_3=urls:storeId=11:identifier=beds:langId=-1:UTF-8:requestType=GET"
9) "/search/resources/org.springframework.web.servlet.DispatcherServlet.class:DC_Envtype:DC_PathToken_1=api:DC_PathToken_2=v2:DC_PathToken_3=urls:storeId=11:identifier=luncheon-table-dr-tbls-0001:langId=-1:UTF-8:requestType=GET"

Los ID de dependencia no establecen una caducidad y, según la regla volatile-lru de gestión de memoria, no se pueden expulsar, porque esto provocaría la falta de invalidaciones.

HCL Cache también mantiene otros objetos, como el registro de memoria caché, {cache_registry-namespace} y {cache-namespace-cachename}-maintenance que contienen información utilizada para el mantenimiento.

Eliminaciones
No se recomienda suprimir manualmente objetos de memoria caché, ya que puede crear incoherencias. Las API de memoria caché garantizan que los metadatos y las dependencias se actualicen correctamente después de una operación. El mandato FLUSHALL AYSNC se utiliza a menudo para borrar una base de datos de Redis. Esto borra la memoria caché de Redis, pero no emite los mensajes necesarios PUBSUB para las memorias caché locales. Utilice la CacheManager aplicación para emitir invalidaciones y borrados.

Invalidaciones

HCL Cache se basa en Redis PUBSUB para distribuir mensajes de invalidación a los contenedores para borrar memorias caché locales. Cada memoria caché define su propio tema para invalidaciones. El tema utiliza la siguiente convención: {cache-<namespace>-<cachename>}-invalidation.

Mandato PUBSUB
El mandato PUBSUB CHANNELS lista todos los temas con una suscriptor activa.
I have no name!@redis-master-0:/$ redis-cli PUBSUB CHANNELS
  1) "{cache-demoqaauth-services/cache/WCSearchFacetDistributedMapCache}-invalidation"
  5) "{cache-demoqalive-services/cache/WCSearchSTADistributedMapCache}-invalidation"
  6) "{cache-demoqalive-services/cache/SearchContractDistributedMapCache}-invalidation"
  7) "{cache-demoqalive-services/cache/WCCatalogGroupDistributedMapCache}-invalidation"
  8) "{cache-demoqaauth-services/cache/WCCatalogGroupDistributedMapCache}-invalidation"
  9) ...
Mandato SUBSCRIBE

Los mandatos SUBSCRIBE y PSUBSCRIBE inician un escucha de temas y se pueden utilizar para supervisar invalidaciones.

El ejemplo siguiente utiliza PSUBSCRIBE para suscribirse a todas las memorias caché en tiempo real. El uso de hace --csv que la salida sea más legible.
I have no name!@redis-master-0:/$ redis-cli --csv PSUBSCRIBE "{cache-demoqalive-*}-invalidation"
Reading messages... (press Ctrl-C to quit)
"psubscribe","{cache-demoqalive-*}-invalidation",1
"pmessage","{cache-demoqalive-*}-invalidation","{cache-demoqalive-baseCache}-invalidation","[p:demoqalivecache-app-8597fc98cc-dm2rz]> inv-cache-dep:product:10001"
"pmessage","{cache-demoqalive-*}-invalidation","{cache-demoqalive-baseCache}-invalidation","[p:demoqalivecache-app-8597fc98cc-dm2rz]> inv-cache-dep:product:10002"
Mandato PUBLICAR
El mandato PUBLISH es la contrapartida del mandato SUBSCRIBE. Aunque el mandato está disponible y se puede utilizar para publicar mensajes de invalidación, la forma soportada y recomendada de probar invalidaciones es utilizando los servicios de REST del gestor de memoria caché. Esto garantiza que el formato del mensaje se conserve. Para fines de prueba o aprendizaje, puede publicar invalidaciones como se indica a continuación:
PUBLISH "{cache-demoqaauth-baseCache}-invalidation" product:10002
PUBLISH "{cache-demoqaauth-baseCache1}-invalidation" inv-cache-clear

Las API de memoria caché añaden información de metadatos opcional que ayudan a identificar el origen de las invalidaciones, la hora a la que se crearon y los consumidores previstos.

HCL Cache con agrupación en clúster de Redis

HCL Cache da soporte a clústeres de Redis. Mediante el uso de claves HASH, a todos los objetos que pertenecen a la misma memoria caché se les asigna la misma ranura. Las ranuras se asignan a servidores maestros exclusivos.

El mandato CLUSTER KEYSLOT se puede utilizar para recuperar la ranura para una memoria caché. Los corchetes ({..}) contienen el espacio de nombres y el nombre de memoria caché:

127.0.0.1:6379> CLUSTER KEYSLOT {cache-demoqalive-baseCache}-data-key1
(integer) 2773
127.0.0.1:6379> CLUSTER KEYSLOT {cache-demoqalive-baseCache}-data-key2
(integer) 2773
127.0.0.1:6379> CLUSTER KEYSLOT {cache-demoqalive-customCache}-data-key1
(integer) 13467

El mandato CLUSTER tiene varias opciones para recuperar información y configurar el clúster. El mandato CLUSTER NODES, por ejemplo, lista nodo detalles y sus ranuras asignadas. En esta lista puede ver que baseCache cae en nodo 10.0.0.3, mientras que customCache en nodo 10.0.0.2.

127.0.0.1:6379> CLUSTER NODES
04c1fb6be4b726ab9e628a8839caa0dc641988ac 10.0.0.1:6379@16379 master - 0 1636119372578 2 connected 5461-10922
1af0ba43e61824f6c1c16cc0ee66cd3aa58f792b 10.0.0.2:6379@16379 master - 0 1636119373581 3 connected 10923-16383
54a3ebe113c84ea638d3df7706dbdb8ad2ca5836 10.0.0.3:6379@16379 myself,master - 0 1636119373000 1 connected 0-54601

También puede utilizar el kubectl get pods -n redis -o wide mandato para correlacionar IP con pods:

kubectl get pods -n redis -o wide
NAME                                 READY   STATUS    RESTARTS   AGE   IP           NODE
hcl-commerce-redis-redis-cluster-0   2/2     Running   0          20m   10.0.0.3    gke-perf-cluster-...
hcl-commerce-redis-redis-cluster-1   2/2     Running   0          20m   10.0.0.1    gke-perf-cluster-...
hcl-commerce-redis-redis-cluster-2   2/2     Running   0          20m   10.0.0.2    gke-perf-cluster-...

La API del gestor de /cm/cache/redisNodeInfo memoria caché también muestra la ranura de memoria caché y los detalles de nodo.

HCL Cache se puede escalar añadiendo nodos adicionales. Redis también permite la migración de ranuras, lo que significa que puede seleccionar qué memorias caché van a qué servidores. Consulte la guía de aprendizaje de clúster y la especificación de clúster para obtener más detalles.