redis:key设计原则

2023-11-17

redis与关系型数据库的适合场景

场景:书有标签,一本书可能有多个标签。一个标签可能对应多本书。

如果是关系型数据库来存储:

create table book(
	id int,
	title char(20)
)engine myisam charset utf8;

insert into book values(5,'PHP经典'),(6,'Ruby实战'),(7,'MySQL基础'),(8,'Ruby服务端编程');
create table tags(
	id int,
	book_id int,
	content char(20)
)engine myisam charset utf8;

insert into tags values(10,5,'php'),(11,5,'web'),(12,6,'web'),(13,6,'ruby'),(14,7,'database'),(15,8,'ruby'),(16,8,'server');

查询既有web标签又有php标签的书:

select * from tags inner join tags as t on tags.id=t1.id
where tags.content='php' and t.content='web';

如果是要查询 既有web标签又有php标签,同时还有database标签的书,你就要三表联查。
如果数据量大了,比如上百万本书,这样的查询就太消耗性能了。(没发玩了)

换思路:用key-value存储

set book-5-title 'PHP经典'	
set book-6-title 'Ruby实战'
set book-7-title 'MySQL基础'

使用redis的set集合类型存储书的标签:

sadd tag-php 5			#tag-php标签对应的 5号书
sadd tag-web 5 6		#tag-web标签对应的 5号和6号书
sadd tag-database 7
sadd tag-ruby 6 8
sadd tag-server 8

查:
既有php标签又有web标签的书

sinter tag-php tag-web	#集合的交集

php标签web标签的书

sunion tag-php tag-web	#并集

含有ruby标签但不含web标签的书

sdiff tag-ruby tag-web	#求差集

Redis key设计技巧

1、把表名转换为key前缀,如tag:
2、把第二段放置用于区分key的字段,对应msyql中主键的列名,如user_id
3、第三段放置主键值,如2,3,4
4、第四段写存储的列名

用户表uesr,转换为key-value存储
user_id		user_name	email
9			lily		lily@qq.com
set user:user_id:9:user_name lily
set user:user_id:9:email	lily@qq.com
#查询这个用户
keys user:user_id:9*

注意:
在关系型数据中,除主键外,还有可能其他列也会参与查询。
如上表中,user_name也是很频繁查询的,往往这种列也是加了索引的。

转换到key-value数据中,则也要相应的生成一条按照该列为主的key-value

set user_name:lily:user_id 9

这样我们可以根据user_name:lily:user_id查询出user_id为9,再查user_id:9:email
完成了根据用户名查询用户信息。

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

redis:key设计原则 的相关文章

  • 如何在多线程应用程序中使用 StackExchange.Redis IDatabase 对象?

    我从 StackExchange Redis 文档中收到有关如何使用 IDatabase 的混合消息 在里面基本使用文档 https github com StackExchange StackExchange Redis blob mas
  • Redis多插入问题

    我尝试多次插入 但它给了我错误 http pastie org 7337421 http pastie org 7337421 cat mass insert txt 3 r n 3 r nSET r n 3 r nkey r n 5 r
  • Redis 写入 .ssh/authorized_keys

    当前设置 2 个主服务器 12 个工作服务器 工作人员通过 ssh copy id 连接到主设备 主设备和工作人员正在主设备上的 redis 队列中写入数据 过去一周我遇到的问题是 Redis 正在将数据写入authorized keys
  • 如何清理redis中不活跃的玩家?

    我正在制作一个使用 redis 来存储游戏状态的游戏 它可以很好地跟踪位置和玩家 但我没有一个好的方法来清理不活跃的玩家 每当玩家移动时 这是一个半慢速移动游戏 想想每秒 1 5 帧 我就会用新位置更新哈希并删除旧位置键 跟踪活跃玩家的最佳
  • Docker&Celery - 错误:Pidfile (celerybeat.pid) 已存在

    应用程序包括 姜戈 雷迪斯 芹菜 码头工人 Postgres 在将项目合并到 docker 之前 一切都运行顺利且正常 但是一旦将其移入容器 就开始出现问题 起初它开始得很好 但过了一会儿我确实收到了以下错误 celery beat 1 E
  • connect-redis - 如何保护会话对象免受竞争条件影响

    我使用 nodejs 和 connect redis 来存储会话数据 我将用户数据保存在会话中 并在会话生命周期中使用它 我注意到两个更改会话数据的请求之间可能存在竞争条件 我尝试过使用 redis lock 来锁定会话 但这对我来说有点问
  • 保护节点 Redis

    我正在尝试保护 Node Redis IPC 服务器以使用私钥 公钥 我已经关注了本教程 http bencane com 2014 02 18 sending redis traffic through an ssl tunnel wit
  • Redis 块推送直到列表有空位

    我正在寻找类似的东西BLPUSH该命令将阻塞 直到列表的长度低于指定值max size 目的是防止生产者运行速度快于消费者时列表无限增长 功能与 python 非常相似Queue put https docs python org 3 li
  • 使用 AWS ElastiCache 请求中的 Airflow CROSSSLOT 密钥未散列到同一插槽错误

    我在 AWS ECS 上运行 apache airflow 1 8 1 并且有一个 AWS ElastiCache 集群 redis 3 2 4 运行 2 个分片 2 个启用多可用区的节点 集群 Redis 引擎 我已经验证气流可以毫无问题
  • 我的 Redis 自动生成的密钥

    我不知道我的 Redis 版本 4 0 9 到底发生了什么 我正在运行一个应用程序并使用 Redis 来存储我的数据库 但是 然后 Redis 自动创建 3 个新键 Backup1 Backup2 Backup3 并删除我的所有数据 这是我
  • 仅当尚未设置时才进行原子设置

    仅当尚未在 Redis 中设置时 是否有办法执行原子设置 具体来说 我正在创建一个像 myapp user user email 这样的用户 并且希望 Redis 在 user email 已被占用时返回错误 而不是默默地替换旧值 比如声明
  • 如何在节点redis客户端上设置读取超时?

    在 github 上我没有看到读取超时的选项 https github com NodeRedis node redis https github com NodeRedis node redis There s connect timeo
  • 如果另一个键中的计数器低于零,则从集合中原子删除一个项目?

    雷迪斯2 0 3 在我的 Redis DB 中 我有一组项目 每个项目都有一个与其关联的计数器 MULTI SADD items set foo INCRBY items foo 10000 EXEC 新项目会以随机间隔添加到集合中 当用户
  • Spring Data Redis - Lettuce连接池设置

    尝试在 spring data redis 环境中设置 Lettuce 连接池 下面是代码 Bean LettuceConnectionFactory redisConnectionFactory GenericObjectPoolConf
  • 使用 Redis 命令 incr 和 expire 时的竞争条件

    根据redis文档 http redis io commands incr http redis io commands incr 在段落模式 速率限制器 2 较短的版本代码 value INCR ip IF value 1 THEN EX
  • Redis Docker compose无法处理RDB格式版本10

    我无法在 docker compose 文件中启动 redis 容器 我知道docker compose文件没问题 因为我的同事可以成功启动项目 我读到有一个删除 dump rdb 文件的解决方案 但我找不到它 我使用Windows机器 任
  • 如何设置和获取Redis中存储的对象?

    我试图在 redis 中存储一个对象 当我获取该对象时 它似乎不起作用 I tried u User new u name blankman redis set test u x redis get test x name error 我想
  • Java 将字节转换为二进制安全字符串

    我有一些以字节为单位的数据 我想将它们放入Redis中 但是Redis只接受二进制安全字符串 而我的数据有一些二进制非安全字节 那么如何将这些字节转换为二进制安全字符串以便将它们保存到 Redis 中呢 Base64 对我有用 但它使数据更
  • 如何使redis中的“HSET”子键“过期”?

    我需要使 Redis 哈希中所有超过 1 个月的密钥过期 这不可能 https github com antirez redis issues 167 issuecomment 2559040 为了保持 Redis 简单 https git
  • 在 Redis 上为 Django 和 Express.js 应用程序共享会话存储

    我想创建一个包含一些登录用户的 Django 应用程序 另一方面 由于我想要一些实时功能 所以我想使用 Express js 应用程序 现在的问题是 我不希望身份不明的用户访问 Express js 应用程序的日期 因此 我必须在 Expr

随机推荐

  • 迪杰斯特拉算法求图的某个顶点到其他顶点的最短路径问题

    迪杰斯特拉算法 使用图的广度优先遍历算法 比如先从G点出发 找到能与G直接连接的顶点 然后才从与G最近的A出发 找到与A相邻的节点 通过比较G到每个顶点的距离大小 筛选出到每个点的最短路径 代码 迪杰斯特拉算法球最短路径问题 public
  • hdu 3966 Aragorn's Story

    Problem acm hdu edu cn showproblem php pid 3966 Reference 树链剖分 树链剖分原理 树链剖分详解及模板 HDU3966 树链剖分 Meaning 一棵 n 个点的树 每给结点有个值 三
  • BERT、BART、T5 等法学硕士的比较分析

    探索语言模型 介绍 在这篇博文中 我将讨论 BERT BART 和 T5 等大型语言模型 到 2020 年 法学硕士领域取得的重大进展包括这些模型的开发 BERT和T5是Google开发的 BART是Meta开发的 我将根据这些型号的发布日
  • css实现水平居中

    代码示例 div class box div class box1 div div 1 弹性布局 推荐 display flex 这些要添加在父级的 是父级的属性 父级添加display flex 父级添加justify content c
  • Zookeeper 基本操作

    Zookeeper 基本操作 文章目录 Zookeeper 基本操作 1 查看zk的运行状态 2 客户端连接zk 3 ls 查看 4 get 获取节点数据和更新信息 5 stat 获得节点的更新信息 6 ls2 ls命令和stat命令的整合
  • java localdate mysql_如何使用JDBC从java.sql.Date获取LocalDateTime对象?

    Java8的java time包提供了一个名为LocalDateTime的类 用于获取本地日期和时间的当前值 除日期和时间值外 还可以使用此字段来获取其他日期和时间字段 例如 一年中的某天 一周中的某天和一年中的某周 将java sql D
  • DIY简单的RTOS(一)

    说明 在看了很多关于RTOS的文章 一直想做一个简单的RTOS 苦于现有资料非常少 在看了很多关于现有RTOS的底层实现 再结合相关文章 完成一个简单的RTOS demo 代码难免有不合理之处 仅当个人学习做笔记使用 项目代码 什么是RTO
  • opencv图像的基础操作

    读取图像 cv imread 参数 要读取的图像 读取 式的标志 cv IMREAD COLOR 以彩 模式加载图像 任何图像的透明度都将被忽略 这是默认参数 cv IMREAD GRAYSCALE 以灰度模式加载图像 cv IMREAD
  • osgEarth的Rex引擎原理分析(五十一)osg::Program与osgEarth::VirtualProgram的关系

    目标 四十五 中的问题113 osgEarth VirtualProgram在apply时用到了osg Program 也就是VirtualProgram最终是要通过osg Program实现着色器功能 只不过VirtualProgram中
  • AI工具究竟是帮手还是对手?你怎么看,一起来聊聊吧!

    AI工具究竟是帮手还是对手 你怎么看 一起来聊聊吧 1 你现在正在哪个领域学习或工作呢 你用过哪些AI智能工具 2 作为行业人士或正在学习的学生 你认为AI工具的出现会提升你的工作或学习效率吗 3 对于AI智能工具的出现 我们应该做好哪些准
  • 51单片机(十四)—— 中断功能介绍

    中断是单片机的一个重要功能 本文我们就对51单片机的中断进行介绍 所谓 中断 通俗一点讲 就是单片机停止正在执行的任务 转去执行其它的急需解决的任务 当这个任务完成之后 在回到原来的任务继续执行 中断就是为了使单片机能够对外部或内部随机发生
  • Angular 2 ngForm中的ngModel、[ngModel]和[(ngModel)]

    对呀对呀 回字有四样写法 你知道么 当时鲁大大如此讽刺孔乙己 意味着老孔这个被科举制毒害的人注意此种无用之物实在可悲 但是在Angular 2的世界中 很少存在无用之物 ngModel有三种写法 你知道吗 表单的设计永远都是应用的重头戏 而
  • HmacMd5加密算法

    package com haiyisoft evportal token action import java security MessageDigest import java security NoSuchAlgorithmExcep
  • java通配符有哪些

    java通配符有哪些 1 通配符 代表未知类型 代表不关心或无法确定实际操作的类型 一般与容器类配合使用 JavaScript public void testV List
  • ax = fig.gca(projection=‘3d‘)报错的解决方法

    最近在学习tensorflow 其中有使用matplotlib画一个3d图像的练习 跑代码时遇到以下问题 TypeError FigureBase gca got an unexpected keyword argument project
  • Java eclipse 错误:For input string

    1 错误描述 For input string 类路径 2 什么意思 参考资料可知 For input string 表示数据类型转换错误 当一个数据类型使用 toString 方法进行转换成字符串时 转换失败就会报这个错误 3 排除错误
  • 错误 无法使用未定义类型“Ui::MainWidow“

    一 问题分析 在Qt Creator中创建Qt项目时 Creator会自动给你声明一个命名空间Ui namespace Ui class MainWindow 这是命名空间Ui里的一个类 类名是MainWindow 和你声明的MainWin
  • 安卓4.4手机运行崩溃,类无法找到,实际却是存在

    java lang RuntimeException Unable to get provider com SdkFileProvider java lang ClassNotFoundException Didn t find class
  • oracle-- 数据更新操作和事务操作

    一 sql语言操作分类 需要背 面试需要 1 数据定义语言DDL DATA DEFINE LANAGUAGE 定义 操作数据的结构 gt java的变量定义 CREATE 在数据库中创建新的数据对象 ALTER 修改数据库中对象的数据结构
  • redis:key设计原则

    redis与关系型数据库的适合场景 场景 书有标签 一本书可能有多个标签 一个标签可能对应多本书 如果是关系型数据库来存储 create table book id int title char 20 engine myisam chars