---
title:  Tools and Modules
---

<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements.  See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License.  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->

*Tools and Modules* describes tools and modules associated with <%=vars.product_name_long%>.

<a id="deploy_run__section_tool_intro"></a>

-   **[gfsh](gfsh/chapter_overview.html)**

    `gfsh` (pronounced "jee-fish") provides a single, powerful command-line interface from which you can launch, manage, and monitor <%=vars.product_name%> processes, data, and applications.

-   **[Gemcached](gemcached/chapter_overview.html)**

    Gemcached is a <%=vars.product_name%> adapter that allows Memcached clients to communicate with a <%=vars.product_name%> server cluster, as if the servers were memcached servers. Memcached is an open-source caching solution that uses a distributed, in-memory hash map to store key-value pairs of string or object data.

-   **[HTTP Session Management Modules](http_session_mgmt/chapter_overview.html)**

    The <%=vars.product_name_long%> HTTP Session Management modules provide fast, scalable, and reliable session replication for HTTP servers without requiring application changes.

-   **[<%=vars.product_name%> Pulse](pulse/pulse-overview.html)**

    <%=vars.product_name%> Pulse is a Web Application that provides a graphical dashboard for monitoring vital, real-time health and performance of <%=vars.product_name%> clusters, members, and regions.

-   **[<%=vars.product_name%> Redis Adapter](redis_adapter.html)**

    The <%=vars.product_name%> Redis adapter allows <%=vars.product_name%> to function as a drop-in replacement for a Redis data store, letting Redis applications take advantage of <%=vars.product_name%>’s scaling capabilities without changing their client code. Redis clients connect to a <%=vars.product_name%> server in the same way they connect to a Redis server, using an IP address and a port number.

-   **[Apache Lucene&reg; Integration](lucene_integration.html)**

    The Apache Lucene&reg; integration enables users to create Lucene indexes and execute Lucene searches on data stored in <%=vars.product_name%>.

-   **[Micrometer](micrometer/micrometer-overview.html)**

    Micrometer is a simple facade for application monitoring (as SLF4J, for example, is a simple facade for logging) which allows publishing metrics from <%=vars.product_name%> to various Application Performance Monitoring (APM) tools.
    
    
