redis 与关系型数据库的对比

本文介绍了一种使用Redis进行键值存储的设计方案,包括如何将关系型数据库中的表转化为Redis中的键值对,并通过示例展示了如何进行高效的查询操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

复制代码
书和书签系统
create table book (
bookid int,
title char(20)
)engine myisam charset utf8;

insert into book values 
(5 , 'PHP圣经'),
(6 , 'ruby实战'),
(7 , 'mysql运维')
(8, 'ruby服务端编程');


create table tags (
tid int,
bookid 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.bookid=t.bookid
where tags.content='PHP' and t.content='WEB';
复制代码
复制代码
换成key-value存储用kv 来存储,

book就是表,5是id,title是字段

6377:0>set book:5:title 'PHP圣经'
6377:0>get book:5:title
"PHP圣经"
set book:6:title 'ruby实战'
set book:7:title 'mysql运难'
set book:8:title ‘ruby server’

sadd tag:PHP 5
sadd 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标签的书
Suion tag:PHP tag:WEB

查:含有ruby,不含WEB标签的书
Sdiff tag:ruby tag:WEB #求差集
复制代码
Redis key 设计技巧
//先根据a分组,再根据b分组,再根据c分组,再根据d分组,d组只有一个值是1

1
2
3
4
5
6
7
8
1: 把表名转换为key前缀 如, tag:
2: 第2段放置用于区分区key的字段--对应mysql中的主键的列名,如userid
3: 第3段放置主键值,如2,3,4...., a , b ,c
4: 第4段,写要存储的列名
 
用户表 user  , 转换为key-value存储
userid    username    passworde   email
9     Lisi         1111111    lisi@163.com
1
2
3
4
5
6
7
8
//先根据user分组,再根据userid分组,再根据9分组,最后根据username分组,这个组只有一个值就是lisi
set  user:userid:9:username lisi
set  user:userid:9:password 111111
set  user:userid:9:email   lisi@163.com
 
set  user:userid:10:username yyy
set  user:userid:10:password 222222
set  user:userid:10:email   yyy@163.com

1
2
3
4
6380:0>get user:userid:9:username
"lisi"
6380:0>get user:userid:9:password
"111111"

  

1
2
3
4
5
6
7
6380:0>keys user:userid:9*    //9号用户有多少字段
1) "user:userid:9:email"
2) "user:userid:9:password"
3) "user:userid:9:username"
 
//查询用户名叫lisi的,redis毕竟不是传统数据库,查起来比较复杂
keys user:userid:*:username lisi
1
2
3
4
5
2 注意:
在关系型数据中,除主键外,还有可能根据其他列来查询,例如根据用户名来查询,没有什么好的方法,只能根据冗余信息来维护。
Set  user:username:lisi:userid  9    //再维护一个用户名对应的userid的信息
6380:0>Get user:username:lisi:userid  
"9"         //根据username查询到userid,然后根据userid找到哪一行

1
2
3
如果还要根据email来查询,那么就要又维护一个冗余的email,查询的时候先根据email找到userid,然后根据userid找到那一行。
Set  user:email:yyy@163.com:userid  10
Set  user:email:lisi@163.com:userid  9

1
这就跟索引一样,如果经常要根据哪个列查询,就要维护一个索引表,这里就是要维护一个指向主键的kv表。以空间换时间。


本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/8287118.html,如需转载请自行联系原作者
<think>好的,我现在需要帮助用户了解Redis作为非关系型数据库的特点用法。首先,我应该回忆一下用户提供的引用内容,特别是引用[1]引用[2],因为这两个引用提到了Redis关系型数据库区别。 首先,用户的问题是关于Redis的特点用法,而引用[1]提到了Spring Data Reactive Redis,说明Redis支持响应式访问,这可能是一个重要的特点。另外,引用[2]解释了关系型数据库的结构,使用SQL进行操作,而Redis作为非关系型数据库,应该有不同的数据模型查询方式。 接下来,我需要整理Redis的主要特点。根据已有的知识,Redis是内存存储的键值数据库,支持多种数据结构,比如字符串、哈希、列表等。同时,它支持持久化、高可用性集群部署。这些特点应该关系型数据库形成对比,比如关系型数据库有固定的表结构,而Redis更灵活。 然后,关于用法,用户可能想知道如何在实际应用中使用Redis。引用[1]提到可以通过Spring Data Reactive Redis进行响应式访问,这可能涉及到Java代码示例。此外,Redis的常见使用场景包括缓存、会话存储、消息队列等,这些都需要详细说明。 需要注意的是,用户提供的引用[3][4]可能此问题关联不大,但还是要确保不遗漏任何相关信息。引用[3]提到了优化求解器,可能Redis的高性能有关,但暂时可能不需要深入。引用[4]是关于Go语言的库,暂时也不相关。 接下来,生成相关问题。根据用户提供的示例,问题应该围绕Redis的特点、使用场景、性能优化、数据结构比较以及其他数据库区别等方面展开。例如,如何选择Redis关系型数据库,或者Redis在分布式系统中的应用。 在回答过程中,要确保使用正确的LaTeX格式,行内公式用$...$,独立公式用$$...$$,但根据用户的问题,可能数学公式较少,但如果有涉及性能指标的地方可能需要用到,比如O(1)时间复杂度。 最后,检查是否符合所有系统级指令,特别是中文回答、引用标注正确,以及生成的相关问题是否合适。确保没有使用任何Markdown格式,代码块用三个反引号包裹,并且引用的标注自然出现在句末。</think>Redis作为非关系型数据库的核心特点体现在其键值存储模型、内存优先架构对多种数据结构的支持。引用[2]中提到的关系型数据库不同,Redis不使用表结构或SQL查询,而是通过简单的键值操作实现高性能数据存取。 ### 一、核心特点 1. **内存存储优先** 数据主要存储在内存中,提供$O(1)$时间复杂度的读写操作,适用于需要亚毫秒级响应的场景。通过RDB快照AOF日志实现持久化[^1]。 2. **数据结构多样性** 支持5种基础数据结构: - 字符串(String):`SET user:1 "Alice"` - 哈希(Hash):`HSET product:100 price 299 stock 50` - 列表(List):`LPUSH news:latest "头条新闻"` - 集合(Set):`SADD tags:article100 tech database` - 有序集合(Sorted Set):`ZADD leaderboard 100 playerA` 3. **原子操作支持** 通过`MULTI/EXEC`实现事务,保证命令序列的原子性执行: ```redis MULTI INCR counter EXPIRE counter 60 EXEC ``` ### 二、典型应用场景 1. **缓存层加速** 将MySQL的热点数据缓存在Redis,降低数据库负载。使用`EXPIRE`设置TTL实现自动过期[^1] 2. **实时排行榜** 利用Sorted Set的`ZRANGE`命令实现实时排名: ```redis ZADD scores 150 "PlayerA" 200 "PlayerB" ZREVRANGE scores 0 9 WITHSCORES ``` 3. **分布式锁** 通过`SETNX`命令实现跨进程锁机制: ```redis SET lock:order_123 true EX 30 NX ``` ### 三、高级特性 1. **发布订阅模式** 支持消息的发布/订阅机制,实现简易消息队列: ```redis PUBLISH news_channel "系统升级通知" SUBSCRIBE news_channel ``` 2. **Lua脚本执行** 通过`EVAL`命令执行原子性脚本: ```lua EVAL "return redis.call('GET', KEYS[1])" 1 mykey ``` 3. **集群支持** 采用分片机制实现水平扩展,支持16384个哈希槽分配,可通过`CLUSTER SLOTS`查看分片信息[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值