【学习笔记】Redis学习笔记 持续更新-0818

这是redis笔记的第三次更新,前面的更新整理在一篇了,有效期可以跳转看下 【学习笔记】Redis学习笔记 持续更新-0728

Geospatial 地理空间

Redis中的Geospatial特性是一组用于存储地理位置信息并进行位置相关查询的功能

特性

  1. 地理位置数据结构:Redis使用特殊的数据结构来存储地理位置信息,这些信息可以是经纬度坐标点。
  2. 空间索引:Redis能够对存储的地理位置点进行空间索引,这使得执行范围查询和距离计算变得高效。
  3. 距离单位:Redis支持多种距离单位,包括米(m)、千米(km)、英里(mi)、英尺(ft)。
  4. 经纬度限制:Redis的Geospatial命令接受的经度范围是-180到180,纬度范围是-85.05112878到85.05112878。
  5. 查询类型: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是一种概率数据结构,用于估算集合中不同元素的数量。这种数据结构特别适用于需要计算集合基数(即集合中不同元素的数量)的场景,而且它非常节省内存。

特性

  1. 高效率的内存使用:HyperLogLog使用非常少的内存来存储大量的唯一元素的计数。通常,它只需要12KB的内存,无论它计算的唯一元素数量是多少,可以用来做些对精确到要求不高,而且数据量非常大的统计工作,比如统计某个网站的UV、某个词的搜索次数等。
  2. 近似的计数:HyperLogLog提供的是基数估算值,而不是精确值。这意味着它有一个很小的误差率,但对于大多数应用场景来说,这个误差是可以接受的。
  3. 不可修改:一旦HyperLogLog被创建,它就不能被修改或删除其中的单个元素。只能通过合并(merge)操作来更新它。
  4. 合并操作:多个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. 内存高效:位图非常节省内存,因为每个位只占用1位的空间,可以非常紧凑地存储大量的布尔值。

  2. 操作原子性:Redis中的位图操作通常是原子性的,这意味着在并发环境下进行修改时不会出现竞态条件。

  3. 灵活性:位图可以用于各种用例,如用户在线状态、日活跃用户统计等。

  4. 位操作:Redis提供了多种位操作命令,可以方便地对位图进行设置、清除、查询等操作。

  5. 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的位的数量。如果指定了startend参数,则只统计这个范围内的位。

text
复制代码
bitcount study

BITPOS (查找值)

BITPOS key bit [start end]:查找位图中第一个值为0或1的位的位置,该命令返回位图中第一个值为bit(0或1)的位的位置。如果指定了startend参数,则只在这个范围内搜索。

Bitfie 位域

Redis中的Bitfield是一种数据结构,允许用户在单个二进制位串中存储多个整数,并且可以对每个整数进行独立的读写操作。这种结构非常适合于需要紧凑存储和高效访问的场景,如时间序列数据、计数器等。

特性

  1. 紧凑存储:Bitfield允许用户在单个位串中存储多个整数,从而节省内存空间。
  2. 类型和大小:用户可以为每个整数指定类型(无符号或有符号)和大小(位数),从而适应不同的数据存储需求。
  3. 原子操作:Bitfield的操作是原子的,这意味着在进行读写操作时不会受到并发访问的影响。
  4. 溢出处理: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中的事务是一种机制,允许用户执行一组命令,并确保这些命令作为一个单独的操作全部执行或全部不执行。这类似于关系型数据库中的事务概念,但有一些区别。

特性

  1. 命令序列化:事务中的所有命令会被序列化并按顺序执行,不会受到其他客户端的请求影响。
  2. 原子性:事务中的所有命令要么全部成功执行,要么全部不执行,保证了操作的原子性。
  3. 隔离性:事务执行期间,事务中的命令不会受到其他事务的影响。
  4. 没有回滚:与关系型数据库不同,Redis事务一个重要限制是它们不支持回滚操作。如果事务中的某个命令执行失败,其他命令仍然会执行,不会撤销已执行的命令。因此,在使用Redis事务时,需要谨慎设计命令以确保它们不会产生错误。此外,Redis事务不支持事务间的隔离级别,因此无法避免脏读、不可重复读和幻读等问题。
  5. 使用检查点:可以通过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数据库的快照来工作,它会定时将内存中的数据以二进制文件的形式保存到硬盘上。

特点
  1. 手动或自动触发:可以通过配置定期自动创建快照,也可以通过SAVEBGSAVE命令手动触发。
  2. 数据压缩:RDB文件是经过压缩的,因此它通常比内存中的数据要小。
  3. 快速恢复:由于RDB文件是整个数据集的快照,恢复速度通常很快。
  4. 可能会丢失数据:由于RDB是定期生成的,如果在两次快照之间发生故障,那么最后一次快照之后的数据可能会丢失。
命令
  • SAVE:阻塞Redis服务器,直到RDB文件被创建完成。

  • 语法:SAVE

  • BGSAVE:在后台异步创建RDB文件,不会阻塞服务器。

  • 语法:BGSAVE

  • LASTSAVE:返回最后一次成功执行SAVEBGSAVE命令的时间戳。

  • 语法:LASTSAVE

AOF(追加文件)

AOF(Append Only File)持久化通过记录每个写操作命令到日志文件来工作,当Redis服务器重启时,会重新执行这些命令来恢复数据。

特点
  1. 更高的数据安全性:AOF可以配置为每次写操作后都同步到硬盘,从而减少数据丢失的风险。
  2. 更大的文件大小:由于AOF记录了每个写操作,文件大小通常会大于RDB文件。
  3. 更慢的恢复速度:恢复时需要重新执行AOF文件中的所有命令,因此可能会比RDB慢。
  4. 可配置的同步策略: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用于确保更高的数据安全性。
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
听风
下载 APP