git: 622fff7546c5 - main - databases/redis88: New port

Muhammad Moinur Rahman <[email protected]>
Newsgroups gmane.os.freebsd.devel.cvs.ports
Message-ID <[email protected]>
The branch main has been updated by bofh:

URL: https://cgit.FreeBSD.org/ports/commit/?id=622fff7546c5818819b6f29bc49584bc8dcb66fc

commit 622fff7546c5818819b6f29bc49584bc8dcb66fc
Author:     Muhammad Moinur Rahman <[email protected]>
AuthorDate: 2026-07-31 19:13:53 +0000
Commit:     Muhammad Moinur Rahman <[email protected]>
CommitDate: 2026-07-31 20:19:17 +0000

    databases/redis88: New port
    
    Redis is an open source, advanced key-value store.  It is often referred
    to as a data structure server since keys can contain strings, hashes,
    lists, sets and sorted sets.
    
    You can run atomic operations on these types, like appending to a string;
    incrementing the value in a hash; pushing to a list; computing set
    intersection, union and difference; or getting the member with highest
    ranking in a sorted set.
    
    In order to achieve its outstanding performance, Redis works with an
    in-memory dataset.  Depending on your use case, you can persist it either
    by dumping the dataset to disk every once in a while, or by appending each
    command to a log.
    
    Redis also supports trivial-to-setup master-slave replication, with very
    fast non-blocking first synchronization, auto-reconnection on net split
    and so forth.
    
    WWW: https://redis.io/
    
    This is redis version 8.8.X as a seperate port to updgrade the redis
    port to 8.10.X.
---
 databases/Makefile                                 |  1 +
 databases/redis88/Makefile                         | 92 ++++++++++++++++++++++
 databases/redis88/distinfo                         |  3 +
 databases/redis88/files/patch-deps_Makefile        | 21 +++++
 .../redis88/files/patch-deps_hiredis_Makefile      | 41 ++++++++++
 databases/redis88/files/patch-deps_hiredis_net.c   | 39 +++++++++
 .../redis88/files/patch-deps_linenoise_Makefile    | 15 ++++
 .../redis88/files/patch-deps_lua_src_lua__cjson.c  | 12 +++
 databases/redis88/files/patch-deps_xxhash_Makefile | 16 ++++
 databases/redis88/files/patch-redis.conf           | 38 +++++++++
 databases/redis88/files/patch-src_Makefile         | 19 +++++
 databases/redis88/files/patch-src_mkreleasehdr.sh  | 11 +++
 .../redis88/files/patch-tests_modules_Makefile     | 14 ++++
 databases/redis88/files/pkg-message.in             | 11 +++
 databases/redis88/files/redis.in                   | 73 +++++++++++++++++
 databases/redis88/files/sentinel.in                | 39 +++++++++
 databases/redis88/pkg-descr                        | 17 ++++
 databases/redis88/pkg-plist                        | 11 +++
 18 files changed, 473 insertions(+)

diff --git a/databases/Makefile b/databases/Makefile
index 866810c747f1..f22ae1a1e065 100644
--- a/databases/Makefile
+++ b/databases/Makefile
@@ -931,6 +931,7 @@
     SUBDIR += redis82
     SUBDIR += redis84
     SUBDIR += redis86
+    SUBDIR += redis88
     SUBDIR += redis_exporter
     SUBDIR += redisbloom
     SUBDIR += redisjson
diff --git a/databases/redis88/Makefile b/databases/redis88/Makefile
new file mode 100644
index 000000000000..d1de11e45de8
--- /dev/null
+++ b/databases/redis88/Makefile
@@ -0,0 +1,92 @@
+PORTNAME=	redis
+DISTVERSION=	8.8.1
+CATEGORIES=	databases
+MASTER_SITES=	https://download.redis.io/releases/
+PKGNAMESUFFIX=	86
+
+MAINTAINER=	[email protected]
+COMMENT=	Persistent key-value database with built-in net interface(8.8.X)
+WWW=		https://redis.io/
+
+LICENSE=	AGPLv3 RSALv2 SSPLv1
+LICENSE_COMB=	dual
+LICENSE_NAME_RSALv2=	Redis Source Available License v2
+LICENSE_NAME_SSPLv1=	Server Side Public License v1
+LICENSE_FILE=	${WRKSRC}/LICENSE.txt
+LICENSE_PERMS_RSALv2=	dist-mirror dist-sell pkg-mirror pkg-sell auto-accept
+LICENSE_PERMS_SSPLv1=	dist-mirror dist-sell pkg-mirror pkg-sell auto-accept
+
+USES=		compiler:c11 cpe gmake localbase:ldflags pkgconfig tcl:test
+CPE_VENDOR=	redis
+USE_RC_SUBR=	redis sentinel
+
+MAKE_ENV=	OPTIMIZATION= \
+		V=yo
+
+#PIE_UNSAFE=	ld: error: relocation R_X86_64_32 cannot be used against local \
+#		symbol; recompile with -fPIC
+
+CONFLICTS_INSTALL=	redis-devel redis[0-9]*
+
+BINARY_ALIAS=	gmd5sum=md5sum
+PORTSCOUT=	limit:^8\.8\.
+SUB_FILES=	pkg-message
+SUB_LIST=	PORTNAME=${PORTNAME} \
+		REDIS_DBDIR=${REDIS_DBDIR} \
+		REDIS_GROUP=${GROUPS} \
+		REDIS_LOGDIR=${REDIS_LOGDIR} \
+		REDIS_RUNDIR=${REDIS_RUNDIR} \
+		REDIS_USER=${USERS}
+
+USERS=		redis
+GROUPS=		redis
+
+PLIST_SUB=	REDIS_DBDIR=${REDIS_DBDIR} \
+		REDIS_GROUP=${GROUPS} \
+		REDIS_LOGDIR=${REDIS_LOGDIR} \
+		REDIS_RUNDIR=${REDIS_RUNDIR} \
+		REDIS_USER=${USERS}
+
+OPTIONS_DEFINE=		JEMALLOC TLS
+OPTIONS_DEFAULT=	TLS
+OPTIONS_GROUP=		MODULES
+OPTIONS_GROUP_MODULES=		REDISBLOOM REDISJSON
+OPTIONS_SUB=		yes
+
+JEMALLOC_DESC=	Use jemalloc
+REDISBLOOM_DESC=	RedisBLOOM module
+REDISJSON_DESC=		RedisJSON module
+TLS_DESC=	Use TLS (openssl req.)
+
+JEMALLOC_MAKE_ENV=	USE_JEMALLOC=yes
+REDISBLOOM_LIB_DEPENDS=		redisbloom.so>=0:databases/redisbloom
+REDISJSON_LIB_DEPENDS=		librejson.so>=0:databases/redisjson
+TLS_USES=		ssl
+TLS_MAKE_ENV=		BUILD_TLS=yes
+
+BIN_FILES=	redis-benchmark redis-check-aof redis-check-rdb redis-cli \
+		redis-sentinel redis-server
+
+REDIS_DBDIR?=	/var/db/redis
+REDIS_RUNDIR?=	/var/run/redis
+REDIS_LOGDIR?=	/var/log/redis
+
+post-patch-JEMALLOC-on:
+	@${REINPLACE_CMD} '78s!Linux!FreeBSD!g' ${WRKSRC}/src/Makefile
+
+post-build:
+	${SED} ${SUB_LIST:S/$/!g/:S/^/ -e s!%%/:S/=/%%!/} \
+		${WRKSRC}/redis.conf > ${WRKDIR}/redis.conf
+
+do-install:
+	${INSTALL_PROGRAM} ${BIN_FILES:C!^!${WRKSRC}/src/!} ${STAGEDIR}${PREFIX}/bin/
+	${INSTALL_DATA} ${WRKDIR}/redis.conf ${STAGEDIR}${PREFIX}/etc/redis.conf.sample
+	${INSTALL_DATA} ${WRKSRC}/sentinel.conf ${STAGEDIR}${PREFIX}/etc/sentinel.conf.sample
+	${MKDIR} ${STAGEDIR}${REDIS_LOGDIR} \
+		${STAGEDIR}${REDIS_DBDIR} \
+		${STAGEDIR}${REDIS_RUNDIR}
+
+do-test:
+	@cd ${WRKSRC} && ${TCLSH} tests/test_helper.tcl
+
+.include <bsd.port.mk>
diff --git a/databases/redis88/distinfo b/databases/redis88/distinfo
new file mode 100644
index 000000000000..fd6c49e35aed
--- /dev/null
+++ b/databases/redis88/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1784924262
+SHA256 (redis-8.8.1.tar.gz) = 1d1e423c9c808de3cb01dd3300d2b8d305b7691382e31a847ec17b66d3157477
+SIZE (redis-8.8.1.tar.gz) = 4480158
diff --git a/databases/redis88/files/patch-deps_Makefile b/databases/redis88/files/patch-deps_Makefile
new file mode 100644
index 000000000000..5fc5b59e0000
--- /dev/null
+++ b/databases/redis88/files/patch-deps_Makefile
@@ -0,0 +1,21 @@
+--- deps/Makefile.orig	2026-05-25 09:26:50 UTC
++++ deps/Makefile
+@@ -118,7 +118,7 @@ else
+ ifeq ($(LUA_DEBUG),yes)
+ 	LUA_CFLAGS+= -O0 -g -DLUA_USE_APICHECK
+ else
+-	LUA_CFLAGS+= -O2 
++	LUA_CFLAGS+=
+ endif
+ ifeq ($(LUA_COVERAGE),yes)
+ 	LUA_CFLAGS += -fprofile-arcs -ftest-coverage
+@@ -146,7 +146,7 @@ jemalloc: .make-prerequisites
+ 
+ jemalloc: .make-prerequisites
+ 	@printf '%b %b\n' $(MAKECOLOR)MAKE$(ENDCOLOR) $(BINCOLOR)$@$(ENDCOLOR)
+-	cd jemalloc && ./configure --disable-cxx --with-version=5.3.0-0-g0 --with-lg-quantum=3 --disable-cache-oblivious --with-jemalloc-prefix=je_ CFLAGS="$(JEMALLOC_CFLAGS)" LDFLAGS="$(JEMALLOC_LDFLAGS)" $(JEMALLOC_CONFIGURE_OPTS)
+-	cd jemalloc && $(MAKE) lib/libjemalloc.a
++	cd jemalloc && ./configure --disable-cxx --with-version=5.3.0-0-g0 --with-lg-quantum=3 --disable-cache-oblivious --with-jemalloc-prefix=je_ CFLAGS="$(JEMALLOC_CFLAGS)" CXXFLAGS="$(JEMALLOC_CFLAGS)" LDFLAGS="$(JEMALLOC_LDFLAGS)" $(JEMALLOC_CONFIGURE_OPTS)
++	cd jemalloc && $(MAKE) CFLAGS="$(JEMALLOC_CFLAGS)" CXXFLAGS="$(JEMALLOC_CFLAGS)" LDFLAGS="$(JEMALLOC_LDFLAGS)" lib/libjemalloc.a
+ 
+ .PHONY: jemalloc
diff --git a/databases/redis88/files/patch-deps_hiredis_Makefile b/databases/redis88/files/patch-deps_hiredis_Makefile
new file mode 100644
index 000000000000..6bb5418e44d6
--- /dev/null
+++ b/databases/redis88/files/patch-deps_hiredis_Makefile
@@ -0,0 +1,41 @@
+--- deps/hiredis/Makefile.orig	2025-08-04 11:05:03 UTC
++++ deps/hiredis/Makefile
+@@ -15,7 +15,7 @@ HIREDIS_SONAME=$(shell grep HIREDIS_SONAME hiredis.h |
+ HIREDIS_SONAME=$(shell grep HIREDIS_SONAME hiredis.h | awk '{print $$3}')
+ 
+ # Installation related variables and target
+-PREFIX?=/usr/local
++PREFIX?=${PREFIX}
+ INCLUDE_PATH?=include/hiredis
+ LIBRARY_PATH?=lib
+ PKGCONF_PATH?=pkgconfig
+@@ -43,10 +43,9 @@ CXX:=$(shell sh -c 'type $${CXX%% *} >/dev/null 2>/dev
+ # Fallback to gcc when $CC is not in $PATH.
+ CC:=$(shell sh -c 'type $${CC%% *} >/dev/null 2>/dev/null && echo $(CC) || echo gcc')
+ CXX:=$(shell sh -c 'type $${CXX%% *} >/dev/null 2>/dev/null && echo $(CXX) || echo g++')
+-OPTIMIZATION?=-O3
+ WARNINGS=-Wall -Wextra -Werror -Wstrict-prototypes -Wwrite-strings -Wno-missing-field-initializers
+ DEBUG_FLAGS?= -g -ggdb
+-REAL_CFLAGS=$(OPTIMIZATION) -fPIC $(CPPFLAGS) $(CFLAGS) $(WARNINGS) $(DEBUG_FLAGS) $(PLATFORM_FLAGS) $(HIREDIS_CFLAGS)
++REAL_CFLAGS=$(OPTIMIZATION) -fPIC $(CFLAGS) $(WARNINGS) $(DEBUG_FLAGS) $(PLATFORM_FLAGS) $(HIREDIS_CFLAGS)
+ REAL_LDFLAGS=$(LDFLAGS) $(HIREDIS_LDFLAGS)
+ 
+ DYLIBSUFFIX=so
+@@ -127,7 +126,16 @@ endif
+ else
+   REAL_CFLAGS+=-pedantic
+ endif
+-
++ifeq ($(uname_S),FreeBSD)
++  CFLAGS?=$(CFLAGS)
++  CCLINK?=pthread
++  LDFLAGS?=-L. -Wl,-rpath,.
++  DYLIBNAME?=libhiredis.so
++  DYLIB_MAKE_CMD?=$(CC) -o ${DYLIBNAME} ${OBJ}
++  STLIBNAME?=libhiredis.a
++  STLIB_MAKE_CMD?=ar rcs ${STLIBNAME} ${OBJ}
++  SSL_LDFLAGS+=${OPENSSL_LDFLAGS}
++endif
+ ifeq ($(uname_S),SunOS)
+   IS_SUN_CC=$(shell sh -c '$(CC) -V 2>&1 |egrep -i -c "sun|studio"')
+   ifeq ($(IS_SUN_CC),1)
diff --git a/databases/redis88/files/patch-deps_hiredis_net.c b/databases/redis88/files/patch-deps_hiredis_net.c
new file mode 100644
index 000000000000..84dbe39e16e6
--- /dev/null
+++ b/databases/redis88/files/patch-deps_hiredis_net.c
@@ -0,0 +1,39 @@
+--- deps/hiredis/net.c.orig	2025-08-04 11:05:03 UTC
++++ deps/hiredis/net.c
+@@ -185,14 +185,34 @@ int redisKeepAlive(redisContext *c, int interval) {
+         __redisSetError(c,REDIS_ERR_OTHER,strerror(errno));
+         return REDIS_ERR;
+     }
+-#else
+-#if defined(__GLIBC__) && !defined(__FreeBSD_kernel__)
++#elif defined(__GLIBC__)
+     if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &val, sizeof(val)) < 0) {
+         __redisSetError(c,REDIS_ERR_OTHER,strerror(errno));
+         return REDIS_ERR;
+     }
+ 
+     val = interval/3;
++    if (val == 0) val = 1;
++    if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPINTVL, &val, sizeof(val)) < 0) {
++        __redisSetError(c,REDIS_ERR_OTHER,strerror(errno));
++        return REDIS_ERR;
++    }
++
++    val = 3;
++    if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPCNT, &val, sizeof(val)) < 0) {
++        __redisSetError(c,REDIS_ERR_OTHER,strerror(errno));
++        return REDIS_ERR;
++    }
++#else
++#if !defined(__sun) && defined(TCP_KEEPIDLE) && defined(TCP_KEEPINTL) && \
++    defined(TCP_KEEPCNT)
++    val = interval;
++    if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &val, sizeof(val)) < 0) {
++        __redisSetError(c,REDIS_ERR_OTHER,strerror(errno));
++        return REDIS_ERR;
++    }
++
++    val = internal/3;
+     if (val == 0) val = 1;
+     if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPINTVL, &val, sizeof(val)) < 0) {
+         __redisSetError(c,REDIS_ERR_OTHER,strerror(errno));
diff --git a/databases/redis88/files/patch-deps_linenoise_Makefile b/databases/redis88/files/patch-deps_linenoise_Makefile
new file mode 100644
index 000000000000..aef0f10966af
--- /dev/null
+++ b/databases/redis88/files/patch-deps_linenoise_Makefile
@@ -0,0 +1,15 @@
+--- deps/linenoise/Makefile.orig	2019-09-25 10:40:18 UTC
++++ deps/linenoise/Makefile
+@@ -1,10 +1,10 @@
+ STD=
+ WARN= -Wall
+-OPT= -Os
++#OPT= -Os
+ 
+ R_CFLAGS= $(STD) $(WARN) $(OPT) $(DEBUG) $(CFLAGS)
+ R_LDFLAGS= $(LDFLAGS)
+-DEBUG= -g
++#DEBUG= -g
+ 
+ R_CC=$(CC) $(R_CFLAGS)
+ R_LD=$(CC) $(R_LDFLAGS)
diff --git a/databases/redis88/files/patch-deps_lua_src_lua__cjson.c b/databases/redis88/files/patch-deps_lua_src_lua__cjson.c
new file mode 100644
index 000000000000..9303727b7868
--- /dev/null
+++ b/databases/redis88/files/patch-deps_lua_src_lua__cjson.c
@@ -0,0 +1,12 @@
+--- deps/lua/src/lua_cjson.c.orig	2025-08-04 11:05:03 UTC
++++ deps/lua/src/lua_cjson.c
+@@ -47,7 +47,9 @@
+ #include "strbuf.h"
+ #include "fpconv.h"
+ 
++#if defined(__sun)
+ #include "../../../src/solarisfixes.h"
++#endif
+ 
+ #ifndef CJSON_MODNAME
+ #define CJSON_MODNAME   "cjson"
diff --git a/databases/redis88/files/patch-deps_xxhash_Makefile b/databases/redis88/files/patch-deps_xxhash_Makefile
new file mode 100644
index 000000000000..d26eb22d9ffd
--- /dev/null
+++ b/databases/redis88/files/patch-deps_xxhash_Makefile
@@ -0,0 +1,16 @@
+--- deps/xxhash/Makefile.orig	2026-05-25 09:26:50 UTC
++++ deps/xxhash/Makefile
+@@ -186,11 +186,12 @@ clean:
+ 	$(RM) xxhsum.wasm xxhsum.js xxhsum.html
+ 	$(RM) xxh32sum$(EXT) xxh64sum$(EXT) xxh128sum$(EXT) xxh3sum$(EXT)
+ 	$(RM) fuzzer
++ifneq	($(wildcard tests/*),)
+ 	$(MAKE) -C tests clean
+ 	$(MAKE) -C tests/bench clean
+ 	$(MAKE) -C tests/collisions clean
+ 	@echo cleaning completed
+-
++endif
+ 
+ # =================================================
+ # tests
diff --git a/databases/redis88/files/patch-redis.conf b/databases/redis88/files/patch-redis.conf
new file mode 100644
index 000000000000..1bbed67a1b5d
--- /dev/null
+++ b/databases/redis88/files/patch-redis.conf
@@ -0,0 +1,38 @@
+--- redis.conf.orig	2026-05-25 09:26:50 UTC
++++ redis.conf
+@@ -324,7 +324,7 @@ tcp-keepalive 300
+ # By default Redis does not run as a daemon. Use 'yes' if you need it.
+ # Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
+ # When Redis is supervised by upstart or systemd, this parameter has no impact.
+-daemonize no
++daemonize yes
+ 
+ # If you run Redis from upstart or systemd, Redis can interact with your
+ # supervision tree. Options:
+@@ -356,7 +356,7 @@ daemonize no
+ #
+ # Note that on modern Linux systems "/run/redis.pid" is more conforming
+ # and should be used instead.
+-pidfile /var/run/redis_6379.pid
++pidfile %%REDIS_RUNDIR%%/redis.pid
+ 
+ # Specify the server verbosity level.
+ # This can be one of:
+@@ -370,7 +370,7 @@ loglevel notice
+ # Specify the log file name. Also the empty string can be used to force
+ # Redis to log on the standard output. Note that if you use standard
+ # output for logging but daemonize, logs will be sent to /dev/null
+-logfile ""
++logfile %%REDIS_LOGDIR%%/redis.log
+ 
+ # To enable logging to the system logger, just set 'syslog-enabled' to yes,
+ # and optionally update the other syslog parameters to suit your needs.
+@@ -530,7 +530,7 @@ rdb-del-sync-files no
+ # The Append Only File will also be created inside this directory.
+ #
+ # Note that you must specify a directory here, not a file name.
+-dir ./
++dir %%REDIS_DBDIR%%/
+ 
+ ################################# REPLICATION #################################
+ 
diff --git a/databases/redis88/files/patch-src_Makefile b/databases/redis88/files/patch-src_Makefile
new file mode 100644
index 000000000000..1691eabbbabd
--- /dev/null
+++ b/databases/redis88/files/patch-src_Makefile
@@ -0,0 +1,19 @@
+--- src/Makefile.orig	2026-05-25 09:26:50 UTC
++++ src/Makefile
+@@ -69,7 +69,7 @@ endif
+ 	STD+=-std=c99
+ endif
+ 
+-PREFIX?=/usr/local
++PREFIX:=$(PREFIX)
+ INSTALL_BIN=$(PREFIX)/bin
+ INSTALL=install
+ PKG_CONFIG?=pkg-config
+@@ -152,7 +152,6 @@ FINAL_LIBS=-lm
+ FINAL_CFLAGS=$(STD) $(WARN) $(OPT) $(DEBUG) $(CFLAGS) $(REDIS_CFLAGS)
+ FINAL_LDFLAGS=$(LDFLAGS) $(OPT) $(REDIS_LDFLAGS) $(DEBUG)
+ FINAL_LIBS=-lm
+-DEBUG=-g -ggdb
+ 
+ # Linux ARM32 needs -latomic at linking time
+ ifneq (,$(findstring armv,$(uname_M)))
diff --git a/databases/redis88/files/patch-src_mkreleasehdr.sh b/databases/redis88/files/patch-src_mkreleasehdr.sh
new file mode 100644
index 000000000000..2a568628139d
--- /dev/null
+++ b/databases/redis88/files/patch-src_mkreleasehdr.sh
@@ -0,0 +1,11 @@
+--- src/mkreleasehdr.sh.orig	2024-06-06 11:03:20 UTC
++++ src/mkreleasehdr.sh
+@@ -1,6 +1,6 @@
+ #!/bin/sh
+-GIT_SHA1=`(git show-ref --head --hash=8 2> /dev/null || echo 00000000) | head -n1`
+-GIT_DIRTY=`git diff --no-ext-diff -- ../src ../deps 2> /dev/null | wc -l`
++GIT_SHA1="00000000"
++GIT_DIRTY="0"
+ BUILD_ID=`uname -n`"-"`date +%s`
+ if [ -n "$SOURCE_DATE_EPOCH" ]; then
+   BUILD_ID=$(date -u -d "@$SOURCE_DATE_EPOCH" +%s 2>/dev/null || date -u -r "$SOURCE_DATE_EPOCH" +%s 2>/dev/null || date -u +%s)
diff --git a/databases/redis88/files/patch-tests_modules_Makefile b/databases/redis88/files/patch-tests_modules_Makefile
new file mode 100644
index 000000000000..b91426ed4d1b
--- /dev/null
+++ b/databases/redis88/files/patch-tests_modules_Makefile
@@ -0,0 +1,14 @@
+--- tests/modules/Makefile.orig	2025-12-02 10:24:24 UTC
++++ tests/modules/Makefile
+@@ -34,6 +34,11 @@ endif
+ endif
+ endif
+
++ifeq ($(uname_S),FreeBSD)
++	LD = cc
++	CC = cc
++endif
++
+ # OS X 11.x doesn't have /usr/lib/libSystem.dylib and needs an explicit setting.
+ ifeq ($(uname_S),Darwin)
+ ifeq ("$(wildcard /usr/lib/libSystem.dylib)","")
diff --git a/databases/redis88/files/pkg-message.in b/databases/redis88/files/pkg-message.in
new file mode 100644
index 000000000000..85a89529262a
--- /dev/null
+++ b/databases/redis88/files/pkg-message.in
@@ -0,0 +1,11 @@
+[
+{ type: install
+  message: <<EOM
+      To setup "%%PORTNAME%%" you need to edit the configuration file:
+      %%PREFIX%%/etc/%%PORTNAME%%.conf
+
+      To run redis from startup, add %%PORTNAME%%_enable="YES"
+      in your /etc/rc.conf.
+EOM
+}
+]
diff --git a/databases/redis88/files/redis.in b/databases/redis88/files/redis.in
new file mode 100644
index 000000000000..b35817164250
--- /dev/null
+++ b/databases/redis88/files/redis.in
@@ -0,0 +1,73 @@
+#!/bin/sh
+
+# PROVIDE: redis
+# REQUIRE: LOGIN
+# BEFORE:  securelevel
+# KEYWORD: shutdown
+
+# Add the following line to /etc/rc.conf to enable `redis':
+#
+#redis_enable="YES"
+#
+# Define profiles here to run separate redis instances:
+#
+#redis_profiles="foo bar" #  Script uses %%PREFIX%%/etc/redis-NAME.conf respectively.
+#			     For correct script working please update pidfile entries in
+#			     redis-NAME.conf files.
+
+. /etc/rc.subr
+
+name="redis"
+rcvar="${name}_enable"
+
+extra_commands="reload"
+
+command="%%PREFIX%%/bin/redis-server"
+pidfile="%%REDIS_RUNDIR%%/$name.pid"
+
+# read configuration and set defaults
+load_rc_config "$name"
+: ${redis_enable="NO"}
+: ${redis_user="%%REDIS_USER%%"}
+: ${redis_group="%%REDIS_GROUP%%"}
+: ${redis_config="%%PREFIX%%/etc/$name.conf"}
+
+command_args="${redis_config}"
+required_files="${redis_config}"
+start_precmd="${name}_prestart"
+
+_profile_exists() {
+	for _p in ${redis_profiles}; do
+		[ "${_p}" = "$1" ] && return 1;
+	done
+	return 0
+}
+
+if [ $# -eq 2 ]; then
+	_profile=$2
+	_profile_exists $_profile
+	_exists=$?
+	[ ${_exists} -ne 1 ] && {
+		echo "`basename %%PREFIX%%/etc/rc.d/redis`: no '$2' in 'redis_profiles'"
+		exit 1
+	};
+	echo "-- Profile: ${_profile} --"
+	config_file="%%PREFIX%%/etc/${name}-${_profile}.conf"
+	command_args="${config_file}"
+	pidfile="%%REDIS_RUNDIR%%/${_profile}.pid"
+	required_files="${config_file}"
+elif [ -n "${redis_profiles}" ]; then
+	_swap=$*; shift; _profiles=$*
+	_profiles=${_profiles:-${redis_profiles}}
+	set -- ${_swap}
+	for _profile in ${_profiles}; do
+		%%PREFIX%%/etc/rc.d/redis $1 ${_profile}
+	done
+	exit 0
+fi
+
+redis_prestart() {
+	install -d -m 755 -o "${redis_user}" -g "${redis_group}" "${pidfile%/*}"
+}
+
+run_rc_command "$1"
diff --git a/databases/redis88/files/sentinel.in b/databases/redis88/files/sentinel.in
new file mode 100644
index 000000000000..088f4382fc06
--- /dev/null
+++ b/databases/redis88/files/sentinel.in
@@ -0,0 +1,39 @@
+#!/bin/sh
+
+# PROVIDE: sentinel
+# REQUIRE: LOGIN
+# BEFORE:  securelevel
+# KEYWORD: shutdown
+
+# Add the following line to /etc/rc.conf to enable `sentinel':
+#
+#sentinel_enable="YES"
+#
+
+. /etc/rc.subr
+
+name="sentinel"
+rcvar="${name}_enable"
+
+command="/usr/local/bin/redis-sentinel"
+pidfile="/var/run/redis/$name.pid"
+
+# read configuration and set defaults
+load_rc_config "$name"
+: ${sentinel_enable="NO"}
+: ${sentinel_user="redis"}
+: ${sentinel_config="/usr/local/etc/$name.conf"}
+
+command_args="${sentinel_config} --daemonize yes --pidfile ${pidfile}"
+required_files="${sentinel_config}"
+start_precmd="${name}_checks"
+restart_precmd="${name}_checks"
+
+sentinel_checks()
+{
+    if [ x`id -u ${sentinel_user}` != x`stat -f %u ${sentinel_config}` ]; then
+	err 1 "${sentinel_config} must be owned by user ${sentinel_user}"
+    fi
+}
+
+run_rc_command "$1"
diff --git a/databases/redis88/pkg-descr b/databases/redis88/pkg-descr
new file mode 100644
index 000000000000..5500bd1afad4
--- /dev/null
+++ b/databases/redis88/pkg-descr
@@ -0,0 +1,17 @@
+Redis is an open source, advanced key-value store.  It is often referred
+to as a data structure server since keys can contain strings, hashes,
+lists, sets and sorted sets.
+
+You can run atomic operations on these types, like appending to a string;
+incrementing the value in a hash; pushing to a list; computing set
+intersection, union and difference; or getting the member with highest
+ranking in a sorted set.
+
+In order to achieve its outstanding performance, Redis works with an
+in-memory dataset.  Depending on your use case, you can persist it either
+by dumping the dataset to disk every once in a while, or by appending each
+command to a log.
+
+Redis also supports trivial-to-setup master-slave replication, with very
+fast non-blocking first synchronization, auto-reconnection on net split
+and so forth.
diff --git a/databases/redis88/pkg-plist b/databases/redis88/pkg-plist
new file mode 100644
index 000000000000..fafc472df89b
--- /dev/null
+++ b/databases/redis88/pkg-plist
@@ -0,0 +1,11 @@
+bin/redis-benchmark
+bin/redis-check-aof
+bin/redis-check-rdb
+bin/redis-cli
+bin/redis-sentinel
+bin/redis-server
+@sample etc/redis.conf.sample
+@sample(%%REDIS_USER%%,%%REDIS_GROUP%%,) etc/sentinel.conf.sample
+@dir(%%REDIS_USER%%,%%REDIS_GROUP%%,) %%REDIS_DBDIR%%
+@dir(%%REDIS_USER%%,%%REDIS_GROUP%%,) %%REDIS_LOGDIR%%
+@dir(%%REDIS_USER%%,%%REDIS_GROUP%%,) %%REDIS_RUNDIR%%
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.