Redis 数据结构

news/2024/5/7 20:11:29/文章来源:https://blog.csdn.net/weixin_45080272/article/details/129715632

这里写目录标题

  • Redis 数据结构
    • 一、String类型
        • String数据类型的使用场景
        • key 的设置约定
    • 二、Hash数据类型
        • string存储对象(json)与hash存储对象的区别
    • 三、list 类型
    • 四、set 类型
        • set数据交并差操作
        • set 类型数据操作的注意事项
    • 六、sorted_set 类型

Redis 数据结构

Redis支持以下5种数据类型:

  • string字符串
  • hash哈希
  • list列表
  • set集合
  • zset有序集合

一、String类型

String数据类型的说明:

  • 存储的数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型
  • 存储数据的格式:一个存储空间保存一个数据
  • 存储内容:通常使用字符串,如果字符串以整数的形式展示,可以作为数字操作使用

一次性存储单个数据时:

添加/修改数据 
set key value
获取数据 
get key
删除数据 del key

一次性存储多个数据时:
m是Multiple[ˈmʌltɪpl] ——多重

 添加/修改多个数据 mset key1 value1 key2 value2 …获取多个数据 mget key1 key2 …获取数据字符个数(字符串长度)strlen key追加信息到原始信息后部(如果原始信息存在就追加,否则新建) append key value

数值增减操作:

设置数值数据增加指定范围的值 
incr key  
incrby key increment  
incrbyfloat key increment 
设置数值数据减少指定范围的值 decr key  decrby key increment 
  • string在redis内部存储默认就是一个字符串,当遇到增减类操作incr,decr时会转成数值型进行计算。
  • redis所有的操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发 带来的数据影响。
  • 注意:按数值进行操作的数据,如果原始数据不能转成数值,或超越了redis 数值上限范围,将报错。
    9223372036854775807(java中long型数据最大值,Long.MAX_VALUE)

Tips 1:
redis用于控制数据库表主键id,为数据库表主键提供生成策略,保障数据库表的主键唯一性
此方案适用于所有数据库,且支持数据库集群

数据时效性设置:

设置数据具有指定的生命周期 setex key seconds value  //设置多少秒psetex key milliseconds value //设置多少毫秒

redis 控制数据的生命周期,通过数据是否失效控制业务行为,适用于所有具有时效性限定控制的操作

string 类型数据操作的注意事项

  • 数据操作不成功的反馈与数据正常操作之间的差异
    ① 表示运行结果是否成功

    • (integer) 0 → false 失败
    • (integer) 1 → true 成功

    ② 表示运行结果值

    • (integer) 3 → 3 3个
    • (integer) 1 → 1 1个
  • 数据未获取到

    • (nil)等同于null
  • 数据最大存储量
    512MB

  • 数值计算最大范围(java中的long的最大值)
    9223372036854775807

String数据类型的使用场景

业务场景:
主页高频访问信息显示控制,例如新浪微博大V主页显示粉丝数与微博数量
在这里插入图片描述
解决方案:
第一种存储方式:

  • 在redis中为大V用户设定用户信息,以用户主键和属性值作为key,后台设定定时刷新策略即可
    eg: user: id:3506728370:fans → 12210947
    eg: user: id:3506728370:blogs → 6164
    eg: user: id:3506728370:focuss → 83

第二种存储方式:

  • 在redis中以json格式存储大V用户信息,定时刷新(也可以使用hash类型)
    eg: user: id:3506728370 → {“id”:3506728370,“name”:“春晚”,“fans”:12210862,“blogs”:6164, “focus”:83}

这两种的说明:第一种的话可能对每一个数据来说的话,比较容易进行修改,但是对于第二种的话可能你需要取出来再进行修改

key 的设置约定

数据库中的热点数据key命名惯例
在这里插入图片描述

二、Hash数据类型

  • 新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息
  • 需要的存储结构:一个存储空间保存多个键值对数据
  • hash类型:底层使用哈希表结构实现数据存储

一次性操作一个数据

添加/修改数据 hset key field value获取数据 hget key field hgetall key删除数据 hdel key field1 [field2]

一次性操作多个数据

添加/修改多个数据 
hmset key field1 value1 field2 value2 … 
获取多个数据 
hmget key field1 field2 … 
获取哈希表中字段的数量 hlen key
获取哈希表中是否存在指定的字段 hexists key field

hash 类型数据扩展操作

 获取哈希表中所有的字段名或字段值 hkeys key hvals key设置指定字段的数值数据增加指定范围的值 hincrby key field increment hincrbyfloat key field increment  

string存储对象(json)与hash存储对象的区别

三、list 类型

  • 数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分
  • 需要的存储结构:一个存储空间保存多个数据,且通过数据可以体现进入顺序
  • list类型:保存多个数据,底层使用双向链表存储结构实现

list 类型数据基本操作

添加/修改数据 lpush key value1 [value2] ……//l-left左边进rpush key value1 [value2] ……//r-right右边进
获取数据 
lrange key start stop //lrange list1 0 2 (02表示的是索引,获取下标0到2的值 -1负数的话是从后往前读)
lindex key index 
llen key
获取并移除数据 lpop keyrpop key

list 类型数据扩展操作

 规定时间内获取并移除数据 blpop list1 1010秒内有数据直接拿,没有的话就等10秒blpop key1 [key2] timeout brpop key1 [key2] timeout brpoplpush source destination timeout  

移除指定数据

lrem key count value 

list 类型数据操作注意事项

  • list中保存的数据都是string类型的,数据总容量是有限的,最多232 - 1 个元素 (4294967295)。
  • list具有索引的概念,但是操作数据时通常以队列的形式进行入队出队操作,或以栈的形式进行入栈出栈操作
  • 获取全部数据操作结束索引设置为-1
  • list可以对数据进行分页操作,通常第一页的信息来自于list,第2页及更多的信息通过数据库的形式加载

四、set 类型

  • 新的存储需求:存储大量的数据,在查询方面提供更高的效率
  • 需要的存储结构:能够保存大量的数据,高效的内部存储机制,便于查询
  • set类型:与hash存储结构完全相同,仅存储键,不存储值(nil),并且值是不允许重复的
    在这里插入图片描述
    set 类型数据的基本操作
 添加数据 sadd key member1 [member2]
获取全部数据 
smembers key 
删除数据 srem key member1 [member2] 
获取集合数据总量 scard key 
判断集合中是否包含指定数据  
sismember key member 

set 类型数据的扩展操作

业务场景
每位用户首次使用今日头条时会设置3项爱好的内容,但是后期为了增加用户的活跃度、兴趣点,必须让用户 对其他信息类别逐渐产生兴趣,增加客户留存度,如何实现?

业务分析

  • 系统分析出各个分类的最新或最热点信息条目并组织成set集合
  • 随机挑选其中部分信息
  • 配合用户关注信息分类中的热点信息组织成展示的全信息集合
随机获取集合中指定数量的数据 
srandmember key [count] 
随机获取集合中的某个数据并将该数据移出集合 
spop key [count] 

Tips 8: redis 应用于随机推荐类信息检索,例如热点歌单推荐,热点新闻推荐,热卖旅游线路,应用APP推荐, 大V推荐等

set数据交并差操作

共同好友

求两个集合的交、并、差集 
sinter key1 [key2]  //交
sunion key1 [key2]  //并
sdiff key1 [key2] 	//差
求两个集合的交、并、差集并存储到指定集合中 
sinterstore destination key1 [key2]  
sunionstore destination key1 [key2]  
sdiffstore destination key1 [key2] 
将指定数据从原始集合中移动到目标集合中 
smove source destination member 
  • redis 应用于同类信息的关联搜索,二度关联搜索,深度关联搜索
  • 显示共同关注(一度)
  • 显示共同好友(一度)
  • 由用户A出发,获取到好友用户B的好友信息列表(一度)
  • 由用户A出发,获取到好友用户B的购物清单列表(二度)
  • 由用户A出发,获取到好友用户B的游戏充值列表(二度)

set 类型数据操作的注意事项

  • set 类型不允许数据重复,如果添加的数据在 set 中已经存在,将只保留一份
  • set 虽然与hash的存储结构相同,但是无法启用hash中存储值的空间

六、sorted_set 类型

  • 新的存储需求:数据排序有利于数据的有效展示,需要提供一种可以根据自身特征进行排序的方式
  • 需要的存储结构:新的存储模型,可以保存可排序的数据
  • sorted_set类型:在set的存储结构基础上添加可排序字段

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_274765.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法----火柴拼正方形

题目 你将得到一个整数数组 matchsticks ,其中 matchsticks[i] 是第 i 个火柴棒的长度。你要用 所有的火柴棍 拼成一个正方形。你 不能折断 任何一根火柴棒,但你可以把它们连在一起,而且每根火柴棒必须 使用一次 。 如果你能使这个正方形&a…

Junit单元测试框架

1)Junit是一个开源的JAVA语言的单元测试框架,也是JAVA方向使用最广泛的单元测试框架,使用JAVA开发者都应该学习junit框架,并且掌握单元测试的编写 2)selenium和Junit都可以被导入到maven项目里面 3)先进行创建maven项目,导入相关依…

linux 全局环境变量删除后 还有 仍然存在

linux 全局环境变量删除后 还有 仍然存在1、编辑 /etc/profile2、设置REDISCLI_AUTH后,redis-cli 进去redis后不需要再次认证2、删除全局环境后 source后 仍然存在3、unset释放全局环境变量4、总结1、编辑 /etc/profile 设置redis环境变量 在末尾加入一行 export R…

家电企业数字工厂系统解决方案

国内小型家电生产商的中小企业普遍使用传统的手工作业模式,依靠大量的人力,线下管理各种数据,如:纸质文档、excel制作等,信息化程度非常低,严重限制着企业生产效率的提升和生产规模的扩大。对传统制造企业来…

基于WEB的网上购物系统的设计与实现(附:源码 论文 sql文件)

摘 要 随着计算机网络技术的飞速发展和人们生活节奏的不断加快,电子商务技术已经逐渐融入了人们的日常生活当中,网上商城作为电子商务最普遍的一种形式,已被大众逐渐接受。因此开发一个网上商城系统,适合当今形势,更加…

AWS白皮书 – 成本优化

本文讲解AWS良好架构框架(AWS Well-Architected Framework)里其中五大支柱之一:成本优化(Cost Optimization)。 一套成本优化型系统应充分利用全部资源、以最低价格来实现业务成果,同时充分满足你的功能需…

Google Bard VS ChatGPT:哪个是更好的AI聊天机器人?

文章目录前言一、Bard和ChatGPT的宏观对比二、应用场景不同三、知识的时效性四、未来的归宿总结前言 自从 OpenAI 向公众发布ChatGPT以来的过去几个月里,我们都见证了围绕 ChatGPT 的各种测评,并为它带来的效果感到惊艳。 昨晚Google开放了自家研发的A…

SpringBoot的简介和使用

文章目录1. SpringBoot简介和概述2. SpringBoot的使用3.SpringBoot 项目打包及运行4.切换web服务器1. SpringBoot简介和概述 Spring Boot是由Pivotal团队提供的一套开源框架,可以简化spring应用的创建及部署。它提供了丰富的Spring模块化支持,可以帮助开…

JUC并发编程共享模型之不可变(五)

5.1 问题引出 public interface Account {// 获取余额Integer getBalance();void withdraw(Integer amount);/*** 方法内会启动1000个线程&#xff0c;每个线程做-10元的操作* 如果初始余额为 10000 那么正确的结果应当是0*/static void demo(Account account){List<Thread…

整数拼接(思维枚举,两变量满足某条件-->通过其中一变量根据条件推断另一变量

2068.整数拼接&#xff08;思维&#xff0c;枚举&#xff09; 输入样例&#xff1a; 4 2 1 2 3 4输出样例&#xff1a; 6大佬思路 很多需要双重循环两个值&#xff0c;暴力判断组合在一起是否满足某个条件(比如等式是否成立)&#xff0c; 其实可以换个角度&#xff0c;遍历…

WPF中阴影效果和模糊效果的使用

总目录 文章目录总目录前言一、DropShadowEffect1、DropShadowEffect各属性效果图2、实现代码二、BlurEffect1、BlurEffect各属性效果图2、实现代码3、进阶使用结语前言 WPF中的控件效果主要通过Effect来实现&#xff0c;而Effect有DropShadowEffect&#xff08;投影效果&…

【并发】详解redis的incr、decr命令

一、前言 redis是一个单线程的服务&#xff0c;那么所有的命令肯定会排队被redis执行&#xff0c;redis提供的命令都是原子性的&#xff0c;百度搜索incr\decr就是说将对应的key1&#xff0c;key-1的值重新set到redis中&#xff0c;而且很多都是认为incr\decr原子性的&#xf…

chatgpt优化使用手册

提问方式的优化 我们在首次使用chatgpt的时候&#xff0c;当我们问它一些问题的时候&#xff0c;我们会发现它的有些回答广泛且空洞&#xff0c;不够专业&#xff0c;但是chatgpt是能实现角色的扮演和切换的&#xff0c;所以我们在提问它时需要先给它输入一些剧本&#xff0c;…

激活函数σ、tanh、relu、Leakyrelu

激活函数1- SIgmoid1-1 sigmoid导数2- tanh2-1 tanh函数导数3- ReLU4- LeakyReLu5- LR 公式推导Sigmoid、tanh、ReLU、LeakyReLu1- SIgmoid sigmoid 函数将元素的值映射到0和1之间 sigmoid(x)11exp(−x)sigmoid(x)\frac{1}{1exp(-x)}sigmoid(x)1exp(−x)1​ import torch imp…

leetcode 2492. Minimum Score of a Path Between Two Cities(两个城市间路径的最小score)

定义roads数组&#xff0c;每个元素长度为3&#xff0c;具体为[from, to, 该条road的distance], 其中road是双向的&#xff08;也就是无向图&#xff09;&#xff0c;可以走多次&#xff08;走不通可以折回来&#xff09;&#xff0c; 需要找的是城市1到城市n的路径中&#xff…

测试用例的价值与体系(软件测试入门)

1.测试用例概念&#xff1a; 测试用例(Test Case)是为特定的目的而设计的一组测试输入、执行条件和预期的结果的文档通过大量的测试用例来检验软件的运行效果它是指导测试工作进行的依据2.测试用例价值 指导测试的实施规划测试数据的准备编写测试脚本的"设计规格说明书…

记一次 rr 和硬件断点解决内存踩踏问题

在日常的调试过程中&#xff0c;我们总会遇到一些有趣的 bug&#xff0c;在本文我就遇到了一个有意思的查询结果不一致问题。 故事的开始 我们在测试 NebulaGraph 的 MATCH 语句的时候发现一个很神奇的事情&#xff1a; (rootnebula) [gdlancer]> match (v1)-[e*1..1]-&g…

【分布式-4】zookeeper

一&#xff1a;基本概念 角色&#xff1a; Leader&#xff1a;提供读写follower&#xff1a;提供读操作&#xff0c;参与Leader选举和过半写成功策略。observer&#xff1a; 只提供读&#xff0c;通常情况下&#xff0c;通过client端连接zk集群性能都不错&#xff0c;但是如果…

旅行商问题的粒子群优化

英文标题&#xff1a;Optimization of Particle Swarms for Travelling Salesman Problem摘要&#xff1a;旅行推销员问题是原子种群优化在本研究中的一个应用。我们已经开发了几种新的技术&#xff0c;旨在用粒子群算法解决TSP问题。此外&#xff0c;我们引入了交换操作和交换…

【k8s】k8s部署mariadb数据库

文章目录前言&#xff1a;一、构建mariadb的dockerfile二、docker build打包并上传到harbor仓库三、编写yaml文件四、使用kubectl apply部署到K8s总结前言&#xff1a; MariaDB数据库管理系统是MySQL的一个分支&#xff0c;主要由开源社区在维护&#xff0c;采用GPL授权许可 M…