五、(补充)redis的一些简介和使用场景

redis的五种数据类型的使用场景,已经redis的发布和订阅功能的实现

一、redis 支持五种数据类型

string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)

1、string 类型 存放结构 key-value ,value可以是string或者数字,

使用场景:存放一些系统常用的变量、参数等数据

2、hash , 可以存储对象数据,可以将系统数据换成到缓存中:  

使用场景:存储、读取、修改用户属性

user1 name "zhangsan" age "22" sex "1"   

user2 name "lisi" age "20" sex "0"

3、list,按顺序将数据存放到,可以作为一个有序队列,在项目中可以做做有先后顺序要求的业务,

使用场景:微博 TimeLine、 消息队列

eg:秒杀行为,记录用户描述行为到队列中,从队列中筛选秒杀成功用户

4、set就是一个集合,集合的概念就是一堆不重复值的组合。利用Redis提供的set数据结构,可以存储一些集合性的数据。set中的元素是没有顺序的。 

使用场景:

(1)利用唯一性,可以统计访问网站的所有独立 IP

(2)好友数量的统计:两个人相同好友人数、微博关注人数统计,等利用set集合做交集,并集,差集行为,得出相应结果数据的结果集合

5、sorted set 权重集合,是将 Set 中的元素增加了一个权重参数 score,使得集合中的元素能够按 score 进行有序排列

使用场景:

(1)带有权重的元素,比如一个游戏的用户得分排行榜

二、redis其他功能的使用场景

1、订阅-发布系统
Pub/Sub 从字面上理解就是发布(Publish)与订阅(Subscribe),就是设定一个key值进行消息的发布和订阅,当给指定key值发送消息的时候,所有订阅这个key值的客户端都会收到相应的消息值。
这里有个简单的demo,可以很形象的说明这个问题,具体是两个redis的订阅客户端,和一个redis的发布服务端
客服端1:订阅主题为 redis1
package redis.demo;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;
public class RedisClient1 {
	 public static void main(String[] args){
	        Jedis jRedis = new Jedis("115.159.31.89",6379);
	        jRedis.auth("admin123");
	        JedisPubSub jedisPubSub=new JedisPubSub() {
	            @Override
	            public void onMessage(String channel, String message) {
	                super.onMessage(channel, message);
	                System.out.println( "1:" +message);
	                
	                doSomeThing(message);
	            }
	        };
	        jRedis.subscribe(jedisPubSub,"redis1");
	    }
	 public  static void doSomeThing(String msg){
		System.out.println("客户端1获得主题:JRedisChat下发布的内容:" + msg);
	 }
	 
}

客户端2:订阅主题为 redis2
package redis.demo;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;

public class RedisClient2 {

	 public static void main(String[] args){
	        Jedis jRedis = new Jedis("115.159.31.89",6379);
	        jRedis.auth("admin123");
	        JedisPubSub jedisPubSub=new JedisPubSub() {
	            @Override
	            public void onMessage(String channel, String message) {
	                super.onMessage(channel, message);
	                System.out.println( "2:" +message);
	                
	                doSomeThing(message);
	            }
	        };
	        jRedis.subscribe(jedisPubSub,"redis2");
	    }
	 
	 public  static void doSomeThing(String msg){
		System.out.println("客户端2获得主题:JRedisChat下发布的内容:" + msg);
	 }
	 
}

服务端:发布两个主题 redis1  和  redis2

package redis.demo;
import redis.clients.jedis.Jedis;
public class RedisPublish {
	public static void main(String[] args) {
		Jedis jRedis = new Jedis("115.159.31.89", 6379);
		jRedis.auth("admin123");
		jRedis.publish("redis1", "Send a message to client 1");
		jRedis.publish("redis2", "Send a message to client 2");
	}
}






<think> 我们被要求回答关于Redis GEO的使用场景,并在最后提出3-5个相关问题,且必须按照指定格式输出。 首先,我们需要了解Redis GEO命令是用于存储处理地理位置信息的。它基于有序集合(Sorted Set)实现,可以存储经纬度,并支持多种地理位置相关的操作。 常见使用场景包括: 1. 附近的人/地点:查找某个坐标点周围一定距离内的其他地点。 2. 距离计算:计算两个地点之间的直线距离。 3. 地理位置信息存储与管理:存储地理坐标,并可以更新查询。 4. 轨迹记录与分析:记录移动物体的位置,并分析其轨迹。 接下来,我们将详细描述这些场景,并给出示例命令。 注意:回答必须用中文,最后以“§§相关问题§§”开头的问题列表结束。 </think> ### Redis GEO 使用场景详解 Redis GEO 模块基于有序集合(Sorted Set)实现地理空间数据存储与查询,适用于需要**实时地理位置服务**的场景。以下是典型应用及实现方案: --- #### 1. **实时附近服务(核心场景)** **应用场景**:外卖/打车 App 的商家/车辆推荐 ```bash # 添加坐标点(北京王府井) GEOADD merchants 116.417648 39.917985 "海底捞" GEOADD merchants 116.418221 39.918573 "星巴克" # 查找用户坐标(116.4185,39.9190)周边500米商家 GEORADIUS merchants 116.4185 39.9190 500 m WITHDIST ASC ``` **输出**: ``` 1) 1) "星巴克" 2) "82.34" # 距离(米) 2) 1) "海底捞" 2) "230.15" ``` #### 2. **地理围栏告警** **应用场景**:共享单车电子围栏、资产追踪 ```lua -- 检查设备是否离开安全区域 local inArea = redis.call('GEORADIUS', 'safe_zone', 116.4074 39.9042, 1000, 'm', 'WITHCOORD') if #inArea == 0 then redis.call('PUBLISH', 'alarm_channel', '设备JD1234越界!') end ``` #### 3. **热力地图分析** **应用场景**:人流密度监控、广告投放分析 ```bash # 统计三里屯区域(116.458,39.937)2km内人群密度 GEOSEARCH user_locations FROMLONLAT 116.458 39.937 BYRADIUS 2000 m COUNT ANY ASC ``` #### 4. **轨迹重合度计算** **应用场景**:疫情密接分析、车队路线优化 ```python # Python示例:计算两条轨迹的重合点 traj1 = redis.geosearch("user:1001:path", longitude=116.40, latitude=39.90, radius=5000) traj2 = redis.geosearch("user:1002:path", longitude=116.41, latitude=39.91, radius=5000) overlap = set(traj1).intersection(traj2) ``` --- ### 性能优化方案 1. **分层索引设计** ```bash # L1-国家级索引 GEOADD china_cities 116.40 39.90 "北京" # L2-城市级索引 GEOADD beijing_districts 116.417 39.917 "朝阳区" ``` 2. **混合存储策略** | 数据类型 | 存储结构 | 适用场景 | |----------|----------------|--------------------| | 静态数据 | GEO+持久化存储 | 地标建筑、行政区划 | | 动态数据 | GEO+Stream | 车辆、无人机位置 | 3. **集群分片配置** ```conf # redis.conf cluster-enabled yes cluster-require-full-coverage no ``` --- ### 注意事项 1. **精度控制** - 默认使用 WGS84 坐标系(GPS 标准) - 国内地图需转换 GCJ-02 坐标系(使用离线 SDK 转换) 2. **内存优化** - 单个 GEO Key 建议不超过 500 万坐标点 - 使用 `GEOHASH` 压缩存储: ```bash GEOADD points 116.40 39.90 "A" GEOHASH points "A" # → "wx4g08w3" ``` 3. **扩展方案** - 超大规模数据:RedisBloom + GeoMesa - 复杂地理运算:PostGIS 补充计算
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值