Comportamiento y uso del contador en caché
Un contador es una estructura de datos única de valor largo almacenada en la memoria caché. Puede incrementar, disminuir, bloquear y registrar eventos en él. Por ejemplo, se puede utilizar un contador para almacenar las vistas cada vez que se ve un vídeo en un sitio de redes sociales. También se puede utilizar para almacenar suscripciones en un sitio web donde las personas pueden suscribirse o darse de baja.
NCache mejora aún más este contador proporcionando NCache-características específicas como Grupos, Etiquetas, Vencimiento, Cerraduras, Dependencias, y más. Por ejemplo, puede especificar un contador contra el grupo SuscripciónDetalles que puede contener objetos de clientes, así como el contador de suscripciones.
Comportamiento
- Nulo no es un tipo de valor admitido.
- Los contadores se nombran. Por lo tanto, debe proporcionar una clave de caché única para un contador.
Requisitos previos
- Para obtener información sobre los requisitos previos estándar necesarios para trabajar con todos NCache características del lado del cliente, consulte la página proporcionada en Requisitos previos de la API del lado del cliente.
- Para obtener detalles de la API, consulte: Dolor, Contador, Administrador de tipo de datos IData, CrearContador, Valor ajustado, Incremento, Incrementar por, Decremento, Decremento por, ObtenerContador, ICollectionManager, RegistroNotificación, Tipo de datosNotificación de datosDevolución de llamada, Tipo de evento, Tipo de datosEventoFiltro de datos, Bloquear, descubrir.
- Para obtener información sobre los requisitos previos estándar necesarios para trabajar con todos NCache características del lado del cliente, consulte la página proporcionada en Requisitos previos de la API del lado del cliente.
- Para obtener detalles de la API, consulte: cache, Para contrarrestar, getDataStructuresManager, crearContador, obtenerContador, valor ajustado, incremento, incrementar por, decremento, decremento por, Tipo de evento, obtener tipo de evento, Estructura de datosDataChangeListener, onDataStructureCambiado, DataStructureEventArgDataStructureEventArg, Tipo de datosEventoFiltro de datos, obtener artículo de colección, bloquear, desbloquear.
- Para obtener información sobre los requisitos previos estándar necesarios para trabajar con todos NCache características del lado del cliente, consulte la página proporcionada en Requisitos previos de la API del lado del cliente.
- Para obtener detalles de la API, consulte: cache, Para contrarrestar, Administrador de estructuras de datos, getDataStructuresManager, crearContador, obtenerContador, valor ajustado, incremento, incrementar por, decremento, decremento por, Tipo de evento , Estructura de datosDataChangeListener, agregarChangeListener, Tipo de datosEventoFiltro de datos, DataStructureEventArgDataStructureEventArg, obtener tipo de evento, obtener artículo de colección.
- Para obtener información sobre los requisitos previos estándar necesarios para trabajar con todos NCache características del lado del cliente, consulte la página proporcionada en Requisitos previos de la API del lado del cliente.
- Para obtener detalles de la API, consulte: cache, Para contrarrestar, Administrador de estructuras de datos, get_data_structures_manager, crear_contador, obtener_contador, incremento, get_event_type, Tipo de datosEventoFiltro de datos, Filtro de datos de evento.
Crear contador
El siguiente ejemplo de código muestra cómo se puede crear un contador en el caché usando CreateCounter
contra la clave de caché Contador de suscripciones.
// Precondition: Cache must be connected
// Specify unique cache key for counter
string key = "SubscriptionCounter";
// Set initial value of counter
long initialValue = 15;
// Create counter
ICounter counter = cache.DataTypeManager.CreateCounter(key, initialValue);
// Precondition: Cache must be connected
// Specify unique cache key for counter
String key = "SubscriptionCounter";
// Set initial value of counter
long initialValue = 15;
// Create counter
Counter counter = cache.getDataStructuresManager().createCounter(key, initialValue);
// This is an async method
// Precondition: Cache must be connected
// Specify unique cache key for counter
var key = "SubscriptionCounter";
// Set initial value of counter
var initialValue = 15;
// Create counter
var manager = await this.cache.getDataStructuresManager();
var counter = await manager.createCounter(key, initialValue);
# Precondition: Cache must be connected
# Specify unique cache key for counter
key = "SubscriptionCounter"
# Set initial value of counter
initial_value = 15
# Create counter
manager = cache.get_data_structures_manager()
counter = manager.create_counter(key, initial_value)
Obtener y actualizar el valor del contador
Puede actualizar el valor de un contador después de su creación. El siguiente ejemplo de código obtiene un contador de la memoria caché utilizando GetCounter
y establece su valor en otro valor, usando SetValue
. Luego incrementa su valor usando Increment
or IncrementBy
y disminuye su valor usando Decrement
or DecrementBy
.
// Unique key for counter
string key = "SubscriptionCounter";
// Get counter against key
ICounter retrievedCounter = cache.DataTypeManager.GetCounter(key);
// Set value of counter to 100
retrievedCounter.SetValue(100);
// Increment value
long newValue = retrievedCounter.Increment();
// Decrement value
newValue = retrievedCounter.Decrement();
// Increment value by number of 10
newValue = retrievedCounter.IncrementBy(10);
// Decrement value by number of 5
newValue = retrievedCounter.DecrementBy(5);
// Precondition: Cache is already connected
// Unique key for counter
String key = "SubscriptionCounter";
// Get counter against key
Counter retrievedCounter = cache.getDataStructuresManager().getCounter(key);
// Set Value of counter to 100
retrievedCounter.setValue(100);
// Increment value
long newValue = retrievedCounter.increment();
// Decrement value
newValue = retrievedCounter.decrement();
// Increment value by number of 10
newValue = retrievedCounter.incrementBy(10);
// Decrement value by number of 5
newValue = retrievedCounter.decrementBy(5);
// This is an async method
// Precondition: Cache is already connected
// Unique key for counter
var key = "SubscriptionCounter";
// Get counter against key
var manager = await this.cache.getDataStructuresManager();
var retrievedCounter = await manager.getCounter(key);
// Set Value of counter to 100
retrievedCounter.setValue(100);
// Increment value
var newValue = retrievedCounter.increment();
// Decrement value
newValue = retrievedCounter.decrement();
// Increment value by number of 10
newValue = retrievedCounter.incrementBy(10);
// Decrement value by number of 5
newValue = retrievedCounter.decrementBy(5);
# Precondition: Cache is already connected
# Unique key for counter
key = "SubscriptionCounter"
# Get counter against key
manager = cache.get_data_structures_manager()
retrieved_counter = manager.get_counter(key)
# Increment value of retrievedCounter on new subscription
retrieved_counter.increment()
Note
Para garantizar que la operación sea a prueba de fallas, se recomienda manejar cualquier posible excepción dentro de su aplicación, como se explica en Manejo de fallas.
Notificaciones de eventos en contadores
Puede registrar eventos de caché, eventos basados en claves y eventos de estructura de datos en una estructura de datos como un contador. Para el comportamiento, consulte comportamiento inteligente.
El siguiente ejemplo de código registra un evento de caché de ItemAdded
y ItemUpdated
así como registra un evento para ItemAdded
y ItemUpdated
en el mostrador en el caché. Una vez que se crea un contador en el caché, un ItemAdded
Se activa el evento a nivel de caché. Sin embargo, una vez que se agrega un artículo al contador, un ItemAdded
se activa un evento de estructura de datos y ItemUpdated
se activa el evento de nivel de caché.
Registrar evento en contador creado
// Unique cache key for counter
string key = "SubscriptionCounter";
// Set initial value of counter
long initialValue = 15;
// Create counter
ICounter counter = cache.DataTypeManager.CreateCounter(key, initialValue);
// Register ItemAdded, ItemUpdated, ItemRemoved events on counter created
// DataTypeNotificationCallback is callback method specified
counter.RegisterNotification(DataTypeDataNotificationCallback, EventType.ItemAdded |
EventType.ItemUpdated | EventType.ItemRemoved,
DataTypeEventDataFilter.Data);
// Perform operations
// Precondition: Cache is already connected
// Unique cache key for counter
String key = "SubscriptionCounter";
// Set initial value of counter
long initialValue = 15;
// Create counter
Counter counter = cache.getDataStructuresManager().createCounter(key, initialValue);
// Create EnumSet of event types
EnumSet<EventType> enumSet = EnumSet.of(com.alachisoft.ncache.runtime.events.EventType.ItemAdded,
EventType.ItemUpdated, EventType.ItemRemoved);
// Register ItemAdded, ItemUpdated, ItemRemoved events on queue created
// dataChangeListener is the specified callback method
DataStructureDataChangeListener dataChangeListener = dataStructureListener.onDataStructureChanged(collectionName, args);
counter.addChangeListener(dataChangeListener, enumSet, DataTypeEventDataFilter.Data);
// Perform operations
// This is an async method
// Precondition: Cache is already connected
// Unique cache key for counter
var key = "SubscriptionCounter";
// Set initial value of counter
var initialValue = 15;
// Create counter
var counter = await this.cache.getDataStructuresManager().createCounter(key, initialValue);
// Create EnumSet of event types
var enumSet = enumSet.of(
ncache.EventType.ItemAdded,
ncache.EventType.ItemUpdated,
ncache.EventType.ItemRemoved
);
// Register ItemAdded, ItemUpdated, ItemRemoved events on queue created
// dataChangeListener is the specified callback method
var dataChangeListener = dataStructureListener.onDataStructureChanged(
collectionName,
args
);
counter.addChangeListener(
dataChangeListener,
enumSet,
ncache.DataTypeEventDataFilter.Data
);
// Perform operations
def datastructure_callback_function(collection_name, collection_event_args):
# Perform Operations
print("Event Fired for " + str(collection_name))
# Precondition: Cache is already connected
# Unique cache key for counter
key = "SubscriptionCounter"
# Set initial value of counter
initial_value = 15
# Create counter
counter = cache.get_data_structures_manager().create_counter(key, initial_value)
# Register ItemAdded, ItemUpdated, ItemRemoved events on hashset created
events_list = [ncache.EventType.ITEM_ADDED, ncache.EventType.ITEM_UPDATED, ncache.EventType.ITEM_REMOVED]
counter.add_change_listener(datastructure_callback_function, events_list, ncache.DataTypeEventDataFilter.DATA)
# Perform operations
Especificar devolución de llamada para notificación de eventos
private void DataTypeDataNotificationCallback(string collectionName, DataTypeEventArg collectionEventArgs)
{
switch (collectionEventArgs.EventType)
{
case EventType.ItemAdded:
// Item has been added to the collection
break;
case EventType.ItemUpdated:
if (collectionEventArgs.CollectionItem != null)
{
// Item has been updated in the collection
// Perform operations
}
break;
case EventType.ItemRemoved:
// Item has been removed from the collection
break;
}
}
DataStructureDataChangeListener dataStructureListener = new DataStructureDataChangeListener() {
@Override
public void onDataStructureChanged(String collection, DataStructureEventArg dataStructureEventArg) {
switch (dataStructureEventArg.getEventType()) {
case ItemAdded:
// Item has been added to the collection
break;
case ItemUpdated:
if (dataStructureEventArg.getCollectionItem() != null) {
//Item has been updated in the collection
// perform operations
}
break;
case ItemRemoved:
//Item has been removed from the collection
break;
}
}
};
dataStructureListener = new ncache.DataStructureDataChangeListener();
{
function onDataStructureChanged(collection, dataStructureEventArg) {
switch (dataStructureEventArg.getEventType()) {
case ncache.EventType.ItemAdded:
//Item has been added to the collection
break;
case ncache.EventType.ItemUpdated:
if (dataStructureEventArg.getCollectionItem() != null) {
//Item has been updated in the collection
// perform operations
}
break;
case ncache.EventType.ItemRemoved:
//Item has been removed from the collection
break;
}
}
}
def datastructure_callback_function(collection_name: str, collection_event_args: DataStructureEventArg):
if collection_event_args.get_event_type() is ncache.EventType.ITEM_ADDED:
# Item has been added to the collection
print("Item added in " + collection_name)
elif collection_event_args.get_event_type() is ncache.EventType.ITEM_UPDATED:
# Item has been updated in the collection
print("Item updated in " + collection_name)
elif collection_event_args.get_event_type() is ncache.EventType.ITEM_REMOVED:
# Item has been removed from the collection
print("Item removed from " + collection_name)
Contador de bloqueo
Los contadores se pueden bloquear y desbloquear explícitamente para garantizar la coherencia de los datos. El siguiente ejemplo de código crea un contador y lo bloquea durante un período de 10 segundos usando Bloquear y luego lo desbloquea usando descubrir.
// Counter exists with key "SubscriptionCounter"
// Cache Key
string key = "SubscriptionCounter";
// Get counter against key
ICounter counter = cache.DataTypeManager.GetCounter(key);
// Lock counter for 10 seconds
bool isLocked = counter.Lock(TimeSpan.FromSeconds(10));
if (isLocked)
{
// Counter is successfully locked for 10 seconds
// Unless explicitly unlocked
}
else
{
// Counter is not locked because either:
// Counter is not present in the cache
// Counter is already locked
}
counter.Unlock();
// Preconditions: Cache is already connected
// Counter exists with key "SubscriptionCounter"
// Cache Key
String key = "SubscriptionCounter";
// Get counter against key
Counter counter = cache.getDataStructuresManager().getCounter(key);
// Lock counter for 10 seconds
boolean isLocked = counter.lock(TimeSpan.FromSeconds(10));
if (isLocked) {
// Counter is successfully locked for 10 seconds
// Unless explicitly unlocked
} else {
// Counter is not locked because either:
// Counter is not present in the cache
// Counter is already locked
}
counter.unlock();
Recursos adicionales
NCache proporciona una aplicación de muestra para la estructura de datos de contador en GitHub.
Vea también
.NETO: Alachisoft.NCache.Client.Tipos de datos espacio de nombres
Java: com.alachisoft.ncache.cliente.estructuras de datos espacio de nombres
Nodo.js: Para contrarrestar clase.
Pitón: ncache.cliente.estructuras de datos clase.