redis GEO 使用和搭建 Redis 集群

redis GEO 使用

  • laravel redis GEO 使用
<?php

use Illuminate\Support\Facades\Redis;

//redis GEO 使用
$redis = Redis::connection();
//添加或修改地理位置
$redis->command("geoadd", ['city', '120.20000', '30.26667', 'hangzhou', '116.41667', '39.91667', 'beijing', '121.47', '31.23', 'shanghai']);
//获取地理位置信息
$redis->command("geopos", ['city', 'hangzhou', 'beijing']);
//计算距离 单位可以是 m、km、ml、ft,分别代表米、千米、英里和尺
$redis->command("geodist", ['city', 'hangzhou', 'beijing','km']);
//获取指定元素范围的地理信息位置集合 例如查找距离杭州300km以内的城市的10个城市按距离排序
$redis->command("GEORADIUSBYMEMBER", ['city', 'hangzhou', '300', 'km', ['WITHCOORD', 'WITHDIST', 'WITHHASH', 'ASC', 'COUNT', 10]]);
//WITHDIST : 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致。
//WITHCOORD : 将位置元素的经度和维度也一并返回。
//WITHHASH : 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。
//ASC : 根据中心的位置, 按照从近到远的方式返回位置元素。DESC : 根据中心的位置, 按照从远到近的方式返回位置元素。
//根据 经纬度位置 获取最近300km以内的城市的10个城市按距离排序
$redis->command("GEORADIUS", ['city','120.20000', '30.26667', '300', 'km', ['WITHCOORD', 'WITHDIST', 'WITHHASH', 'ASC', 'COUNT', 10]]);
//删除位置信息
$redis->command("ZREM", ['city','hangzhou']);

搭建 Redis 集群

  • docker 搭建 Redis 集群

编写docker-compose.yml

version: "3.7"
services:
  rds1:
    image: redis:alpine
    container_name: rds1
    ports:
      - 16371:16371
    volumes:
      - "./conf/rds1/redis.conf:/etc/redis.conf:ro"
    entrypoint: ["redis-server", "/etc/redis.conf"]
    expose:
      - 16371
    networks:
       default:
          ipv4_address: 172.19.0.8
          #固定 ip地址 根据环境可修改
  rds2:
    image: redis:alpine
    container_name: rds2
    ports:
      - 16372:16372
    volumes:
      - "./conf/rds2/redis.conf:/etc/redis.conf:ro"
    entrypoint: ["redis-server", "/etc/redis.conf"]
    expose:
      - 16372
    networks:
      default:
        ipv4_address: 172.19.0.9
    
  rds3:
    image: redis:alpine
    container_name: rds3
    ports:
      - 16373:16373
    volumes:
      - "./conf/rds3/redis.conf:/etc/redis.conf:ro"
    entrypoint: ["redis-server", "/etc/redis.conf"]
    expose:
      - 16373
    networks:
      default:
        ipv4_address: 172.19.0.4
    
  rds4:
    image: redis:alpine
    container_name: rds4
    ports:
      - 16374:16374
    volumes:
      - "./conf/rds4/redis.conf:/etc/redis.conf:ro"
    entrypoint: ["redis-server", "/etc/redis.conf"]
    expose:
      - 16374
    networks:
      default:
        ipv4_address: 172.19.0.5
    
  rds5:
    image: redis:alpine
    container_name: rds5
    ports:
      - 16375:16375
    volumes:
      - "./conf/rds5/redis.conf:/etc/redis.conf:ro"
    entrypoint: ["redis-server", "/etc/redis.conf"]
    expose:
      - 16375
    networks:
      default:
        ipv4_address: 172.19.0.6
    
  rds6:
    image: redis:alpine
    container_name: rds6
    ports:
      - 16376:16376
    volumes:
      - "./conf/rds6/redis.conf:/etc/redis.conf:ro"
    entrypoint: ["redis-server", "/etc/redis.conf"]
    expose:
      - 16376
    networks:
      default:
        ipv4_address: 172.19.0.7

networks:
  default:
    driver: bridge
    ipam:
     config:
       - subnet: 172.19.0.0/16

当前目录下创建 conf 目录结构/conf/rds1/redis.conf … 配置文件

修改的配置 port对应

port 16371
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
daemonize no
protected-mode no
pidfile  /data/redis.pid

启动 docker-compose up -d


docker exec -it rds1 /bin/sh
我们进去让每个节点建立连接
## 这里的IP对应你容器的IP  docker inspect mysqls_db1_1 查看容器ip
redis-cli -p 16371 --cluster create \
172.19.0.8:16371 \
172.19.0.9:16372 \
172.19.0.4:16373 \
172.19.0.5:16374 \
172.19.0.6:16375 \
172.19.0.7:16376 \
--cluster-replicas 1  # 这个为容器ip 集群无法通过外网访问

## 我们回车之后, 会告诉你节点分布 redis集群默认是1主1备所以节点都是成双的 不会出现单数
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.0.3:16375 to 192.168.0.6:16371
Adding replica 192.168.0.2:16376 to 192.168.0.4:16372
Adding replica 192.168.0.5:16374 to 192.168.0.7:16373
M: de50954fbef8a034162d85614f673b23181aee91 192.168.0.6:16371
   slots:[0-5460] (5461 slots) master
M: f6d715eebf2a0605045a08d58551ce14a9a2a214 192.168.0.4:16372
   slots:[5461-10922] (5462 slots) master
M: c9f662d088c8fc34df14a11cd4cacedac68cd0aa 192.168.0.7:16373
   slots:[10923-16383] (5461 slots) master
S: a9361289245ed860b4b34ba183c805b4fdc696d4 192.168.0.5:16374
   replicates c9f662d088c8fc34df14a11cd4cacedac68cd0aa
S: 28d845888ca0ef1a2b50e8c3d164a92df42f26e9 192.168.0.3:16375
   replicates de50954fbef8a034162d85614f673b23181aee91
S: 131e52485a273394f75275d3fb308ebe54282b04 192.168.0.2:16376
   replicates f6d715eebf2a0605045a08d58551ce14a9a2a214
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
..

成功情况是
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

redis-cli -p 16371
127.0.0.1:16371> cluster info #查看集群信息
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:97
cluster_stats_messages_pong_sent:95
cluster_stats_messages_sent:192
cluster_stats_messages_ping_received:90
cluster_stats_messages_pong_received:97
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:192

127.0.0.1:16371> cluster nodes #集群节点
87c90029c8cbcc605cd7272eccf709b6088d7583 172.19.0.2:16375@26375 slave 117f1170f57852f6cf707c3fbd410c72f920d656 0 1639480454000 1 connected
a7f4901a91fde718ddf9592abf0e50dbd230ed59 172.19.0.6:16373@26373 master - 0 1639480455542 3 connected 10923-16383
a8bee49f0e96af76a1e046de8163865e68e195c7 172.19.0.4:16374@26374 slave a7f4901a91fde718ddf9592abf0e50dbd230ed59 0 1639480455543 3 connected
4ac353500b7bc9485e597b6e0a60e9b71fdcfc27 172.19.0.7:16376@26376 slave 051059987dea7a6502d3512a4a2627ea38e5288e 0 1639480454533 2 connected
117f1170f57852f6cf707c3fbd410c72f920d656 172.19.0.5:16371@26371 myself,master - 0 1639480454000 1 connected 0-5460
051059987dea7a6502d3512a4a2627ea38e5288e 172.19.0.3:16372@26372 master - 0 1639480455642 2 connected 5461-10922