【学习笔记】Redis学习笔记 持续更新-0818
这是redis笔记的第三次更新,前面的更新整理在一篇了,有效期可以跳转看下 【学习笔记】Redis学习笔记 持续更新-0728
Geospatial 地理空间
Redis中的Geospatial特性是一组用于存储地理位置信息并进行位置相关查询的功能
特性
- 地理位置数据结构:Redis使用特殊的数据结构来存储地理位置信息,这些信息可以是经纬度坐标点。
- 空间索引:Redis能够对存储的地理位置点进行空间索引,这使得执行范围查询和距离计算变得高效。
- 距离单位:Redis支持多种距离单位,包括米(m)、千米(km)、英里(mi)、英尺(ft)。
- 经纬度限制:Redis的Geospatial命令接受的经度范围是-180到180,纬度范围是-85.05112878到85.05112878。
- 查询类型:Redis提供了多种查询方式,如查找指定范围内的点、计算两点之间的距离、获取指定点的位置排名等。
GEOADD(添加坐标)
GEOADD key longitude latitude member [longitude latitude member ...]用于将地理位置坐标添加到指定的键中。
添加北京的地理位置如下:
▼text复制代码GEOADD city 116.405285 39.904989 beijing
一次添加多个:上海,深圳,广州,杭州
▼text复制代码GEOADD city 121.472644 31.231706 shanghai 114.085947 22.547 shenzhen 37 23.125178 guangzhou 120.153576 30.287459 hangzhou
GEOPOS(获,。取经纬度)
GEOPOS key member [member ...]:从键中获取指定成员的地理位置坐标。
GEODIST(计算距离)
GEODIST key member1 member2 [unit]:用于计算两个地理位置之间的距离。默认返回单位是米,也可以是千米或其他
▼text复制代码GEODISt city shanghai shenzhen
GEORADIUSBYMEMBER(搜索指定范围内坐标)
与GEORADIUS类似,但是以给定的成员作为中心点进行查询。
GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]与上方同理,用来获取一个或多个地理位置坐标点的Geohash表示,可以以一个指定成员或指定的经纬度为中心
▼text复制代码GEORADIUSBYMEMBER city shanghai 300 km
※GEOSEARCH(搜索指定范围内坐标,redis6.2版本后支持)
GEOSEARCH key FROMMEMBER member | FROMLONLAT longitude latitude BYRADIUS radius M | KM | FT | MI | BYBOX width height M | KM | FT | MI [ASC | DESC] [COUNT count [ANY]] [WITHCOORD] [WITHDIST] [WITHHASH]:用于获取一个或多个地理位置坐标点的Geohash表示,可以以一个指定成员或指定的经纬度为中心,按照圆形或者矩形的范围来搜索
搜索距离上海300km以内的城市
byradius表示一个圆形的范围,后面加上半径 300km
bybox表示矩形的范围
▼text复制代码GEOSEARCH city FROMMEMBER shanghai BYRADIUS 300 KM
HyperLogLog 基数统计算法
Redis中的HyperLogLog是一种概率数据结构,用于估算集合中不同元素的数量。这种数据结构特别适用于需要计算集合基数(即集合中不同元素的数量)的场景,而且它非常节省内存。
特性
- 高效率的内存使用:HyperLogLog使用非常少的内存来存储大量的唯一元素的计数。通常,它只需要12KB的内存,无论它计算的唯一元素数量是多少,可以用来做些对精确到要求不高,而且数据量非常大的统计工作,比如统计某个网站的UV、某个词的搜索次数等。
- 近似的计数:HyperLogLog提供的是基数估算值,而不是精确值。这意味着它有一个很小的误差率,但对于大多数应用场景来说,这个误差是可以接受的。
- 不可修改:一旦HyperLogLog被创建,它就不能被修改或删除其中的单个元素。只能通过合并(merge)操作来更新它。
- 合并操作:多个HyperLogLog可以合并为一个,这是它一个非常独特的特性,可以用来合并来自不同来源的数据集。
PFADD (添加元素)
PFADD key element [element ...]:用于将指定的元素添加到HyperLogLog中。
▼text复制代码PFADD course git docker redis
PFCOUNT (统计元素)
PFCOUNT key [key ...]:用于返回HyperLogLog的近似基数,即不同元素的数量。
▼text复制代码PFCOUNT course
PFMERGE (合并)
PFMERGE destkey sourcekey [sourcekey ...]:合并多个HyperLogLog为一个HyperLogLog。
▼text复制代码PFADD course2 python git java PFMERGE result course course2 PFCOUNT result
位图 Bitmap
Redis中的位图(Bitmap)是一种数据结构,它以位数组的形式存储数据。每个位只能存储0或1的值。位图通常用于表示布尔值或者进行基于位的操作,它们特别适合于需要高效存储和检索大量布尔值信息的场景。
特性
-
内存高效:位图非常节省内存,因为每个位只占用1位的空间,可以非常紧凑地存储大量的布尔值。
-
操作原子性:Redis中的位图操作通常是原子性的,这意味着在并发环境下进行修改时不会出现竞态条件。
-
灵活性:位图可以用于各种用例,如用户在线状态、日活跃用户统计等。
-
位操作:Redis提供了多种位操作命令,可以方便地对位图进行设置、清除、查询等操作。
-
SETBIT(设置偏移量)
SETBIT key offset value:用于设置位图中指定位置的位值,该命令将位图中偏移量offset处的位设置为value(只能是0或1)。如果偏移量大于当前位图大小,位图会自动扩展。。
设置0的位置值为1,1 的位置值为0,生成一个长度为2的位图
▼text复制代码SETBIT study 0 1 SETBIT study 1 0
GETBIT(获取值)
GETBIT key offset:获取设置好的偏移量的值,该命令返回位图中偏移量offset处的位值。
▼text复制代码GETBIT study 1 GETBIT study 0
BITCOUNT(统计值)
BITCOUNT key [start end]:统计位图中值为1的位的数量,该命令返回位图中值为1的位的数量。如果指定了start和end参数,则只统计这个范围内的位。
▼text复制代码bitcount study
BITPOS (查找值)
BITPOS key bit [start end]:查找位图中第一个值为0或1的位的位置,该命令返回位图中第一个值为bit(0或1)的位的位置。如果指定了start和end参数,则只在这个范围内搜索。
Bitfie 位域
Redis中的Bitfield是一种数据结构,允许用户在单个二进制位串中存储多个整数,并且可以对每个整数进行独立的读写操作。这种结构非常适合于需要紧凑存储和高效访问的场景,如时间序列数据、计数器等。
特性
- 紧凑存储:Bitfield允许用户在单个位串中存储多个整数,从而节省内存空间。
- 类型和大小:用户可以为每个整数指定类型(无符号或有符号)和大小(位数),从而适应不同的数据存储需求。
- 原子操作:Bitfield的操作是原子的,这意味着在进行读写操作时不会受到并发访问的影响。
- 溢出处理:Bitfield支持溢出处理策略,如饱和(SAT)、环绕(WRAP)或失败(FAIL)。
BITFIELD(多种操作)
BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL]:用于对位域执行多种操作,如设置值、获取值、增减操作等。
用命令初始化游戏的玩家数据
等级Level 1、金钱 Money 100 经验值 Exp 0
玩家id player:1
U8类型的整数(u8表示一个8位的无符号整数)表示等级, #0 1表示将第一个位置设置为1
▼text复制代码BITFIELD player:1 set u8 #0 1
使用get来返回对应的信息,图中显示\x01表示十六进制的01也就是等级为1
▼text复制代码> get player:1
如果需要直接获取等级值,把第一条命令的set换成get,去掉设置值
▼text复制代码BITFIELD player:1 set u8 #0
设置金钱和经验值 32位无符号整数 金钱100 经验0
▼text复制代码BITFIELD player:1 set u32 #1 100 BITFIELD player:1 set u32 #2 0
查询金钱和经验
▼text复制代码BITFIELD player:1 get u32 #1 BITFIELD player:1 get u32 #2
增加100金币,经验加1000,等级升级
▼text复制代码> BITFIELD player:1 incrby u32 #1 100 > BITFIELD player:1 incrby u32 #2 1000 > BITFIELD player:1 incrby u8 #0 1 > BITFIELD player:1 get u8 #0 > BITFIELD player:1 get u32 #1 > BITFIELD player:1 get u32 #2
详细描述
-
GET:用于从位域中读取值。
-
type:指定整数的类型,可以是u(无符号)或i(有符号)。 -
offset:指定整数在位串中的起始偏移量。 -
示例:
BITFIELD key GET u8 0读取从偏移量0开始的8位无符号整数。 -
SET:用于在位域中设置值。
-
type:同上。 -
offset:同上。 -
value:要设置的整数值。 -
示例:
BITFIELD key SET u8 0 100将从偏移量0开始的8位无符号整数设置为100。 -
INCRBY:用于在位域中增减整数值。
-
type:同上。 -
offset:同上。 -
increment:要增加或减少的值,可以是正数或负数。 -
示例:
BITFIELD key INCRBY u8 0 1将从偏移量0开始的8位无符号整数增加1。 -
OVERFLOW:用于指定溢出处理策略。
-
WRAP:环绕溢出,即超出范围的值会从另一端开始。 -
SAT:饱和溢出,即超出范围的值会被限制在最大或最小值。 -
FAIL:失败溢出,即如果操作会导致溢出,则不执行操作并返回错误。 -
示例:
BITFIELD key INCRBY u8 0 1 OVERFLOW SAT指定增减操作使用饱和溢出策略。
Bitfield命令是Redis 3.2版本引入的,它为Redis提供了更丰富的位操作能力,允许用户在单个位串中存储和操作多个整数,非常适合于需要对位进行复杂操作的场景。通过使用Bitfield,用户可以有效地利用内存,同时简化数据的读写操作。
Redis事务
Redis中的事务是一种机制,允许用户执行一组命令,并确保这些命令作为一个单独的操作全部执行或全部不执行。这类似于关系型数据库中的事务概念,但有一些区别。
特性
- 命令序列化:事务中的所有命令会被序列化并按顺序执行,不会受到其他客户端的请求影响。
- 原子性:事务中的所有命令要么全部成功执行,要么全部不执行,保证了操作的原子性。
- 隔离性:事务执行期间,事务中的命令不会受到其他事务的影响。
- 没有回滚:与关系型数据库不同,Redis事务一个重要限制是它们不支持回滚操作。如果事务中的某个命令执行失败,其他命令仍然会执行,不会撤销已执行的命令。因此,在使用Redis事务时,需要谨慎设计命令以确保它们不会产生错误。此外,Redis事务不支持事务间的隔离级别,因此无法避免脏读、不可重复读和幻读等问题。
- 使用检查点:可以通过WATCH命令在事务开始前设置检查点,用于监控指定的键,如果在事务执行前这些键被修改,事务将被中断。
MULTI(标记事务块的开始)
MULTI:这个命令用于开始一个事务。在调用MULTI之后,客户端可以发送多个命令到服务器,这些命令不会立即执行,而是被放入一个队列中。
EXEC(执行所有事务)
EXEC:当所有要执行的命令都放入队列后,客户端发送EXEC命令,Redis将执行队列中的所有命令。如果事务中的某个命令执行失败,其他命令仍然会继续执行。
DISCARD(取消事务)
DISCARD:如果在事务块中执行了错误的命令,可以使用DISCARD来取消事务,并丢弃队列中的所有命令。
WATCH(监视)
WATCH key [key ...]:在执行事务之前,可以使用WATCH命令来监视一个或多个键。如果在调用EXEC之前这些键被修改,事务将不会被执行,并且返回一个错误。
UNWATCH(取消对所有键的监视)
UNWATCH:这个命令用于取消对所有键的监视。如果在事务执行之前不再需要监视某些键,可以使用UNWATCH来取消监视。
操作
通过输入MULTI来开启一个事务
输入多个命令不会直接提示OK,而是显示QUEUED,表示把命令放到队列中,直到输入EXEC执行事务
▼text复制代码127.0.0.1:6379> multi 127.0.0.1:6379> set key value 127.0.0.1:6379> incr counter 127.0.0.1:6379> exec
Redis持久化
Redis持久化是指将内存中的数据保存到硬盘上,以便在Redis服务器重启后能够恢复数据。Redis提供了两种主要的持久化机制:RDB(快照)和AOF(追加文件)。以下是这两种机制的详细介绍:
RDB(快照)
RDB(Redis Database)持久化通过创建Redis数据库的快照来工作,它会定时将内存中的数据以二进制文件的形式保存到硬盘上。
特点
- 手动或自动触发:可以通过配置定期自动创建快照,也可以通过
SAVE或BGSAVE命令手动触发。 - 数据压缩:RDB文件是经过压缩的,因此它通常比内存中的数据要小。
- 快速恢复:由于RDB文件是整个数据集的快照,恢复速度通常很快。
- 可能会丢失数据:由于RDB是定期生成的,如果在两次快照之间发生故障,那么最后一次快照之后的数据可能会丢失。
命令
-
SAVE:阻塞Redis服务器,直到RDB文件被创建完成。
-
语法:
SAVE -
BGSAVE:在后台异步创建RDB文件,不会阻塞服务器。
-
语法:
BGSAVE -
LASTSAVE:返回最后一次成功执行
SAVE或BGSAVE命令的时间戳。 -
语法:
LASTSAVE
AOF(追加文件)
AOF(Append Only File)持久化通过记录每个写操作命令到日志文件来工作,当Redis服务器重启时,会重新执行这些命令来恢复数据。
特点
- 更高的数据安全性:AOF可以配置为每次写操作后都同步到硬盘,从而减少数据丢失的风险。
- 更大的文件大小:由于AOF记录了每个写操作,文件大小通常会大于RDB文件。
- 更慢的恢复速度:恢复时需要重新执行AOF文件中的所有命令,因此可能会比RDB慢。
- 可配置的同步策略:AOF支持不同的同步策略,如每秒同步、每次写操作同步或不同步。
命令
-
BGREWRITEAOF:重写AOF文件,以压缩日志并移除冗余命令。
-
语法:
BGREWRITEAOF
配置
Redis的持久化可以通过配置文件进行配置。以下是一些关键的配置项:
- save:在配置文件中设置自动快照的条件,例如
save 900 1表示如果至少有1个键被修改,则在900秒后创建快照。 - appendonly:设置为
yes来启用AOF持久化。 - appendfsync:设置AOF同步到硬盘的策略,可以是
no(不同步)、everysec(每秒同步)或always(每次写操作同步)。 - dir:设置RDB和AOF文件的存储目录。
- dbfilename:设置RDB文件的名称。
- appendfilename:设置AOF文件的名称。
持久化是Redis数据安全性的关键组成部分。根据具体的使用场景和需求,可以选择RDB、AOF或者两者结合的方式来保证数据的持久化。通常,RDB用于定期备份,而AOF用于确保更高的数据安全性。

