数据类型
- String(字符串):最基本的数据类型,可以存储任何类型的数据,如文本、数字等。
- Hash(哈希):用于存储字段-值对的散列集合,适用于存储对象。
- List(列表):按照插入顺序存储的字符串元素集合,可以在列表的两端进行插入和删除操作。
- Set(集合):无序、唯一的字符串元素集合,支持元素的添加、删除和集合间的交集、并集和差集等操作。
- Sorted Set(有序集合):与集合类似,但每个元素关联一个分数,用于进行排序和按范围查询。
- Bitmaps(位图):由二进制位组成的数据结构,支持位级操作,如设置、清除和计数等。
- HyperLogLog(基数估计):用于估计集合的基数(不重复元素数量)的算法,占用固定空间,适用于大规模唯一计数的场景。
- Geospatial(地理空间索引):存储地理位置信息的数据类型,支持根据位置进行查询和计算。
其中前面5种是基本数据类型,后面3种是种特殊数据结构
key层级关系
Redis 本身没有提供层级结构,但可以在键的命名约定中使用分隔符或约定来模拟层级关系。
可以使用冒号(:)作为分隔符来表示键之间的层级关系。
例如:bpm中有分用户(user)和订单(order)模块,key中带:就可以表示层级,这样更容易划分业务模块
set bpm:user 用户模块
set bpm:order 订单模块
可以看到bpm下有user和order
String(字符串)
String的常见命令
- set:添加或者修改已经存在的一个String类型的键值对
- get:根据key获取String类型的value
- mset:批量添加多个String类型的键值对
- mget:根据多个key获取多个String类型的value
- incr:让一个整型的key自增1
- incrby:让一个整型的key自增并指定步长,例如:incrby num2让num值自增2INCRBYFLOAT:让一个浮点类型的数字自增并指定步长
- setnx:添加一个String类型的键值对,前提是这个key不存在,否则不执行
- setex:添加一个String类型的键值对,并且指定有效期
命令演示
批量添加键值对
mset k1 v1 k2 v2 k3 v3 k4 v4
批量查看键值对
mget k1 k2 k3 k4
数值递增
set age 18
incr age
get age
setnx
setnx name curry
setnx name curry
Hash(哈希)
Hash类似于到Java中的HashMap结构,value是一个无序字典。
Hash的常见命令
hset key field value:添加或者修改hash类型key的field的值
hget key field:获取一个hash类型key的field的值
hmset:批量添加多个hash类型key的field的值
hmget:批量获取多个hash类型key的field的值
hgetall:获取一个hash类型的key中的所有的field和value
hkeys:获取一个hash类型的key中的所有的field
hvals:获取一个hash类型的key中的所有的value
hincrby:让一个hash类型key的字段值自增并指定步长
hsetnx:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行
命令演示
hset
hset userInfo name curry
hset userInfo age 35
hmset
hmset userInfo no 35 sex man
hget userInfo sex
hgetall
hgetall userInfo
List(列表)
List类似于Java中的LinkedList,可以看做是一个双向链表结构
特征也与LinkedList类似:有序、元素可以重复、插入和删除快、查询速度一般。
List的常见命令
lpush key element…:向列表左侧插入一个或多个元素
lpop key:移除并返回列表左侧的第一个元素,没有则返回nil
rpush key element…:向列表右侧插入一个或多个元素
rpop key:移除并返回列表右侧的第一个元素
lrange key star end:返回一段角标范围为内的所有元素
blpop和brpop:与lpop和Rrpop类似,只不过在没有元素时等待指定时间,而不是直接返回nil
命令演示
rpush rpush
查看元素
lpop rpop
Set(集合)
Set类似于Java中的HashSet,可以看做是一个value为null的HashMap,因为也是一个hash
HashSet特征:无序、元素不可重复、查找快、支持交集、并集、差集等操作
Set的常见命令
sadd key member …:向set中添加一个或多个元素
srem key member…:移除set中的指定元素
scard key:返回set中元素的个数
sismember key member:判断一个元素是否存在于set中
smembers:获取set中的所有元素
sinter key1 key2…:求key1与key2的交集
sdiff key1 key2…:求key1与key2的差集
sunlon key1 key2.:求key1和key2的并集
命令演示
sadd
sadd sst a b c d e
smembers
smembers sst
scard
sadd sst a b g h
scard sst
smembers
可以发现重复的元素是插入不进去的
sinter
sadd ssp a b w x
smembers sst
smembers ssp
sinter sst ssp
Sorted Set(有序集合)
SortedSet与Java中的TreeSet有些类似,SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(SkipList)加hash表。
SortedSet特性:可排序、元素不重复、查询速度快
Sortedset的常见命令
zadd key score member:添加一个或多个元素到sorted set ,如果已经存在则更新其score值
zrem key member:删除sorted set中的一个指定元素
zscore key member:获取sorted set中的指定元素的score值
zrank key member:获取sorted set 中的指定元素的排名
zcard key:获取sorted set中的元素个数
zcount key min max:统计score值在给定范围内的所有元素的个数
zincrby key increment member:让sorted set中的指定元素自增,步长为指定的increment值
zrange key min max:按照score排序后,获取指定排名范围内的元素
zrangebyscore key min max:按照score排序后,获取指定score范围内的元素ZDIFF、ZINTER、ZUNION:求差集、交集、并集
命令演示
zadd
zadd myset 30 curry 23 james 24 kobe 3 polo
排名默认从0开始升序排序
zcount key min max
# 查看1到24的人数
zcount myset 1 24
zrange key min max
# 查找1到30的人
zrange myset 1 30
位图(Bitmap)
位图(Bitmap)是一种数据结构,用于表示和操作位(0 或 1)的集合,通常使用连续的比特位(bit)来存储。在 Redis 中,位图是一种特殊的数据类型,可以用于存储和操作位级别的数据。
位图主要由 SETBIT、GETBIT、BITCOUNT 和 BITOP 等命令来进行操作。
位图的常用命令
- SETBIT key offset value:设置位图中指定偏移量上的位值。offset 表示位图中的比特位偏移量,value 可以是 0 或 1。
- GETBIT key offset:获取位图中指定偏移量上的位值。
- BITCOUNT key [start end]:计算位图中指定范围内的比特位值为 1 的数量。可选参数 start 和 end 用于指定范围,如果不指定,则计算整个位图的数量。
- BITOP operation destkey key [key …]:对一个或多个位图执行逻辑操作(如 AND、OR、XOR、NOT),并将结果存储在目标位图 destkey 中。
位图常见的应用场景
- 用户签到记录:
通过位图可以方便地记录用户的签到情况。以每天一个比特位的方式,创建一个位图来表示用户是否签到。每个用户对应一个位图,其中每个比特位表示一天的签到状态。通过 SETBIT 命令设置对应日期的比特位为 1,表示用户签到;通过 GETBIT 命令检查比特位的值,可以查询用户是否签到。 - 在线用户统计:
位图可以用于记录用户的在线状态。以每个用户一个比特位的方式,创建一个位图来表示用户是否在线。每个比特位表示一个用户的在线状态,比如 1 表示在线,0 表示离线。通过 SETBIT 命令设置对应用户的比特位为 1,表示用户在线;通过 GETBIT 命令检查比特位的值,可以查询用户的在线状态。使用 BITCOUNT 命令可以计算在线用户的数量。 - 布隆过滤器:
布隆过滤器是一种高效的概率数据结构,用于判断一个元素是否属于某个集合。位图可以用于实现布隆过滤器。通过多个不同的位偏移量,将元素映射到位图中的多个比特位上。使用 SETBIT 命令将对应的比特位设置为 1,表示元素存在;使用 GETBIT 命令检查比特位的值,可以判断元素是否可能存在于集合中。
命令演示
SETBIT key offset value
SETBIT 命令用于设置位图(bitmap)中指定偏移量上的位值。它可以将位图中的指定位置的比特位设置为 0 或 1。
命令的基本语法如下:
SETBIT key offset value
其中:
- key 是位图的键名。
- offset 是比特位在位图中的偏移量。
- value 是要设置的比特位的值,可以是 0 或 1。
SETBIT mybitmap 0 1
SETBIT mybitmap 2 1
在上面的示例中,我们首先使用 SETBIT 命令将位图 mybitmap 中偏移量为 0 的比特位设置为 1。然后,我们将偏移量为 2 的比特位也设置为 1。
请注意,位图中的比特位是按照连续的偏移量存储的,偏移量从左到右递增。因此,可以通过不同的偏移量来表示不同的比特位。
BITCOUNT key [start end]
命令的基本语法如下:
BITCOUNT key [start end]
- key 是位图的键名。
- start 和 end 是可选参数,用于指定要计算的比特位范围。如果不指定 start 和 end,则计算整个位图的数量。
以下是一个使用示例:
BITCOUNT mybitmap
BITCOUNT mybitmap 0 5
在上面的示例中,我们首先使用 BITCOUNT 命令计算位图 mybitmap 中所有比特位值为 1 的数量。接着,我们使用 BITCOUNT 命令计算位图中从偏移量 0 到偏移量 5 的比特位值为 1 的数量。
执行上述命令后,将返回对应的比特位值为 1 的数量。
请注意,BITCOUNT 命令是按照字节(byte)进行计数的,一个字节共包含 8 个比特位。如果指定的范围超出了位图的实际范围,命令会自动截断到位图的边
HyperLogLog(基数估计)
HyperLogLog(超级日志日志)是一种概率型数据结构,用于估计集合中不重复元素的基数(cardinality)。它的设计目标是使用固定的空间来估计大规模数据集的基数,同时提供很高的准确性和较小的内存占用。
在 Redis 中,HyperLogLog 是一种数据类型,提供了用于操作和估计基数的命令。
HyperLogLog常见命令
- PFADD key element [element …]:将一个或多个元素添加到 HyperLogLog 中。
- PFCOUNT key [key …]:估计指定 HyperLogLog 的基数。
- PFMERGE destkey sourcekey [sourcekey …]:合并多个 HyperLogLog,将结果存储在目标 HyperLogLog destkey 中。
HyperLogLog 使用一些随机算法和哈希函数来实现基数估计。通过添加元素到 HyperLogLog 中,它会根据元素的哈希值来更新内部的计数器。估计基数时,HyperLogLog 会统计计数器中为零的比特位的数量,并根据这个数量来估算基数。
HyperLogLog 的估计结果是近似值,但在很多情况下具有很高的准确度。它可以用于统计网站的独立访客数量、统计广告点击数量、统计活跃用户数等场景,特别适用于需要处理大规模数据集并且对内存占用有限制的情况。
需要注意的是,HyperLogLog 在 Redis 2.8 及以上版本中可用。
HyperLogLog常见的应用场景
- 统计独立访客数量:
在网站分析中,统计独立访客数量是一个常见的需求。使用 HyperLogLog 可以有效地估计独立访客的数量。每当有用户访问网站时,将用户的唯一标识(如用户ID或IP地址)添加到 HyperLogLog 中,然后使用 PFCOUNT 命令估计 HyperLogLog 的基数,即独立访客数量。 - 统计在线用户数:
HyperLogLog 也可用于估计在线用户的数量。每当用户登录或注销时,将用户的唯一标识添加到 HyperLogLog 中。通过使用 PFCOUNT 命令估计 HyperLogLog 的基数,可以实时获取在线用户的近似数量。 - 统计广告点击数量:
在广告分析中,统计广告点击数量是重要的指标之一。使用 HyperLogLog 可以高效地估计广告的独立点击数量。每当广告被点击时,将点击事件的唯一标识添加到 HyperLogLog 中。通过使用 PFCOUNT 命令估计 HyperLogLog 的基数,可以得到广告的近似点击数量。 - 统计社交网络中的活跃用户数:
HyperLogLog 可以用于估计社交网络中的活跃用户数量。每当用户在社交网络上进行活动(如发表帖子、发表评论、点赞等),将用户的唯一标识添加到 HyperLogLog 中。通过使用 PFCOUNT 命令估计 HyperLogLog 的基数,可以获得社交网络中的活跃用户数量的近似值
Geospatial(地理空间索引)
地理空间索引(Geospatial indexing)是一种用于存储和查询地理空间数据的技术。它允许我们在地理坐标系中表示和操作数据,如点、线、多边形等,并提供高效的地理空间查询功能。
在地理空间索引中,数据通常以经度(Longitude)和纬度(Latitude)的坐标形式表示。常见的地理空间索引算法包括 R-tree、Quadtree 和 Geohash 等。
从 Redis 3.2 版本开始提供了地理空间索引的支持。Redis 使用了一种称为 Geohash 的编码方案来存储和索引地理空间数据。
Geospatial常见命令
- GEOADD key longitude latitude member [longitude latitude member …]:将地理空间位置添加到指定的键中。
- GEOPOS key member [member …]:获取指定地理空间位置的经纬度坐标。
- GEODIST key member1 member2 [unit]:计算两个地理空间位置之间的距离。
- GEORADIUS key longitude latitude radius unit [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]:根据指定的中心点和半径范围,获取符合条件的地理空间位置。
- GEORADIUSBYMEMBER key member radius unit [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]:根据指定的中心点成员和半径范围,获取符合条件的地理空间位置。
通过这些命令,你可以将地理空间位置存储在 Redis 中,并执行各种地理空间查询操作,如查找附近的位置、计算距离、获取坐标等。
地理空间索引在很多应用场景中非常有用,如地理定位服务、附近的人搜索、地点推荐等。它可以帮助你更高效地存储和查询地理空间数据,并进行相关的空间分析操作。
Geospatial常见的实际应用
- 餐厅和商店定位:
许多用户在寻找附近的餐厅、商店或服务时会使用地理定位功能。通过将餐厅或商店的位置信息存储在地理空间索引中,可以根据用户的当前位置提供附近的推荐结果。这使得用户能够快速找到他们所需的服务,并根据距离、评级等因素进行选择。 - 出行和导航应用:
地理空间索引在出行和导航应用中起着关键作用。通过使用地理空间索引,可以查找附近的公交车站、地铁站、加油站等设施,并提供最佳的路线规划。这为用户提供了方便的导航和实时交通信息,帮助他们在城市中更轻松地出行。 - 物流和送货跟踪:
物流和送货服务需要实时跟踪和管理车辆的位置。地理空间索引可以用于存储和查询车辆的位置信息,并根据需求进行最佳路线规划和调度。这样,物流公司可以更好地管理其车队,并提供准确的送货时间估计给客户。 - 社交媒体和位置分享:
地理空间索引在社交媒体应用中广泛应用。用户可以共享他们的位置信息,并查找附近的朋友、活动或感兴趣的地点。这为用户提供了更多与位置相关的社交互动,例如找到附近的朋友、参加活动或发现新的地点。 - 地理数据分析和可视化:
地理空间索引可用于地理数据分析和可视化。通过存储地理数据并使用地理空间索引,可以进行热点区域分析、地理相关性分析等。这对于城市规划、市场分析、地理信息系统等领域非常有用。