分布式--redis基本数据结构及使用

2023-11-16

redis常用5种数据结构

比较常用的5种数据结构

字符串常用操作

//查看帮助 
help @string
set key value //存入字符串键值对
get key          //获取对应key的值
mset key value[key1 var2 key2 var2] //批量存储
mget key key1 key2 //批量获取对应的值
setnx key value  //存入一个不存在的字符串键值对 已存在则不保存 不存在新增
del key [key1 key2] //删除一个或多个键
expire key seconds  //设置一个建的过期时间

//原子加减
incr key  //将key中存储的数值加1 只能对数值型操作 不存在这个键则默认算0开始,加完之后就是1
decr key //将key中存储的数值减1 只能对数值型操作 不存在这个键则默认算0开始,加完之后就是-1
incrby key increment  //将key中存储的数值增加 increment(指定数值)
decrby key decrement  //将key中存储的数值减去 increment(指定数值)

字符串使用场景

(1)单值缓存(session共享等)
set key value
get key
(2)对象缓存
//比如说对一个对象操作比较频繁的时候
//就可以用这个方式,不需要频繁将对象转json存到redis中在将对象从redis中拿出来在转json操作
mset obj:id:name  xxx  obj:id:age yy  //[obj:id:name]只是key的别名,规范看个人
mget obj:id:name obj:id:age  //xxx yy 可以批量获取也可以单个获取,可以同时修改也可以局部修改
(3)简单的分布式锁
setnx product:10001 true //返回1表示获取成功
setnx product:10001 true //返回0表示获取成功
....执行业务逻辑
del product:10001 //释放锁
//仅仅只是简单思路,分布式锁实现比这个复杂多了
set product:10001 true ex 10 nx //防止程序以外中止导致死锁
(4)计数器
类似阅读量需要累加计数使用的
incr article:readcount:{文章id}  //点一下新增一
get article:readcount:{文章id} //获取这篇文章阅读量
(5)全局唯一序列号
incrby orderid 1000 
//一次性新增1000的值,可以将这个值存在服务器内存中,本地获取,
//多台服务器类似操作,自己机器值用完再去获取,可以提高redis性能,
//不适应需要递增序列号的使用

hash结构常用操作

//查看帮助 
help @hash
hset key field value //存储一个哈希表key的键值  可以简单看成key key value的结构
hget key field //获取哈希表key对应的field值
hmset key field value [field1 value1 field2 value1]   //在一个哈希表key中存多个键值
hmget key field [field1 field2]  //获取哈希表key中存在的多个field的值
hsetnx key field value //存储一个不存在哈希表的key键值
hdel key field [field1 field2] //删除对应的哈希表key中指定的field值
hlen key //返回哈希表中key对应的field的数量
hgetall key //返回哈希表中key对应的所有键值
hincrby key field increment //往哈希表中key对应的field的值增加指定的increment

hash结构的使用场景

(1)对象缓存
//表示在key为user的哈希表中存在一个或多个指定用户id的用户基础数据
hmset user {userId}:name 张三 {userId}:age  18 [field1 value1 field2 value2] 
hmset user 1:name 李四  1:age18   2:name 老王  2:age  20
//获取一个或多个指定key中的某个field字段值
hmget user {userId}:name {userId}:age
(2)购物车
//设计以用户id作为key 商品id为field 商品数量为value
//购物车操作
(1) 添加商品 hmset cart:1001 product:10001 1 //用户id为1001的用户添加了一个商品id为10001的商品
(2) 增加数量 hincrby cart:1001 product:10001 1 //给这个商品多添加一个商品(原子操作)
(3) 商品总数 hlen cart:1001 //获取这个id为1001用户所有的商品数量
(4) 删除商品 hdel cart:1001 product:10001  //删除购物车中,指定的10001这个商品
(5) 获取购物车所有的商品 hgetall cart:1001 //获取购物车所有商品
hash结构的优缺点
优点
(1) 同类数据,归类整合存储,方便数据管理,可以针对性的对field执行操作
(2) 相比spring存储更加节省空间
(3) 相比spring操作使用消耗内存与cpu更少
缺点
(1) 过期功能不能争对key中的field使用,存在局限性
(2) 集群环境不适合大规模使用,因为redis的数据是在集群中是分机器保存的,
如果一个使用很频繁的key存在某个机器中会加大这个机器的负担
官方也不推荐bigkey(大key)

在这里插入图片描述

上面是个集群架构图

List结构常用操作

//查看帮助 
help @list
LPUSH key value[value1 value2 ..]  //往指定key的list的左侧存放元素
RPUSH key value [value1 value2 ..]  //往指定key的list的右侧存放元素
LPOP key  //移除并返回list的左侧第一个元素
RPOP key //移除并返回list的右侧第一个元素
LRANGE key start stop //返回list列表在start与stop区间的元素,0开始
//可以看成将一个或多个集合组合而成的一个集合 从头部获取移除并获取第一个值
//如果没用值则阻塞在这里,等待timeout超时返回
BLPOP key [key1 key2 ...] timeout 
BRPOP key [key1 key2 ...] timeout //同理

List结构应用场景

(1) 可建造常用数据结构
Stack(栈) =  LPUSH + LPOP //先进后出
Queue(队列) = LPUSH + RPOP //先进先出
Blocking MQ(阻塞队列) = LPUSH + BRPOP //无数据超时阻塞
(2) 订阅消息
//比如我关注了某人
//某人发了一条消息id为10008的消息
LPUSH msg:{userId} 10008 //userId作为我的身份id,10008是消息的id
//其他人也关注了同时也收到消息
LPUSH msg:1002 10008 
//查看某人最新的5条消息
LRANGE msg:1002 0 4

Set结构常用操作(不重复)

set基本使用
//查看帮助 
help @set
//往集合key中存放元素,元素存在则忽略,key不存则新增
SADD key member [member1 member2 ..] 
//删除key中指定的元素
SREM key member [member1 member2 ..] 
//获取集合key中所有元素
SMEMBERS key
//获取集合key中所有元素个数
SCARD key
//判断key中是否存在元素member
SISMEMBER key member
//从集合key中取出count个元素,不做删除(随机)
SRANDMEMBER key count
//从集合key中取出count个元素,将取出的元素从集合中删除(随机)
SPOP key count
set集合运算
//交集运算,把key,key1,key2计算返回交集集合
SINTER key [key1 key2]
//将key key1 key2集合交集运算的结果数据合并到distination集合中
SINTERSTORE destination key [key1 key2 ...]
//并集运算,计算key key1 key2 计算返回并集集合
SUNION key [key1 key2 ..]
//将key key1 key2集合并集运算的结果数据合并到distination集合中
SUNIONSTORE destination   key [key1 key2 ...]
//差集运算,计算key key1 key2 计算返回差集集合
SDIFF key [key1 key2 ..]
//将key key1 key2集合差集运算的结果数据合并到distination集合中
SDIFFSTORE  destination   key [key1 key2 ...]

set结构应用场景

(1)抽奖
//将需要抽奖的用户放入集合中
SADD key {userId,userId2}
//查看参与抽奖的所有用户
SMEMBERS key
//抽取count名中奖者,移除集合/不移除集合
SRANDMEMBER key [count] /SPOP key [count]
(2) 点赞等
//点赞
SADD {消息id} {用户id}
//取消点赞
SREM {消息id} {用户id}
//检查用户是否点过赞
SISMEMBER {消息id} {用户id}
//获取用户点赞列表
SMEMBERS {消息id}
//获取点赞用户数
SCARD {消息id}
(3)社交模型(通过set的交集并集差集来设计)
SADD ASET {B C D} //A 关注了 B C D
SADD BSET {A D F} //B 关注了 A D F
SADD CSET [B D E F G H]  //C关注了 B D E F G H
//A和B共同关注了
SINTER ASET BSET ⇒ D
//这个时候A进到C的主页,C列表那边需要体现一个A关注的人也关注了他,并且展示出来
SISMEMBER BSET C //A关注了C,所以在B的集合中判断是否存在C就可以知道A关注的B是否也关注了C,结果是B并没有关注C
SISMEMBER DSET C //同理
//A可能认识的人 在C的主页中(差集计算)
SDIFF CSET ASET ==> {C E F G H}
(4) 商品的筛选(同理,使用交集计算)
SADD 手机品牌 华为 小米 三星 苹果
SADD 国产 华为 小米
SADD 内存8g 华为 小米 三星
SADD 内存4g 华为 小米 三星 pingg
//筛选内存8g的国产手机
SINTER 内存8g 国产 ==> 华为 三星

ZSET结构常用操作(不重复,有序)

ZSET 常用操作
//查看帮助 
help @sorted_set
 ZADD key score member [score member ...]  //往有序集合key中带入加分值的元素
 ZREM key member [member ...] //从已排序的集合中移除一个或多个成员
 ZSCORE key member //获取排序集中与给定member相关的分值
 ZINCRBY key increment member //为有序集合中指定的member加上对应的increment值
 ZCARD key //返回有序集合key的元素个数
 ZRANGE key start stop [WITHSCORES]  //正序获取有序集合key中的指定下标元素[WITHSCORES]表示是否同时查出对应分值
 ZREVRANGE key start stop [WITHSCORES]   //倒序获取有序集合key中的指定下标元素[WITHSCORES]同上
ZSET集合运算
//并集计算(将多个key集合合并未一个新的destination numkeys表示需要合并key的数量)
 ZUNIONSTORE destination numkeys key [key ...] 
//交集计算(将多个key集合合并未一个新的destination numkeys表示需要合并key的数量)
 ZINTERSTORE destination numkeys key [key ...] 

ZSET结构应用场景

排行榜
//点击文章
ZINCRBY hotNews:20201114  1  {文章id} //点击一次指定的文章阅读量加一
//展示当日排行榜前十
ZREVRANGE hotNews:20201114 0 9 WITHSCORES //倒序展示baok点击量最多的十篇文章,包括点击量
//七日搜索榜单计算(将七天集合整合起来)
ZUNIONSTORE hotNews:20201107 - 20201114 7 hotNews:20201107 hotNews:20201108 ... hotNews:20201114
//展示七日排行榜前十
ZREVRANGE hotNews:20201107 - 20201114 0 9 WITHSCORES

Redis客户端命令对应的RedisTemplate中的方法列表:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分布式--redis基本数据结构及使用 的相关文章

  • 有没有办法在 Redis 和关系数据库中使用带有 @RedisHash 的实体?

    我正在使用Spring引导 为了将我的实体保存在关系数据库上 我配置了一个数据源和我的域类 例如 Entity Table schema schema name name tb name public class table name ex
  • 是否可以使用带有 FUSE 文件系统的 Linux VFS 缓存?

    默认情况下 Linux VFS 缓存似乎不适用于 FUSE 文件系统 例如 read 调用似乎被系统地转发到 FUSE 文件系统 我在 FUSE 特定的远程文件系统上工作 我需要一个非常积极的缓存 我需要实现自己的页面缓存吗 或者是否可以为
  • Redis 写入 .ssh/authorized_keys

    当前设置 2 个主服务器 12 个工作服务器 工作人员通过 ssh copy id 连接到主设备 主设备和工作人员正在主设备上的 redis 队列中写入数据 过去一周我遇到的问题是 Redis 正在将数据写入authorized keys
  • 使用 sidekiq 处理两个独立的 Redis 实例?

    下午好 我有两个独立但相关的应用程序 他们都应该有自己的后台队列 阅读 单独的 Sidekiq 和 Redis 进程 然而 我希望偶尔能够将工作推给app2的队列来自app1 从简单的队列 推送的角度来看 如果app1没有现有的 Sidek
  • Docker&Celery - 错误:Pidfile (celerybeat.pid) 已存在

    应用程序包括 姜戈 雷迪斯 芹菜 码头工人 Postgres 在将项目合并到 docker 之前 一切都运行顺利且正常 但是一旦将其移入容器 就开始出现问题 起初它开始得很好 但过了一会儿我确实收到了以下错误 celery beat 1 E
  • 如何从 python 将无穷大传递给 redis?

    我正在使用 redis py 并希望将 inf 和 inf 与 ZRANGEBYSCORE 一起使用 我尝试使用 inf 的字符串和浮点来执行此操作 但它们返回一个空集 我怎样才能做到这一点 EDIT 我尝试执行以下命令 redis Str
  • 仅当尚未设置时才进行原子设置

    仅当尚未在 Redis 中设置时 是否有办法执行原子设置 具体来说 我正在创建一个像 myapp user user email 这样的用户 并且希望 Redis 在 user email 已被占用时返回错误 而不是默默地替换旧值 比如声明
  • 为什么Redis中不建议使用KEYS?

    在Redis中 建议不要使用按键命令 https redis io commands KEYS 为什么会这样呢 是因为它的时间复杂度是 O N 吗 或者是别的什么原因 我做了下面的实验来证明KEYS命令有多么危险 当带有 KEYS 的一个命
  • 如何在节点redis客户端上设置读取超时?

    在 github 上我没有看到读取超时的选项 https github com NodeRedis node redis https github com NodeRedis node redis There s connect timeo
  • 如何统计 Redis 流中未读或已确认的消息?

    使用 Redis 5 0 3 假设我们创建一个名为streamy和一个消费群体consumers XGROUP CREATE streamy consumers MKSTREAM 然后向其中添加一些消息 XADD streamy messa
  • redis-cli 重定向到 127.0.0.1

    我在PC1上启动Redis集群 然后在PC2上连接它 当需要重定向到另一个集群节点时 它会显示Redirected to slot 7785 located at 127 0 0 1 但应该显示Redirected to slot 7785
  • 从redis中检索大数据集

    一台服务器上的应用程序查询另一台服务器上运行的 Redis 查询的结果数据集约为 250kzrangebyscore objects locations inf inf这在应用程序服务器上似乎需要 40 秒 当使用命令执行时redis cl
  • 在 Kubernetes/Openshift 中将客户端-服务器流量保持在同一区域的最佳方法?

    我们运行兼容 Kubernetes OKD 3 11 的本地 私有云集群 其中后端应用程序与用作缓存和 K V 存储的低延迟 Redis 数据库进行通信 新的架构设计将在两个地理上分布的数据中心 区域 之间平均划分工作节点 我们可以假设节点
  • 使用Redis从有限范围内生成唯一ID

    我有一些数据库项目 除了主键之外 还需要项目所属组的唯一索引 我们来调用属性nbr 以及将项目分组在一起并定义唯一范围的属性nbr 我们会打电话group This nbr必须在 1 N 范围内 并且may从外部源导入项目时进行设置 由于所
  • 使用 Redis 命令 incr 和 expire 时的竞争条件

    根据redis文档 http redis io commands incr http redis io commands incr 在段落模式 速率限制器 2 较短的版本代码 value INCR ip IF value 1 THEN EX
  • 有没有办法在 ruby​​ 中重新定义 []=+

    我正在尝试编写一个简单的 DSL 针对 Redis 并且我想自己定义 I have def key val redis zadd name val key end 我想定义 def key val redis zincrby name va
  • 为什么 Redis TimeSeries 不捕获聚合中的最后一个元素?

    我试图了解 Redis 的时间序列规则创建的工作原理 但我很困惑为什么 Redis 会忽略聚合中的最后一项 并想知道这是否是预期的行为 我在中创建了示例代码redis cli为了显示 127 0 0 1 6379 gt FLUSHALL O
  • redis - 使用哈希

    我正在使用 redis 为我的 Web 应用程序实现社交流和通知系统 我是 redis 的新手 我对哈希值及其效率有一些疑问 我读过这篇很棒的文章Instagram 帖子 http instagram engineering tumblr
  • 如何使 Redis 缓存中数据层次结构(树)的部分内容无效

    我有一些产品数据 需要在 Redis 缓存中存储多个版本 数据由 JSON 序列化对象组成 获取普通 基本 数据的过程很昂贵 将其定制为不同版本的过程也很昂贵 因此我想缓存所有版本以尽可能进行优化 数据结构看起来像这样 BaseProduc
  • Redis+Docker+Django - 错误 111 连接被拒绝

    我正在尝试使用 Redis 作为使用 Docker Compose 的 Django 项目的 Celery 代理 我无法弄清楚我到底做错了什么 但尽管控制台日志消息告诉我 Redis 正在运行并接受连接 事实上 当我这样做时 docker

随机推荐

  • 微信公众号html教程,公众号排版简易教程

    微信公众号文章排版流程 1 将文章转换成Markdown格式 2 使用Typora渲染Markdown格式 3 使用印象笔记 生成图表 流程图 时序图等 并转换成图片 4 将Markdown格式转换为Html格式 5 将Html格式内容复制
  • 企业微信开始代开发应用 配置代开发应用回调URL

    用到的php版本是7 4 开发时间 2022 11 2 在做公司的项目时因为企业微信的更新 同一个服务器ip不能在多个企业项目中出现否则就会被判定为第三方服务商 所以新建应用时只能新建代开发应用 在配置回调的时候走了很多坑 在这里梳理一下
  • Dialog DA14585——基本硬件资源配置

    GPIO DA14585共有3中类型的封装 WLCSP34pin QFN40pin QFN48pin 除去专用的RST GND XTAL ANT VBAT脚后 分别有14 25 32个IO口可用 目前最常用的封装类型是QFN40 处理单元
  • ssh key创建本地和git的安全连接 && ssh key的创建与github/gitlab中ssh key的添加

    如未创建ssh key会报该问题 The authenticity of host can t be established Permission denied publickey ssh key的作用 创建本地和gitlab的安全连接 S
  • 从特效入手,深入了解CSS(二):鼠标 hover 特效

    不建议跳跃阅读 这篇文章将从头开始介绍如何实现一个特效 中间偶尔会穿插一些css3或平时接触不多的css属性 首先看一看这一期的特效 HTML部分 h1 Hover Me h1 CSS 部分 首先通过grid布局的place content
  • 一文搞定java8中的重要特性

    文章目录 Lambda表达式 函数式接口 四大内置函数接口 接口的默认方法和静态方法 方法引用 重复注解 更好的类型推断 拓宽注解的应用场景 Optional Stream Date Time API Base64 并行数组 并发性 JVM
  • Windows SDK与Platform SDK的区别

    原文URL http forums microsoft com MSDN ShowPost aspx PostID 1986681 SiteID 1 概述 Windows SDK已经取代了Platform SDK Platform SDK已
  • 使用Yolov5+Pytorch训练自定义目标检测模型

    一 简介 使用Pytorch Yolov5和OpenCV 完成目标检测模型的训练和部署 项目的两个功能 1 Yolov5离线文件夹 主要是为了照顾国内的网络环境 文件夹不仅包含了https github com ultralytics yo
  • 物联网(java版本)臻识摄像头+本地实时显示视频

    部分代码显示 package com xdnnaovideo videoservice listenermessage import com google gson Gson import com xdnnaovideo videoserv
  • stm32毕设分享 stm32老人跌倒检测预防系统

    文章目录 0 前言 1 整体设计 2 硬件电路 3 软件设计 4 跌倒检测算法 5 关键代码 6 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求 这两年不断有学弟学妹
  • 最新版的配音软件--- tts-vue 软件 下载安装成功过程

    目录 本次软件是 Loker 制作 感谢作者的无私奉献 软件视频效果 软件图片效果 1 电脑版的tts vue 软件下载链接以及说明 2 tts vue 网站在线转换链接 3 tts vue 软件 功能简介 截至最新版本 已实现的功能 安装
  • gitlab--基础--5.1--CICD--介绍

    gitlab 基础 5 1 CICD 介绍 1 什么是CICD 1 1 CI 持续集成 Continuous Integration 1 1 1 持续集成 将各个开发人员的工作集合到一个代码仓库中 主要目的是尽早发现集成错误 使团队更加紧密
  • 关于退出进程的几种方式

    创建于 2012 08 27 迁移自个人的百度空间 HUP 是让进程挂起 睡眠 kill 杀掉进程 term 正常的退出进程 kill HUP pid pid 是进程标识 如果想要更改配置而不需停止并重新启动服务 请使用该命令 在对配置文件
  • 深入理解MyBatis一级缓存和二级缓存【超详细源码解析】

    视频地址 https www bilibili com video BV1nP411A7Gu MyBatis的缓存是一个常见的面试题 一级缓存的作用域为何是 sqlSession 二级缓存的作用域为何是 mapper 怎么理解 一 二级缓存
  • Go实现单例模式

    非线程安全的单例模式 type Singleton struct var instance Singleton func GetInstance Singleton if instance nil instance Singleton re
  • 【待续】【UE4笔记】 L10地形编辑器

    一 地形界面 包含了管理 雕刻和描画功能 1 创建新项 2 雕刻 改变地形高度 顶点位置 3 描画 分层地形材质 二 编辑样条 调节参数 添加材质 效果如下
  • 极限多标签学习综述(Extreme Multi-label Learning)

    A Survey on Extreme Multi label Learning 先给地址 https arxiv org abs 2210 03968 博主曾整理过Multi Label Image Classification 多标签图
  • Docker下安装SVN

    1 搜索svn镜像 root VM 0 6 centos docker search svn 2 拉取svn server的docker镜像 root VM 0 6 centos docker pull docker io garethfl
  • Stable Diffusion Webui源码剖析

    1 关键python依赖 1 xformers 优化加速方案 它可以对模型进行适当的优化来加速图片生成并降低显存占用 缺点是输出图像不稳定 有可能比不开Xformers略差 2 GFPGAN 它是腾讯开源的人脸修复算法 利用预先训练号的面部
  • 分布式--redis基本数据结构及使用

    文章目录 redis常用5种数据结构 字符串常用操作 字符串使用场景 1 单值缓存 session共享等 2 对象缓存 3 简单的分布式锁 4 计数器 5 全局唯一序列号 hash结构常用操作 hash结构的使用场景 1 对象缓存 2 购物