{"id":898,"date":"2025-04-30T15:56:02","date_gmt":"2025-04-30T07:56:02","guid":{"rendered":"https:\/\/beijian99.top\/?p=898"},"modified":"2025-05-08T14:13:22","modified_gmt":"2025-05-08T06:13:22","slug":"%e4%bd%bf%e7%94%a8%e5%b8%83%e9%9a%86%e8%bf%87%e6%bb%a4%e5%99%a8%e8%a7%a3%e5%86%b3%e7%bc%93%e5%ad%98%e7%a9%bf%e9%80%8f%e9%97%ae%e9%a2%98","status":"publish","type":"post","link":"https:\/\/beijian99.top\/?p=898","title":{"rendered":"\u57fa\u4e8e RedisBloom \u7684 Go \u8bed\u8a00\u7f13\u5b58\u7a7f\u900f\u9632\u62a4"},"content":{"rendered":"\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"512\" height=\"340\" src=\"https:\/\/beijian99.top\/wp-content\/uploads\/2025\/04\/image-63.png\" alt=\"\" class=\"wp-image-923\" srcset=\"https:\/\/beijian99.top\/wp-content\/uploads\/2025\/04\/image-63.png 512w, https:\/\/beijian99.top\/wp-content\/uploads\/2025\/04\/image-63-300x199.png 300w\" sizes=\"auto, (max-width: 512px) 100vw, 512px\" \/><\/figure>\n\n\n\n<p>\u4e00\u3001\u6280\u672f\u80cc\u666f\u4e0e\u6311\u6218<\/p>\n\n\n\n<p>1.1 \u7f13\u5b58\u7a7f\u900f\u573a\u666f<br>\u2022 \u6076\u610f\u653b\u51fb\uff1a\u9ed1\u5ba2\u6784\u9020\u5927\u91cf\u975e\u6cd5 Key\uff08\u5982\u968f\u673a UUID\u3001\u9012\u589e ID\uff09\u7ed5\u8fc7\u7f13\u5b58<\/p>\n\n\n\n<p>\u2022 \u7cfb\u7edf\u98ce\u9669\uff1a<\/p>\n\n\n\n<p>\u2022 \u6570\u636e\u5e93\u6bcf\u79d2\u627f\u53d7\u6570\u4e07\u65e0\u6548\u67e5\u8be2<\/p>\n\n\n\n<p>\u2022 \u8fde\u63a5\u6c60\u8017\u5c3d\u5bfc\u81f4\u6b63\u5e38\u8bf7\u6c42\u5931\u8d25<\/p>\n\n\n\n<p>\u2022 \u6781\u7aef\u60c5\u51b5\u5f15\u53d1\u6570\u636e\u5e93\u96ea\u5d29<\/p>\n\n\n\n<p>1.2 \u4f20\u7edf\u65b9\u6848\u5bf9\u6bd4<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u65b9\u6848<\/th><th>\u4f18\u70b9<\/th><th>\u7f3a\u9677<\/th><th>\u9002\u7528\u573a\u666f<\/th><\/tr><\/thead><tbody><tr><td>\u7a7a\u503c\u7f13\u5b58<\/td><td>\u5b9e\u73b0\u7b80\u5355<\/td><td>\u5185\u5b58\u6d6a\u8d39\u3001\u77ed\u65f6\u6570\u636e\u4e0d\u4e00\u81f4<\/td><td>\u5c0f\u89c4\u6a21\u4e1a\u52a1<\/td><\/tr><tr><td>\u4e92\u65a5\u9501<\/td><td>\u9632\u6b62\u51fb\u7a7f<\/td><td>\u65e0\u6cd5\u62e6\u622a\u65e0\u6548\u8bf7\u6c42<\/td><td>\u70ed\u70b9\u6570\u636e\u4fdd\u62a4<\/td><\/tr><tr><td>\u5e03\u9686\u8fc7\u6ee4\u5668<\/td><td>\u9ad8\u6548\u62e6\u622a<\/td><td>\u5b58\u5728\u8bef\u5224\u7387<\/td><td>\u9ad8\u5e76\u53d1\u9632\u62a4<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>\u4e8c\u3001RedisBloom \u6280\u672f\u539f\u7406<\/p>\n\n\n\n<p>2.1 \u6a21\u5757\u67b6\u6784<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"454\" src=\"https:\/\/beijian99.top\/wp-content\/uploads\/2025\/04\/image-60-1024x454.png\" alt=\"\" class=\"wp-image-911\" srcset=\"https:\/\/beijian99.top\/wp-content\/uploads\/2025\/04\/image-60-1024x454.png 1024w, https:\/\/beijian99.top\/wp-content\/uploads\/2025\/04\/image-60-300x133.png 300w, https:\/\/beijian99.top\/wp-content\/uploads\/2025\/04\/image-60-768x341.png 768w, https:\/\/beijian99.top\/wp-content\/uploads\/2025\/04\/image-60.png 1434w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>2.2 \u6838\u5fc3\u53c2\u6570\u516c\u5f0f<br>\u2022 \u5185\u5b58\u5360\u7528\u516c\u5f0f\uff1a m=(ln2)2\u2212nlnp\u200b(bits)<\/p>\n\n\n\n<p>\u2022 <code>n<\/code> \u9884\u671f\u5143\u7d20\u6570\u91cf<\/p>\n\n\n\n<p>\u2022 <code>p<\/code> \u53ef\u63a5\u53d7\u8bef\u5224\u7387<\/p>\n\n\n\n<p>\u2022 \u54c8\u5e0c\u51fd\u6570\u6700\u4f18\u6570\u91cf\uff1a k=nm\u200bln2<\/p>\n\n\n\n<p>2.3 \u6027\u80fd\u57fa\u51c6<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u64cd\u4f5c<\/th><th>\u5355\u6b21\u8017\u65f6<\/th><th>\u541e\u5410\u91cf\uff084 \u6838 CPU\uff09<\/th><\/tr><\/thead><tbody><tr><td>BF.ADD<\/td><td>0.15ms<\/td><td>6,500 ops\/sec<\/td><\/tr><tr><td>BF.EXISTS<\/td><td>0.10ms<\/td><td>9,200 ops\/sec<\/td><\/tr><tr><td>BF.MADD (100 items)<\/td><td>2.1ms<\/td><td>47,000 ops\/sec<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>\u4e09\u3001Go \u8bed\u8a00\u5b9e\u73b0\u65b9\u6848<\/p>\n\n\n\n<p>3.1 \u73af\u5883\u51c6\u5907<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code># \u542f\u52a8 RedisBloom<br>docker run -d -p 6379:6379 --name redis-bloom redislabs\/rebloom:2.4.5<br><br># Go \u4f9d\u8d56\u5b89\u88c5<br>go get github.com\/redis\/go-redis\/v9<\/code><\/pre>\n\n\n\n<p>3.2 \u6838\u5fc3\u4ee3\u7801\u5b9e\u73b0<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>package bloom<br><br>import (<br>    \"context\"<br>    \"fmt\"<br>    \"github.com\/redis\/go-redis\/v9\"<br>)<br><br>const (<br>    defaultErrorRate = 0.001  \/\/ 0.1%<br>    defaultCapacity  = 1e6    \/\/ 1 million<br>)<br><br>type BloomFilter struct {<br>    client *redis.Client<br>    key    string<br>}<br><br>func New(client *redis.Client, key string) *BloomFilter {<br>    return &amp;BloomFilter{client: client, key: key}<br>}<br><br>\/\/ \u521d\u59cb\u5316\u8fc7\u6ee4\u5668\uff08\u5e42\u7b49\u64cd\u4f5c\uff09<br>func (bf *BloomFilter) Init(ctx context.Context) error {<br>    err := bf.client.Do(ctx, <br>        \"BF.RESERVE\", <br>        bf.key, <br>        defaultErrorRate, <br>        defaultCapacity,<br>        \"EXPANSION\", 2,  \/\/ \u81ea\u52a8\u7ffb\u500d\u6269\u5bb9<br>    ).Err()<br><br>    if isKeyExistsError(err) {<br>        return nil<br>    }<br>    return err<br>}<br><br>\/\/ \u6279\u91cf\u6dfb\u52a0\u5143\u7d20\uff08\u539f\u5b50\u64cd\u4f5c\uff09<br>func (bf *BloomFilter) Add(ctx context.Context, items []string) error {<br>    args := []interface{}{\"BF.MADD\", bf.key}<br>    for _, item := range items {<br>        args = append(args, item)<br>    }<br>    return bf.client.Do(ctx, args...).Err()<br>}<br><br>\/\/ \u68c0\u67e5\u5143\u7d20\u5b58\u5728\u6027<br>func (bf *BloomFilter) Exists(ctx context.Context, item string) (bool, error) {<br>    res, err := bf.client.Do(ctx, \"BF.EXISTS\", bf.key, item).Result()<br>    if err != nil {<br>        return false, fmt.Errorf(\"bloom check failed: %w\", err)<br>    }<br>    return res.(int64) == 1, nil<br>}<br><br>func isKeyExistsError(err error) bool {<br>    return err != nil &amp;&amp; <br>        (redis.HasErrorPrefix(err, \"ERR item exists\") ||<br>         redis.HasErrorPrefix(err, \"ERR no such key\"))<br>}<\/code><\/pre>\n\n\n\n<p>3.3 \u4e1a\u52a1\u96c6\u6210\u793a\u4f8b<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>func GetProduct(ctx context.Context, id string) (*Product, error) {<br>    \/\/ 1. \u5e03\u9686\u8fc7\u6ee4\u5668\u62e6\u622a<br>    exist, err := bloomFilter.Exists(ctx, id)<br>    if err != nil || !exist {<br>        metrics.BloomReject.Inc()<br>        return nil, ErrNotFound<br>    }<br><br>    \/\/ 2. \u67e5\u8be2\u7f13\u5b58<br>    if p, ok := cache.Get(id); ok {<br>        return p, nil<br>    }<br><br>    \/\/ 3. \u5206\u5e03\u5f0f\u9501\u9632\u51fb\u7a7f<br>    lock := acquireLock(id)<br>    defer releaseLock(lock)<br><br>    \/\/ 4. \u6570\u636e\u5e93\u67e5\u8be2<br>    product, err := db.QueryProduct(id)<br>    if errors.Is(err, sql.ErrNoRows) {<br>        \/\/ \u7f13\u5b58\u7a7a\u503c\u5e76\u8bb0\u5f55\u65e5\u5fd7<br>        cache.SetNull(id)<br>        return nil, ErrNotFound<br>    }<br><br>    \/\/ 5. \u5f02\u6b65\u56de\u586b<br>    go func() {<br>        cache.Set(id, product)<br>        _ = bloomFilter.Add(context.Background(), []string{id})<br>    }()<br><br>    return product, nil<br>}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>\u56db\u3001\u751f\u4ea7\u7ea7\u4f18\u5316\u7b56\u7565<\/p>\n\n\n\n<p>4.1 \u52a8\u6001\u6269\u5bb9\u673a\u5236<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>func (bf *BloomFilter) AutoResize(ctx context.Context) {<br>    ticker := time.NewTicker(30 * time.Minute)<br>    defer ticker.Stop()<br><br>    for range ticker.C {<br>        info, _ := bf.Info(ctx)<br>        if info.Capacity == 0 {<br>            continue<br>        }<br><br>        \/\/ \u5bb9\u91cf\u4f7f\u7528\u7387\u8d85\u8fc7 75% \u89e6\u53d1\u6269\u5bb9<br>        if float64(info.Size)\/float64(info.Capacity) &gt; 0.75 {<br>            newCap := info.Capacity * 2<br>            bf.client.Do(ctx, <br>                \"BF.RESERVE\", <br>                bf.key, <br>                info.ErrorRate, <br>                newCap,<br>                \"EXPANSION\", 2,<br>            )<br>        }<br>    }<br>}<br><br>type BloomInfo struct {<br>    Capacity  int64   `json:\"capacity\"`<br>    Size      int64   `json:\"size\"`<br>    ErrorRate float64 `json:\"error_rate\"`<br>}<br><br>func (bf *BloomFilter) Info(ctx context.Context) (BloomInfo, error) {<br>    res, err := bf.client.Do(ctx, \"BF.INFO\", bf.key).Result()<br>    \/\/ ... \u89e3\u6790\u903b\u8f91<br>}<\/code><\/pre>\n\n\n\n<p>4.2 \u76d1\u63a7\u544a\u8b66\u4f53\u7cfb<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code># Prometheus \u6307\u6807\u914d\u7f6e<br>metrics:<br>  bloom_filter:<br>    error_rate: <br>      query: redis_bloom_error_rate{instance=\"$instance\"} <br>      threshold: 0.005  # &gt;0.5% \u89e6\u53d1\u544a\u8b66<br>    memory_usage:<br>      query: redis_bloom_memory_bytes{instance=\"$instance\"}<br>      threshold: 134217728  # 128MB<br>    reject_qps:<br>      query: rate(bloom_filter_rejects_total[5m])<br>      threshold: 1000  # \u6bcf\u79d2\u62e6\u622a\u8d85\u8fc71000\u6b21<\/code><\/pre>\n\n\n\n<p>4.3 \u6570\u636e\u4e00\u81f4\u6027\u4fdd\u969c<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>\/\/ \u6570\u636e\u5e93\u4e0e\u8fc7\u6ee4\u5668\u540c\u6b65\u670d\u52a1<br>func SyncFromDB() {<br>    const batchSize = 1000<br>    lastID := 0<br><br>    for {<br>        var products []Product<br>        db.Where(\"id &gt; ?\", lastID).<br>           Order(\"id ASC\").<br>           Limit(batchSize).<br>           Find(&amp;products)<br><br>        if len(products) == 0 {<br>            time.Sleep(5 * time.Minute)<br>            continue<br>        }<br><br>        \/\/ \u6279\u91cf\u6dfb\u52a0\u81f3\u5e03\u9686\u8fc7\u6ee4\u5668<br>        ids := make([]string, 0, len(products))<br>        for _, p := range products {<br>            ids = append(ids, p.ID)<br>            lastID = p.ID<br>        }<br><br>        if err := bloomFilter.Add(context.Background(), ids); err != nil {<br>            log.Printf(\"sync failed: %v\", err)<br>        }<br>    }<br>}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>\u4e94\u3001\u6027\u80fd\u6d4b\u8bd5\u62a5\u544a<\/p>\n\n\n\n<p>5.1 \u6d4b\u8bd5\u73af\u5883<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u7ec4\u4ef6<\/th><th>\u914d\u7f6e<\/th><\/tr><\/thead><tbody><tr><td>Redis<\/td><td>3 \u8282\u70b9\u96c6\u7fa4\uff088\u683816G\uff09<\/td><\/tr><tr><td>MySQL<\/td><td>\u4e3b\u4ece\u67b6\u6784\uff0816\u683832G\uff09<\/td><\/tr><tr><td>Go \u670d\u52a1<\/td><td>4 \u5bb9\u5668\u526f\u672c\uff084\u68388G\uff09<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>5.2 \u538b\u529b\u6d4b\u8bd5\u7ed3\u679c<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u573a\u666f<\/th><th>QPS<\/th><th>\u5e73\u5747\u5ef6\u8fdf<\/th><th>\u6570\u636e\u5e93 CPU<\/th><\/tr><\/thead><tbody><tr><td>\u65e0\u9632\u62a4<\/td><td>1,200<\/td><td>320ms<\/td><td>98%<\/td><\/tr><tr><td>\u7a7a\u503c\u7f13\u5b58<\/td><td>5,800<\/td><td>45ms<\/td><td>35%<\/td><\/tr><tr><td>\u5e03\u9686\u8fc7\u6ee4\u5668<\/td><td>23,000<\/td><td>8ms<\/td><td>&lt;3%<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>5.3 \u8bef\u5224\u7387\u9a8c\u8bc1<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u6837\u672c\u91cf<\/th><th>\u7406\u8bba\u8bef\u5224\u7387<\/th><th>\u5b9e\u9645\u8bef\u5224\u7387<\/th><\/tr><\/thead><tbody><tr><td>1M<\/td><td>0.1%<\/td><td>0.097%<\/td><\/tr><tr><td>10M<\/td><td>0.1%<\/td><td>0.103%<\/td><\/tr><tr><td>100M<\/td><td>0.1%<\/td><td>0.108%<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>\u516d\u3001\u6700\u4f73\u5b9e\u8df5\u603b\u7ed3<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u5bb9\u91cf\u89c4\u5212\uff1a\u6309\u4e1a\u52a1\u5cf0\u503c 2 \u500d\u8bbe\u8ba1\u521d\u59cb\u5bb9\u91cf<\/li>\n\n\n\n<li>\u7248\u672c\u7ba1\u7406\uff1aRedisBloom \u2265 2.4.5\uff0cGo-Redis \u2265 v9.0.5<\/li>\n\n\n\n<li>\u76d1\u63a7\u4e09\u677f\u65a7\uff1a<br>\u2022 \u8bef\u5224\u7387\u6ce2\u52a8\u76d1\u63a7 \u2022 \u5185\u5b58\u589e\u957f\u8d8b\u52bf\u76d1\u63a7 \u2022 \u62e6\u622a\u7387\u5f02\u5e38\u544a\u8b66<\/li>\n\n\n\n<li>\u6570\u636e\u9884\u70ed\uff1a\u4e1a\u52a1\u542f\u52a8\u65f6\u6279\u91cf\u52a0\u8f7d\u70ed\u6570\u636e<\/li>\n\n\n\n<li>\u6dd8\u6c70\u7b56\u7565\uff1a\u7ed3\u5408 TTL \u5b9a\u671f\u6e05\u7406\u9648\u65e7\u6570\u636e<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>\u4e00\u3001\u6280\u672f\u80cc\u666f\u4e0e\u6311\u6218 1.1 \u7f13\u5b58\u7a7f\u900f\u573a\u666f\u2022 \u6076\u610f\u653b\u51fb\uff1a\u9ed1\u5ba2\u6784\u9020\u5927\u91cf\u975e\u6cd5 Key\uff08\u5982\u968f\u673a UUID\u3001\u9012\u589e ID\uff09 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":923,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[128],"tags":[148],"class_list":["post-898","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-redis","tag-bloom-filter"],"_links":{"self":[{"href":"https:\/\/beijian99.top\/index.php?rest_route=\/wp\/v2\/posts\/898","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/beijian99.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/beijian99.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/beijian99.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/beijian99.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=898"}],"version-history":[{"count":12,"href":"https:\/\/beijian99.top\/index.php?rest_route=\/wp\/v2\/posts\/898\/revisions"}],"predecessor-version":[{"id":924,"href":"https:\/\/beijian99.top\/index.php?rest_route=\/wp\/v2\/posts\/898\/revisions\/924"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/beijian99.top\/index.php?rest_route=\/wp\/v2\/media\/923"}],"wp:attachment":[{"href":"https:\/\/beijian99.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=898"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/beijian99.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=898"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/beijian99.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=898"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}