<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Redis feature store with Predis on Docs</title>
    <link>https://redis.io/docs/latest/develop/use-cases/feature-store/php/</link>
    <description>Recent content in Redis feature store with Predis on Docs</description>
    <generator>Hugo</generator>
    <language>en</language>
    <atom:link href="https://redis.io/docs/latest/develop/use-cases/feature-store/php/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title></title>
      <link>https://redis.io/docs/latest/develop/use-cases/feature-store/php/demo_template/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://redis.io/docs/latest/develop/use-cases/feature-store/php/demo_template/</guid>
      <description>&lt;!DOCTYPE html&gt;&#xA;&lt;html lang=&#34;en&#34;&gt;&#xA;&lt;head&gt;&#xA;  &lt;meta charset=&#34;utf-8&#34;&gt;&#xA;  &lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1&#34;&gt;&#xA;  &lt;title&gt;Redis Feature Store Demo (PHP)&lt;/title&gt;&#xA;  &lt;style&gt;&#xA;    :root {&#xA;      --bg: #eef3f1;&#xA;      --panel: #ffffff;&#xA;      --ink: #1d2730;&#xA;      --accent: #267d6b;&#xA;      --accent-dark: #1a594c;&#xA;      --muted: #5c6770;&#xA;      --line: #d4dfdb;&#xA;      --ok: #d2ecdf;&#xA;      --warn: #f8e0d0;&#xA;      --pill: #d9ebe6;&#xA;      --batch: #e6e0f0;&#xA;      --stream: #d9ebe6;&#xA;    }&#xA;    * { box-sizing: border-box; }&#xA;    body {&#xA;      margin: 0;&#xA;      font-family: Georgia, &#34;Times New Roman&#34;, serif;&#xA;      color: var(--ink);&#xA;      background:&#xA;        radial-gradient(circle at top left, #f3faf7, transparent 32rem),&#xA;        linear-gradient(180deg, #ecf2f0 0%, var(--bg) 100%);&#xA;      min-height: 100vh;&#xA;    }&#xA;    main { max-width: 1080px; margin: 0 auto; padding: 40px 20px 72px; }&#xA;    h1 { font-size: clamp(2rem, 4.6vw, 3.4rem); line-height: 1.05; margin-bottom: 8px; }&#xA;    p.lede { max-width: 58rem; font-size: 1.05rem; color: var(--muted); }&#xA;    .grid { display: grid; gap: 18px; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); margin-top: 24px; }&#xA;    .panel { background: rgba(255, 255, 255, 0.96); border: 1px solid var(--line); border-radius: 16px; padding: 20px; box-shadow: 0 10px 32px rgba(20, 60, 50, 0.07); }&#xA;    .panel.wide { grid-column: 1 / -1; }&#xA;    .panel h2 { margin-top: 0; margin-bottom: 8px; font-size: 1.25rem; }&#xA;    .panel h3 { margin: 14px 0 6px; font-size: 1rem; }&#xA;    .pill { display: inline-block; border-radius: 999px; background: var(--pill); color: var(--accent-dark); padding: 6px 10px; font-size: 0.85rem; margin-bottom: 10px; }&#xA;    label { display: block; font-weight: bold; margin: 10px 0 4px; }&#xA;    input, select { width: 100%; padding: 9px 11px; border-radius: 9px; border: 1px solid #c0d2cc; font: inherit; background: white; }&#xA;    button { appearance: none; border: 0; border-radius: 999px; background: var(--accent); color: white; padding: 10px 16px; font: inherit; cursor: pointer; margin-right: 6px; margin-top: 10px; }&#xA;    button.secondary { background: #3b4951; }&#xA;    button.danger { background: #8a3a3a; }&#xA;    button.small { padding: 5px 10px; font-size: 0.85rem; margin-top: 4px; }&#xA;    button:hover { filter: brightness(0.92); }&#xA;    dl { display: grid; grid-template-columns: max-content 1fr; gap: 6px 14px; margin: 0; }&#xA;    dt { font-weight: bold; }&#xA;    dd { margin: 0; word-break: break-word; }&#xA;    .row { display: flex; gap: 8px; flex-wrap: wrap; }&#xA;    .row &gt; * { flex: 1 1 0; min-width: 110px; }&#xA;    table { width: 100%; border-collapse: collapse; font-size: 0.92rem; }&#xA;    th, td { text-align: left; padding: 6px 8px; border-bottom: 1px solid var(--line); }&#xA;    th { color: var(--muted); font-weight: bold; }&#xA;    code, .mono { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0.85rem; }&#xA;    .badge { display: inline-block; border-radius: 6px; padding: 2px 7px; font-size: 0.8rem; font-weight: bold; }&#xA;    .badge.batch { background: var(--batch); color: #43326a; }&#xA;    .badge.stream { background: var(--stream); color: #1d4a2c; }&#xA;    .badge.expired { background: var(--warn); color: #6b3220; }&#xA;    .badge.untracked { background: #eceff1; color: #3b4951; }&#xA;    .badge.running { background: var(--ok); color: #1d4a2c; }&#xA;    .badge.paused { background: var(--warn); color: #6b3220; }&#xA;    .ttl-pos { color: #1a594c; font-weight: bold; }&#xA;    .ttl-neg { color: #6b3220; }&#xA;    .field-list { display: flex; gap: 6px 12px; flex-wrap: wrap; }&#xA;    .field-list label { display: inline-flex; align-items: center; gap: 4px; margin: 0; font-weight: normal; font-size: 0.9rem; }&#xA;    .field-list input { width: auto; }&#xA;    #status { margin-top: 18px; padding: 12px 14px; border-radius: 12px; display: none; }&#xA;    #status.ok { display: block; background: var(--ok); }&#xA;    #status.error { display: block; background: var(--warn); }&#xA;  &lt;/style&gt;&#xA;&lt;/head&gt;&#xA;&lt;body&gt;&#xA;  &lt;main&gt;&#xA;    &lt;div class=&#34;pill&#34;&gt;Predis + PHP built-in server&lt;/div&gt;&#xA;    &lt;h1&gt;Redis Feature Store Demo&lt;/h1&gt;&#xA;    &lt;p class=&#34;lede&#34;&gt;&#xA;      A small fraud-scoring feature store. Each user is one Redis hash&#xA;      at &lt;code&gt;__KEY_PREFIX__{id}&lt;/code&gt; with a batch-materialized&#xA;      &lt;span class=&#34;badge batch&#34;&gt;batch&lt;/span&gt; half (daily aggregates,&#xA;      24-hour key-level &lt;code&gt;EXPIRE&lt;/code&gt;) and a streaming&#xA;      &lt;span class=&#34;badge stream&#34;&gt;streaming&lt;/span&gt; half (real-time&#xA;      signals, &lt;code&gt;__STREAM_TTL__&lt;/code&gt;s per-field &lt;code&gt;HEXPIRE&lt;/code&gt;).&#xA;      Inference reads any subset with one &lt;code&gt;HMGET&lt;/code&gt;; batch&#xA;      scoring pipelines &lt;code&gt;HMGET&lt;/code&gt; across N users.&#xA;    &lt;/p&gt;</description>
    </item>
  </channel>
</rss>
