本文介绍: 消息队列,相比于基于 List 类型实现消息队列,有这两个特有的特性自动生成全局唯一消息ID,支持以消费组形式消费数据。解锁是有两个操作,这时就需要 Lua 脚本来保证解锁的原子性, Redis 在执行 Lua 脚本时,可以以原子性的方式执行。Set 类型可以保证一个用户只能点一个赞,这里举例子一个场景key文章idvalue用户id。哈希表, 如果哈希类型元素个数小于 512 个, 所有值小于 64,会使用压缩列表作为底层数据结构.: 消息保序 处理重复消息 保证消息的可靠性。

redis笔记

基础的数据结构stringlist、hash、set、zset

容器数据结构list、hash、set、zset)通用规则

String

如图:

Stringreids 中最常见的数据类型

内部编码3种:int、raw、embstr
应用场景
缓存对象
常规计数(计算访问次数 点赞 转发 库存数量的场景)

Redis 处理命令是单线程,所以执行命令的过程是原子的。

分布式锁 SETNX

分布式命令:
加锁:

SET lock_key unique_value NX PX 10000 // unique_value客户端生成的唯一标识

解锁(判断锁的 unique_value 是否为加锁客户端 – 是则将 lock_key 键删除):
解锁是有两个操作,这时就需要 Lua 脚本来保证解锁的原子性, Redis 在执行 Lua 脚本时,可以以原子性的方式执行

// 释放锁时,先比较 unique_value 是否相等,避免锁的误释放
if redis.call("get",KEYS[1]) == ARGV[1] then
    return redis.call("del",KEYS[1])
else
    return 0
end
共享Session信息

分布式系统单独存储 Session 流程图:
在这里插入图片描述
借助 Redis 对这些 Session 信息进行统一的存储管理:
在这里插入图片描述

list 简单的字符列表插入顺序排序 可以从头部或尾部向 List 列表添加元素

底层数据结构是由双向链表或压缩列表实现
redis3.2后List 数据类型底层数据结构就只由 quicklist 实现

应用场景
消息队列

需求: 消息保序 处理重复消息 保证消息的可靠性

基于List的消息队列实现
>  LPUSH mq "111000102:stock:99"
  • 保证消息可靠性
    **问题:**如果消费者程序在处理消息的过程出现了故障或宕机,就会导致消息没有处理完成,那么,消费者程序再次启动后,就没法再次从 List 中读取消息了。
    解决: BRPOPLPUSH

问题: List 不支持多个消费者消费同一条消息
List实现消息队列优点:

  • redis存储,不受限于JVM内存上限
  • Redis具有持久化机制,数据安全性有保障

Hash

Key-value 集合, 适合用于存储对象
在这里插入图片描述
数据结构: 哈希表, 如果哈希类型元素个数小于 512 个, 所有值小于 64,会使用压缩列表作为底层数据结构.

应用场景
缓存对象

一般对象用 String + Json 存储,对象中某些频繁变化的属性可以考虑抽出来用 Hash 类型存储。

# 存储一个哈希表uid:1的键值
> HMSET uid:1 name Tom age 15
2
# 存储一个哈希表uid:2的键值
> HMSET uid:2 name Jerry age 13
2
# 获取哈希表用户id为1中所有的键值
> HGETALL uid:1
1) "name"
2) "Tom"
3) "age"
4) "15"
购物车

案例学习

Set

哈希表或整数集合实现

  • 适合用来数据去重和保障数据的唯一性
  • 可以用来统计多个集合的交集、错集和并集等
  • Set 的差集、并集和交集的计算复杂度较高,在数据量较大的情况下,如果直接执行这些计算,会导致 Redis 实例阻塞。
在主从集群中,为了避免主库因为 Set 做聚合计算(交集、差集、并集)时导致主库被阻塞,我们可以选择一个从库完成聚合统计,或者把数据返回客户端,由客户端来完成聚合统计.
点赞

Set 类型可以保证一个用户只能点一个赞,这里举例子一个场景,key 是文章id,value 是用户id。

共同关注
抽奖活动
  • 如果允许重复中奖,可以使用 SRANDMEMBER 命令。
  • 如果不允许重复中奖,可以使用 SPOP 命令。

Zset

压缩列表或跳表

排行榜
电话姓名排序

待补充:

BitMap

HyperLogLog

GEO

Stream

使用场景

消息队列,相比于基于 List 类型实现的消息队列,有这两个特有的特性自动生成全局唯一消息ID,支持以消费组形式消费数据。

Redis 是否适合做消息队列?
  • 如果你的业务场景足够简单,对于数据丢失不敏感,而且消息积压概率比较小的情况下,把 Redis 当作队列是完全可以的。
  • 如果你的业务有海量消息,消息积压的概率比较大,并且不能接受数据丢失,那么还是用专业的消息队列中间件吧。

原文地址:https://blog.csdn.net/yfdddong/article/details/134626015

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_2355.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注