diff --git a/apps/applications/const.py b/apps/applications/const.py
index dde571fbc..79a76b593 100644
--- a/apps/applications/const.py
+++ b/apps/applications/const.py
@@ -17,6 +17,7 @@ class AppCategory(TextChoices):
 class AppType(TextChoices):
     # db category
     mysql = 'mysql', 'MySQL'
+    redis = 'redis', 'Redis'
     oracle = 'oracle', 'Oracle'
     pgsql = 'postgresql', 'PostgreSQL'
     mariadb = 'mariadb', 'MariaDB'
@@ -34,7 +35,9 @@ class AppType(TextChoices):
     @classmethod
     def category_types_mapper(cls):
         return {
-            AppCategory.db: [cls.mysql, cls.oracle, cls.pgsql, cls.mariadb, cls.sqlserver],
+            AppCategory.db: [
+                cls.mysql, cls.oracle, cls.redis, cls.pgsql, cls.mariadb, cls.sqlserver
+            ],
             AppCategory.remote_app: [cls.chrome, cls.mysql_workbench, cls.vmware_client, cls.custom],
             AppCategory.cloud: [cls.k8s]
         }
@@ -62,7 +65,3 @@ class AppType(TextChoices):
     @classmethod
     def cloud_types(cls):
         return [tp.value for tp in cls.category_types_mapper()[AppCategory.cloud]]
-
-
-
-
diff --git a/apps/applications/serializers/attrs/application_type/__init__.py b/apps/applications/serializers/attrs/application_type/__init__.py
index 8881dedc0..94a6f921d 100644
--- a/apps/applications/serializers/attrs/application_type/__init__.py
+++ b/apps/applications/serializers/attrs/application_type/__init__.py
@@ -1,5 +1,6 @@
 
 from .mysql import *
+from .redis import *
 from .mariadb import *
 from .oracle import *
 from .pgsql import *
diff --git a/apps/applications/serializers/attrs/application_type/redis.py b/apps/applications/serializers/attrs/application_type/redis.py
new file mode 100644
index 000000000..3ba9ea715
--- /dev/null
+++ b/apps/applications/serializers/attrs/application_type/redis.py
@@ -0,0 +1,15 @@
+from rest_framework import serializers
+from django.utils.translation import ugettext_lazy as _
+
+from ..application_category import DBSerializer
+
+
+__all__ = ['RedisSerializer']
+
+
+class RedisSerializer(DBSerializer):
+    port = serializers.IntegerField(default=6379, label=_('Port'), allow_null=True)
+
+
+
+
diff --git a/apps/applications/serializers/attrs/attrs.py b/apps/applications/serializers/attrs/attrs.py
index 4bd3f81eb..f249d7816 100644
--- a/apps/applications/serializers/attrs/attrs.py
+++ b/apps/applications/serializers/attrs/attrs.py
@@ -25,6 +25,7 @@ category_serializer_classes_mapping = {
 type_serializer_classes_mapping = {
     # db
     const.AppType.mysql.value: application_type.MySQLSerializer,
+    const.AppType.redis.value: application_type.RedisSerializer,
     const.AppType.mariadb.value: application_type.MariaDBSerializer,
     const.AppType.oracle.value: application_type.OracleSerializer,
     const.AppType.pgsql.value: application_type.PostgreSerializer,
diff --git a/apps/assets/api/system_user.py b/apps/assets/api/system_user.py
index cf61be658..15c541eaa 100644
--- a/apps/assets/api/system_user.py
+++ b/apps/assets/api/system_user.py
@@ -19,6 +19,7 @@ from ..tasks import (
     push_system_user_to_assets_manual, test_system_user_connectivity_manual,
     push_system_user_to_assets
 )
+from ..filters import ProtocolInFilterBackend
 
 logger = get_logger(__file__)
 __all__ = [
@@ -40,6 +41,7 @@ class SystemUserViewSet(SuggestionMixin, OrgBulkModelViewSet):
         'type': ['exact', 'in'],
     }
     search_fields = filterset_fields
+    extra_filter_backends = [ProtocolInFilterBackend]
     serializer_class = serializers.SystemUserSerializer
     serializer_classes = {
         'default': serializers.SystemUserSerializer,
diff --git a/apps/assets/filters.py b/apps/assets/filters.py
index b807396e0..20119aced 100644
--- a/apps/assets/filters.py
+++ b/apps/assets/filters.py
@@ -149,3 +149,13 @@ class IpInFilterBackend(filters.BaseFilterBackend):
                 )
             )
         ]
+
+
+class ProtocolInFilterBackend(filters.BaseFilterBackend):
+    def filter_queryset(self, request, queryset, view):
+        protocols = request.query_params.get('protocols')
+        if not protocols:
+            return queryset
+        protocol_list = [i.strip() for i in protocols.split(',')]
+        queryset = queryset.filter(protocol__in=protocol_list)
+        return queryset
diff --git a/apps/assets/models/user.py b/apps/assets/models/user.py
index 7677c3f08..47f05bf83 100644
--- a/apps/assets/models/user.py
+++ b/apps/assets/models/user.py
@@ -29,6 +29,8 @@ class ProtocolMixin:
         telnet = 'telnet', 'Telnet'
         vnc = 'vnc', 'VNC'
         mysql = 'mysql', 'MySQL'
+        redis = 'redis', 'Redis'
+        redis_acl = 'redis_acl', 'Redis ACL'
         oracle = 'oracle', 'Oracle'
         mariadb = 'mariadb', 'MariaDB'
         postgresql = 'postgresql', 'PostgreSQL'
@@ -44,7 +46,8 @@ class ProtocolMixin:
         Protocol.rdp
     ]
     APPLICATION_CATEGORY_DB_PROTOCOLS = [
-        Protocol.mysql, Protocol.oracle, Protocol.mariadb, Protocol.postgresql, Protocol.sqlserver
+        Protocol.mysql, Protocol.redis, Protocol.redis_acl, Protocol.oracle,
+        Protocol.mariadb, Protocol.postgresql, Protocol.sqlserver
     ]
     APPLICATION_CATEGORY_CLOUD_PROTOCOLS = [
         Protocol.k8s
diff --git a/apps/assets/serializers/system_user.py b/apps/assets/serializers/system_user.py
index 9a085fb27..62ab54683 100644
--- a/apps/assets/serializers/system_user.py
+++ b/apps/assets/serializers/system_user.py
@@ -119,7 +119,8 @@ class SystemUserSerializer(AuthSerializerMixin, BulkOrgResourceModelSerializer):
             return ''
 
         login_mode = self.get_initial_value("login_mode")
-        if login_mode == SystemUser.LOGIN_AUTO and protocol != SystemUser.Protocol.vnc:
+        if login_mode == SystemUser.LOGIN_AUTO and protocol != SystemUser.Protocol.vnc \
+                and protocol != SystemUser.Protocol.redis:
             msg = _('* Automatic login mode must fill in the username.')
             raise serializers.ValidationError(msg)
         return username
diff --git a/apps/terminal/models/session.py b/apps/terminal/models/session.py
index bba196bde..43f320267 100644
--- a/apps/terminal/models/session.py
+++ b/apps/terminal/models/session.py
@@ -29,6 +29,8 @@ class Session(OrgModelMixin):
         VNC = 'vnc', 'vnc'
         TELNET = 'telnet', 'telnet'
         MYSQL = 'mysql', 'mysql'
+        REDIS = 'redis', 'redis'
+        REDIS_ACL = 'redis_acl', 'redis acl'
         ORACLE = 'oracle', 'oracle'
         MARIADB = 'mariadb', 'mariadb'
         SQLSERVER = 'sqlserver', 'sqlserver'
@@ -162,7 +164,8 @@ class Session(OrgModelMixin):
     @property
     def db_protocols(self):
         _PROTOCOL = self.PROTOCOL
-        return [_PROTOCOL.MYSQL, _PROTOCOL.MARIADB, _PROTOCOL.ORACLE, _PROTOCOL.POSTGRESQL, _PROTOCOL.SQLSERVER]
+        return [_PROTOCOL.MYSQL, _PROTOCOL.MARIADB, _PROTOCOL.REDIS, _PROTOCOL.REDIS_ACL,
+                _PROTOCOL.ORACLE, _PROTOCOL.POSTGRESQL, _PROTOCOL.SQLSERVER]
 
     @property
     def can_terminate(self):