首页 > 数据库 >Redis从入门到放弃(4):3种新数据类型

Redis从入门到放弃(4):3种新数据类型

时间:2023-08-03 19:38:34浏览次数:40  
标签:HyperLogLog 地理位置 数据类型 Redis 用户 Bitmaps Geospatial jedis 种新



文章目录

  • 1、介绍
  • 2、 Bitmaps(位图)
  • 2.1、特性
  • 2.2、原理
  • 2.3、应用场景
  • 2.4、代码
  • 3、 HyperLogLog(基数统计)
  • 3.1、特性
  • 3.2、原理
  • 3.3、应用场景
  • 3.4、代码
  • 4、Geospatial(地理位置)
  • 4.1、特性
  • 4.2、原理
  • 4.3、应用场景
  • 4.4、代码
  • 5、总结


1、介绍

前面的文章已经介绍了redis的5种基本数据类型,redis6中另外还有3种特殊的数据类型,分别是 Bitmaps (位图)、HyperLogLogs(基数统计)和 geospatial (地理位置)。本文将继续探讨它们的特性、原理以及应用场景。

2、 Bitmaps(位图)

Bitmaps是一种位图数据结构,用于存储位的集合。在Redis中,Bitmaps通常用于表示一系列元素的状态,每个元素用一个位来表示,位的值为0或1。

2.1、特性

  • 空间效率:Bitmaps使用非常少的内存来存储数据,适用于大规模数据的位集合操作。
  • 高效的位运算:Bitmaps支持位运算,如AND、OR、XOR等,可以快速地对位集合进行操作。

2.2、原理

Bitmaps的底层数据结构是一个二进制位数组,其中的每一个位都只能存储0或1。通过对位数组进行操作,可以实现集合成员的添加、删除和查询。

示例:假设我们有一个用户状态的Bitmaps,每个用户用一个位表示,1表示在线,0表示离线。

Redis从入门到放弃(4):3种新数据类型_地理位置

SETBIT key offset value

#设置offset偏移位的值为value,offset的值是从0开始的,n代表第n+1个bit位置的。
#offset 参数必须大于或等于 0 ,小于 2^32 (bit 映射被限制在 512 MB 之内)。
#value 的值只能为0或1
#返回值:指定偏移量原来储存的位。
# 设置用户1为在线状态
SETBIT online_users 1 1

# 设置用户2为离线状态
SETBIT online_users 2 0

# 查询用户1的状态
GETBIT online_users 1   # 返回 1 (在线)

# 查询用户3的状态
GETBIT online_users 3   # 返回 0 (离线)

# 获取在线用户数量
BITCOUNT online_users    # 返回 2 (有两个用户在线)

2.3、应用场景

  • 用户在线状态:可以用Bitmaps来表示用户是否在线,每个位代表一个用户,1表示在线,0表示离线。
  • 统计功能:通过位运算可以实现多个集合的交集、并集等操作,适用于一些统计功能的实现。

2.4、代码

import redis.clients.jedis.Jedis;

public class RedisBitmapsDemo {

    public static void main(String[] args) {
        // 连接到Redis服务器
        Jedis jedis = new Jedis("localhost");

        // 设置用户1为在线状态
        jedis.setbit("online_users", 1, true);

        // 设置用户2为在线状态
        jedis.setbit("online_users", 2, true);

        // 查询用户1的状态
        boolean isUser1Online = jedis.getbit("online_users", 1);
        System.out.println("用户1是否在线:" + isUser1Online);

        // 查询用户3的状态
        boolean isUser3Online = jedis.getbit("online_users", 3);
        System.out.println("用户3是否在线:" + isUser3Online);

        // 获取在线用户数量
        long onlineUserCount = jedis.bitcount("online_users");
        System.out.println("在线用户数量:" + onlineUserCount);

        // 关闭连接
        jedis.close();
    }
}

3、 HyperLogLog(基数统计)

什么是基数?

举个例子,A = {1, 2, 3, 4, 5}, B = {3, 5, 6, 7, 9};那么基数(不重复的元素)= 1, 2, 4, 6, 7, 9; (允许容错,即可以接受一定误差)

HyperLogLog是一种用于基数统计(即集合中不同元素的数量)的数据结构。它可以用来估计一个集合中不同元素的数量,而不需要存储每个元素的具体值。HyperLogLog的优势在于其内存占用非常小,同时可以提供较高的近似精确度。

3.1、特性

  • 高效的内存利用:HyperLogLog使用固定大小的内存来存储集合的近似基数,无论集合大小如何,内存占用都相对固定。
  • 近似精确度:HyperLogLog虽然是近似计数,但对于大部分数据集合,可以提供较高的准确度。

3.2、原理

HyperLogLog通过使用一组哈希函数来统计集合中不同元素的数量。对于每个元素,首先使用哈希函数对其进行哈希,然后找到哈希值中最高位的1所在的位置。最后根据最高位1的位置来估计集合的基数。

示例:统计一组用户的唯一访问次数。

# 添加用户的访问记录
PFADD user_visits user1
PFADD user_visits user2
PFADD user_visits user1

# 查询唯一访问次数
PFCOUNT user_visits    # 返回 2 (有两个用户的唯一访问记录)

3.3、应用场景

  • 统计UV:在网站统计中,如果需要统计不同用户(UV)的数量,可以使用HyperLogLog来估计UV的数量,从而减少内存占用。
  • 数据流中的去重:在数据流中,如果需要实时去重并统计不同元素的数量,可以使用HyperLogLog来估计去重后的元素数量。

但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以HyperLogLog 不能像集合那样,返回输入的各个元素。

3.4、代码

import redis.clients.jedis.Jedis;

public class RedisHyperLogLogDemo {

    public static void main(String[] args) {
        // 连接到Redis服务器
        Jedis jedis = new Jedis("localhost");

        // 添加用户的访问记录
        jedis.pfadd("user_visits", "user1");
        jedis.pfadd("user_visits", "user2");
        jedis.pfadd("user_visits", "user1");

        // 查询唯一访问次数
        long uniqueVisits = jedis.pfcount("user_visits");
        System.out.println("唯一访问次数:" + uniqueVisits);

        // 关闭连接
        jedis.close();
    }
}

4、Geospatial(地理位置)

Geospatial是一种地理空间数据结构,用于存储地理位置的信息。在Redis中,Geospatial使用了基于Z字形扫描的算法,可以高效地存储和查询地理位置信息。

4.1、特性

  • 高效的地理位置查询:Geospatial支持在给定的地理位置半径范围内查询其他地理位置点,例如查询附近的商店、用户等。
  • 可以存储附加信息:除了地理位置信息,Geospatial还可以存储附加的信息,如商店的名称、用户的ID等。

4.2、原理

Geospatial使用一个二维空间索引来存储地理位置信息,利用Z字形扫描算法可以快速地查询附近的地理位置点。

示例:存储商店的地理位置信息和名称。

# 添加商店的地理位置信息和名称
GEOADD stores 116.4039 39.9149 "Shop A"
GEOADD stores 116.3372 39.9218 "Shop B"
GEOADD stores 116.3525 39.9138 "Shop C"

# 查询附近的商店
GEORADIUS stores 116.4000 39.9100 500 m WITHCOORD COUNT 2

4.3、应用场景

  • 附近的人:在社交应用中,可以使用Geospatial来查找附近的用户,以实现附近的人功能。
  • 地理位置签到:可以使用Geospatial来实现地理位置签到功能,记录用户在特定地点的签到信息。

4.4、代码

import redis.clients.jedis.GeoCoordinate;
import redis.clients.jedis.GeoRadiusResponse;
import redis.clients.jedis.GeoUnit;
import redis.clients.jedis.Jedis;

import java.util.List;

public class RedisGeospatialDemo {

    public static void main(String[] args) {
        // 连接到Redis服务器
        Jedis jedis = new Jedis("localhost");

        // 添加商店的地理位置信息和名称
        jedis.geoadd("stores", 116.4039, 39.9149, "Shop A");
        jedis.geoadd("stores", 116.3372, 39.9218, "Shop B");
        jedis.geoadd("stores", 116.3525, 39.9138, "Shop C");

        // 查询附近的商店
        double longitude = 116.4000;
        double latitude = 39.9100;
        double radius = 500; // 半径500米
        List<GeoRadiusResponse> nearbyStores = jedis.georadius("stores", longitude, latitude, radius, GeoUnit.M);
        for (GeoRadiusResponse store : nearbyStores) {
            String storeName = store.getMemberByString();
            GeoCoordinate coordinates = store.getCoordinate();
            double distance = store.getDistance();
            System.out.println("附近商店:" + storeName + ",经度:" + coordinates.getLongitude() + ",纬度:" + coordinates.getLatitude() + ",距离:" + distance + "米");
        }

        // 关闭连接
        jedis.close();
    }
}

5、总结

Redis6引入了三种新的数据类型:Bitmaps、HyperLogLog和Geospatial,这些新数据类型为Redis提供了更多灵活的功能和应用场景。Bitmaps适用于大规模数据的位集合操作,HyperLogLog用于近似统计集合的基数,而Geospatial则用于高效存储和查询地理位置信息。通过合理的使用这些新数据类型,可以让Redis在更多场景下发挥出强大的性能和功能。


标签:HyperLogLog,地理位置,数据类型,Redis,用户,Bitmaps,Geospatial,jedis,种新
From: https://blog.51cto.com/u_13693015/6952271

相关文章

  • Redis从入门到放弃(3):发布与订阅
    文章目录1、介绍2、如何使用发布订阅2.1、订阅频道2.2、发布消息2.3、取消订阅2.4、模式订阅2.5、取消模式订阅3、使用案例(伪代码)4、Redis的发布订阅与ActiveMQ、RocketMQ区别1、介绍Redis是一个快速、开源的内存数据库,支持多种数据结构,如字符串、哈希、列表、集合、有序集合等。......
  • Redis从入门到放弃(1):安装配置
    文章目录1.介绍2.优势3.安装Redis4.后台运行5.配置Redis5.1查看配置项5.2修改配置项5.3参数说明6.错误解决1.介绍Redis是一个高性能的开源key-value数据库。它被广泛应用于缓存、会话存储、实时分析、消息队列等场景。Redis具有以下三个主要特点:数据持久化:Redis支持......
  • Redis从入门到放弃(2):数据类型
    文章目录1.字符串(String)1.1、介绍1.2、命令示例1.3、注意事项2.哈希(Hash)2.1、介绍2.2、命令示例2.3、注意事项3.列表(List)3.1、介绍3.2、命令示例3.3、注意事项4.集合(Set)4.1、介绍4.2、命令示例5.有序集合(SortedSet)5.1、介绍5.2、命令示例6、总结在Redis中,数据以键值对的形......
  • 怎么设置centos限定redis使用的内存
    1、Redis-Cluster集群2、怎么设置centos限定redis使用的内存3、高性能高并发网站架构,教你搭建Redis5缓存集群4、Redis-Cluster5、「实用教程」在配备持久内存的实例上部署Redis应用Redis-Cluster集群1、连接如下https://redis.io/topics/cluster-tutorial以下步骤是在一......
  • 虹科干货 | DevOps 团队为什么独独青睐 Redis Enterprise ?
    快速部署是保障成功的DevOps的关键要素。虹科RedisEnterprise提供了一种快速的数据库。01DevOps团队面临的挑战1.提高应用程序处理速度,赢得商业竞争许多企业中,DevOps团队(DevOps是一组过程、方法与系统的统称,用于促进开发、技术运营和质量保障部门之间的沟通、协作与整合)正......
  • 虹科分享 | 妙招频出,Redis 企业版这样解决缓存问题→
    为什么企业需要数字化?数字化转型的根本目的是什么?数据的缓存为什么如此的重要?虹科RedisEnterprise又能够在哪些方面助力企业解决数据处理难题?01当前数据库缓存面临的挑战:使用当前数据库实现速度和可扩展性实现满足用户期望所需的数据性能并不容易。企业需要应对遗留基础设施、缓......
  • 使用redis-py的两个类Redis和StrictRedis时遇到的坑
    redis-py提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令(比如,SET命令对应与StrictRedis.set方法)。Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py。简单说,官方推荐使用StrictRedis方法。  不推荐Redis类,原......
  • pyredis使用场景
    1.安装pyredis首先安装pip <SHELL>#apt-getinstallpython-pip......<SHELL>#pipinstall--proxy=http://172.1.2.6:8080redisDownl......
  • 巧用Redis实现分布式锁详细介绍_Redis
    目录前言手写Redis分布式锁Redissonlock()lock(longleaseTime,TimeUnitunit)tryLock(longwaitTime,longleaseTime,TimeUnitunit)RedLock红锁总结前言无论是synchronized还是Lock,都运行在线程级别上,必须运行在同一个JVM中。如果竞争资源的进程不在同一个JVM中时,......
  • oracle修改数据类型报错
    1. nvarchar和blob类型转换时,直接modify会报错ORA-01735:invalidALTERTABLEoption2. 数字类型降低精度时 当数据库已有数据时,会报错ORA-01440:columntobemodifiedmustbeemptytodecreaseprecisionorscale 以上两种字段类型修改错误可以通过一下方式来避免......