简单了解redis及其相关操作

redis的学习过程

redis的数据类型

string,hash,list,set,zset五种类型

需要注意的是 每种类型的添加和取值的命令参数

string--set/get;
hash----hmset/hget;
list----lpush/lrange key start end
set-----sadd/smembers(查询所有)
zset----zadd/ZRANGEBYSCOR

主要难理解的是zset(有序的集合Set)吧:

redis 127.0.0.1:6379> DEL runoob
redis 127.0.0.1:6379> zadd runoob 0 redis
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 mongodb
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabbitmq
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabbitmq
(integer) 0
redis 127.0.0.1:6379> ZRANGEBYSCORE runoob 0 1000
1) "mongodb"
2) "rabbitmq"
3) "redis"

List Vs Zset

  1. 排序和唯一性:ZSET 是有序的数据结构,其中的每个元素都与一个分数(score)相关联,用于对元素进行排序。ZSET 中的元素是唯一的,不允许重复值。而 LIST 是一个有序的、可重复的元素集合,元素的顺序由它们在列表中的插入顺序决定。
  2. 访问和操作:ZSET 支持按照分数范围或排名(rank)来访问和操作元素。您可以根据分数范围获取一段分数内的元素,或者根据排名获取排名在某个范围内的元素。而 LIST 支持在列表的两端进行插入、删除和访问操作,可以在列表的头部或尾部进行推入(push)和弹出(pop)操作。
  3. 应用场景:ZSET 通常用于需要根据分数进行排序和排名的场景,如排行榜、计分系统等。您可以使用 ZSET 来存储一组具有分数的元素,并按照分数进行排序和检索。而 LIST 适用于需要保留元素插入顺序的场景,如消息队列、日志记录等。您可以使用 LIST 来存储和管理按照时间顺序到达的元素。

类型总结

学习的时候看到一张图总结的很好,下面贴示一下

image-20230926171712761

HyperLogLog 结构。

这是在redis 2.8.9 版本添加了 HyperLogLog 结构。

优点:它是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。

在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。

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

他只有常见的三个用法

命令Command功能Description
PFADD key element添加指定元素到 HyperLogLog 中。
PFCOUNT key返回给定 HyperLogLog 的基数估算值。
PFMERGE destkey sourcekey [sourcekey ...]将多个 HyperLogLog 合并为一个 HyperLogLog

常用命令

查看redis中所有的key:keys *–(慎用,当大量数据,会造成性能问题

string类型常用命令

string最大存储512Mb。

getset 就不用再说了

我觉得主要用的可以是

命令Command功能Description
INCR keyIncrement the value of a key by 1.
DECR keyDecrement the value of a key by 1.
APPEND key valueAppend a value to the existing value of a key.
STRLEN keyGet the length of the value stored at a key.
SETEX key seconds value设置带有过期时间的键值对
MSET key value [key value ...]设置多个key的value
MGET key [key ...]得到多个key
EXISTS key [key ...]判断是否存在该key.
SETNX key value只有key不存在的时候赋值

想看如何是使用或者更多命令详情请见:Redis 字符串(String) | 菜鸟教程 (runoob.com)

hash类型常用命令

Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。Redis 中每个 hash 可以存储 2(32次方 - 1 键值对(40多亿)。

笔者表示:跟string的差异几乎只是在命令前加了一个 H

命令Command功能Description
HINCRBY keyHincrby 命令用于为哈希表中的字段值加上指定增量值。如果哈希表的 key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。
HGETALL key显示所有键值对
HKEYS显示哈希表所有的字段
HSCAN key cursor [MATCH patterm].[COUNT count]迭代哈希表中的键值对。

list类型常用命令

最后添加的元素在最左边,为列表的第一个元素

示例

输入输出均有左右的区别啊,下面就只写左边,右边取出插入替换LR

命令Command功能Description
LPUSH在列表左边添加元素
BLPOP key1 [key2 ] timeout移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
LLEN key获取列表长度
LREM key count value移除列表元素
RPOPLPUSH source destination移除列表的最后一个元素,并将该元素添加到另一个列表并返回
LRANGE key得到列表的指定范围的值
LPUSHX key value向存在的列表添加元素,列表没有则不添加

注意:在上面命令L有的是表示左边left,有的是表示列表list的意思。注意辨析

set类型常用命令

Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

命令Command功能Description
SADD key mem1在集合中添加元素
SCARD key返回集合中的数量
SISMEMBER判断是否为集合的元素
SPOP key member随机弹出并返回其中的一个元素
SMOVE s d member移动到另一个集合
SMEMBERS得到所有的元素
SRANDMEMBER key [count]得到随机count个元素
SDIFF key1 [key2]查找key1集合的独有元素
SINTER key1 [key2]查找所有集合的交集部分元素
SUNION得到所有集合的并集
SDIFFSTORE找出并存储(同 交集和并集

Zset类型常用命令

Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。

redis 127.0.0.1:6379> ZADD runoobkey 1 redis
(integer) 1
redis 127.0.0.1:6379> ZADD runoobkey 2 mongodb
(integer) 1
redis 127.0.0.1:6379> ZADD runoobkey 3 mysql
(integer) 1
redis 127.0.0.1:6379> ZADD runoobkey 3 mysql
(integer) 0
redis 127.0.0.1:6379> ZADD runoobkey 4 mysql
(integer) 0
redis 127.0.0.1:6379> ZRANGE runoobkey 0 10 WITHSCORES

1) "redis"
2) "1"
3) "mongodb"
4) "2"
5) "mysql"
6) "4"

下面是常见的命令,特别的就是可以查找取值中的元素,以及用lex来表示value的取值

命令Command功能Description
ZADD key mem1在集合中添加元素
ZCARD key返回集合中的数量
ZCOUNT key min max计算在有序集合中指定区间分数的成员数
ZINCRBY key increment member有序集合中对指定成员的分数加上增量 incremen,同后加store
ZSCORE key member返回有序集中,成员的分数值

还有其他的一些啊,看链接:Redis 有序集合(sorted set) | 菜鸟教程 (runoob.com)

redis的发布订阅

Redis 提供了发布订阅(Pub/Sub)功能,它允许不同的客户端通过发布和订阅消息的方式进行通信。Redis 客户端可以订阅任意数量的频道。

实例

以下实例演示了发布订阅是如何工作的,需要开启两个 redis-cli 客户端。

在我们实例中我们创建了订阅频道名为 runoobChat:

第一个 redis-cli 客户端
redis 127.0.0.1:6379> SUBSCRIBE runoobChat

Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "chat"
3)  1

开启第一个cli

第二个 redis-cli 客户端

现在,我们先重新开启个 redis 客户端,然后在同一个频道 runoobChat 发布两次消息,订阅者就能接收到消息。

redis 127.0.0.1:6379> PUBLISH chat "Redis PUBLISH test"

(integer) 1

image-20230926215154935

订阅者的客户端会显示如下消息
image-20230926215215962

订阅相关的命令

命令Command功能Description
publish向某个通道发布信息
subscribe订阅一个获多个频道
PSUBSCRIBE pattern订阅符合给定模式的频道。
PUBSUB [argument [argument …]]用于查看订阅与发布系统状态

PUNSUBSCRIBE等就是利用un来表示退订

redis事务

multi开头,以exec结尾执行,discard取消执行的事务(多个命令。

特点:

  • 中间出错,继续运行—命令执行的原子性,但是事务没有原子性

  • 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中;

  • 批量操作在发送 EXEC 命令前被放入队列缓存。

运行效果如下图

事务运行效果

命令Command功能Description
WATCH key [key ...]命令用于监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断
UNWATCH取消 WATCH 命令对所有 key 的监视。

redis脚本

脚本我暂时还没有涉及,所以先不写了哈

如果有需要,可以参考官方文档或者Redis 脚本 | 菜鸟教程 (runoob.com)

redis 连接

Redis 连接命令主要是用于连接 redis 服务。

redis连接的相关函数

基本看了就能懂的命令,如果不懂可以再相关网站中查询一下

redis服务器

了解redis相关服务器信息

  • bgsave命令

    Redis Bgsave 命令用于在后台异步保存当前数据库的数据到磁盘。

    BGSAVE 命令执行之后立即返回 OK ,然后 Redis fork 出一个新子进程,原来的 Redis 进程(父进程)继续处理客户端请求,而子进程则负责将数据保存到磁盘,然后退出。

    redis> BGSAVE
    Background saving started
    
  • client list & client kill命令

    获取此客户端进程信息&杀死该进程,退回保持连接会发现重新连接,此时的端口号不同

image-20230927113526873

  • key的相关命令

    dbsize得到此时数据库中的key的数量

    flushall删除所有数据库的key

    flushdb删除当前数据库的key

  • config还有其他的相关命令

    查询链接Redis 服务器 | 菜鸟教程 (runoob.com)

redis GEO

主要用这些来存储现实地理信息。

Redis GEO 操作方法有:

  • geoadd:添加地理位置的坐标。GEOADD key longitude latitude member [longitude latitude member ...]
  • geopos:获取地理位置的坐标。GEOPOS key member [member ...]
  • geodist:计算两个位置之间的距离。GEODIST key member1 member2 [m|km|ft|mi]
  • georadius:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。
  • georadiusbymember:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。
  • geohash:返回一个或多个位置对象的 geohash 值。
redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis> GEODIST Sicily Palermo Catania
"166274.1516"
redis> GEORADIUS Sicily 15 37 100 km
1) "Catania"
redis> GEORADIUS Sicily 15 37 200 km
1) "Palermo"
2) "Catania"
redis>

redis stream

这是redis提供消息队列的方式,其实在之前的redis发布订阅中可以实现消息的传递,但是由于通道如果关闭,会断开连接,不具备持久性,在后期redis中开发出redis stream弥补缺点。

stream结构

image-20230927193839638

这里如果拥有计网的知识,会更容易理解。比如tcp的ack知识,滑动窗口等。

常用命令参数

XADD

向队列添加信息,如果队列不存在则重新创建

XADD key ID field value [field value ...]
  • key :队列名称,如果不存在就创建
  • ID :消息 id,我们使用 * 表示由 redis 生成,可以自定义,但是要自己保证递增性。
  • field value : 记录。

image-20230927194645149

XDEL

删除信息 XDEL key ID [ID ...]

注意:这个要根据id删除,如果采用redis自动设置的id,可能会很难手动输入

> XADD mystream * a 1
1538561698944-0
> XADD mystream * b 2
1538561700640-0
> XADD mystream * c 3
1538561701744-0
> XDEL mystream 1538561700640-0
(integer) 1
127.0.0.1:6379> XRANGE mystream - +
1) 1) 1538561698944-0
   2) 1) "a"
      2) "1"
2) 1) 1538561701744-0
   2) 1) "c"
      2) "3"
XLEN & XRANGE
  • 前者获取消息长度 XLEN key

  • 否则获取消息列表,自动过滤已经删除的信息 XRANGE key start end [COUNT count]

XREAD

使用 XREAD 以阻塞或非阻塞方式获取消息列表 ,语法格式:

XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] id [id ...]
  • count :数量
  • milliseconds :可选,阻塞毫秒数,没有设置就是非阻塞模式
  • key :队列名
  • id :消息 ID
# 从 Stream 头部读取两条消息
> XREAD COUNT 2 STREAMS mystream writers 0-0 0-0
1) 1) "mystream"
   2) 1) 1) 1526984818136-0
         2) 1) "duration"
            2) "1532"
            3) "event-id"
            4) "5"
            5) "user-id"
            6) "7782813"
      2) 1) 1526999352406-0
         2) 1) "duration"
            2) "812"
            3) "event-id"
            4) "9"
            5) "user-id"
            6) "388234"
2) 1) "writers"
   2) 1) 1) 1526985676425-0
         2) 1) "name"
            2) "Virginia"
            3) "surname"
            4) "Woolf"
      2) 1) 1526985685298-0
         2) 1) "name"
            2) "Jane"
            3) "surname"
            4) "Austen"
XGROUP

用于创建消费者组(Consumer Group)的命令。消费者组可以用于对流中的消息进行分组和分发,以便多个消费者协同处理消息。

以下是 XGROUP CREATE 命令的语法:

XGROUP CREATE stream groupname id-or-$ [MKSTREAM]
  • stream 是要创建消费者组的流名称。
  • groupname 是要创建的消费者组的名称。
  • id-or-$ 是消费者组的消费者 ID 或者 $ 符号。如果使用 $,表示自动生成一个唯一的消费者 ID。
  • MKSTREAM 是一个可选参数,用于指示在创建消费者组时,如果流不存在,是否同时创建新的流。

注意,使用消费者组前,需要先向流中插入消息。消费者组可以使用 XREADGROUP 命令来读取消息并进行消费。消费者组还提供了一些其他的命令来管理消费者和消息的消费进度。

XREADGROUP GROUP则为读取消费组的信息


redis还有其他高级知识,如管道,安全,性能等,但由于笔者只是通过了解redis来进一步学习go-redis,后面就不意义赘述了,有需要可以伤亡查询更多知识详情

XGROUP CREATE stream groupname id-or-$ [MKSTREAM]


- `stream` 是要创建消费者组的流名称。
- `groupname` 是要创建的消费者组的名称。
- `id-or-$` 是消费者组的消费者 ID 或者 `$` 符号。如果使用 `$`,表示自动生成一个唯一的消费者 ID。
- `MKSTREAM` 是一个可选参数,用于指示在创建消费者组时,如果流不存在,是否同时创建新的流。

注意,使用消费者组前,需要先向流中插入消息。消费者组可以使用 XREADGROUP 命令来读取消息并进行消费。消费者组还提供了一些其他的命令来管理消费者和消息的消费进度。

`XREADGROUP GROUP`则为读取消费组的信息

---

redis还有其他高级知识,如管道,安全,性能等,但由于笔者只是通过了解redis来进一步学习go-redis,后面就不意义赘述了,有需要可以伤亡查询更多知识详情

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值