问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

redis数据库有哪些特点?

发布网友 发布时间:2022-04-20 04:55

我来回答

4个回答

懂视网 时间:2022-04-07 20:44

用户登录系统

记录用户登录信息的一个系统, 我们简化业务后只留下一张表。

关系型数据库的设计

mysql> select * from login;
+---------+----------------+-------------+---------------------+
| user_id | name           | login_times | last_login_time     |
+---------+----------------+-------------+---------------------+
|       1 | ken thompson   |           5 | 2011-01-01 00:00:00 |
|       2 | dennis ritchie |           1 | 2011-02-01 00:00:00 |
|       3 | Joe Armstrong  |           2 | 2011-03-01 00:00:00 |
+---------+----------------+-------------+---------------------+

user_id表的主键,name表示用户名,login_times表示该用户的登录次数,每次用户登录后,login_times会自增,而last_login_time更新为当前时间。

REDIS的设计

关系型数据转化为KV数据库,我的方法如下:

key 表名:主键值:列名

value 列值

一般使用冒号做分割符,这是不成文的规矩。比如在php-admin for redis系统里,就是默认以冒号分割,于是user:1 user:2等key会分成一组。于是以上的关系数据转化成kv数据后记录如下:

Set login:1:login_times 5
Set login:2:login_times 1
Set login:3:login_times 2

Set login:1:last_login_time 2011-1-1
Set login:2:last_login_time 2011-2-1
Set login:3:last_login_time 2011-3-1

set login:1:name ”ken thompson“
set login:2:name “dennis ritchie”
set login:3:name ”Joe Armstrong“

这样在已知主键的情况下,通过get、set就可以获得或者修改用户的登录次数和最后登录时间和姓名。

一般用户是无法知道自己的id的,只知道自己的用户名,所以还必须有一个从name到id的映射关系,这里的设计与上面的有所不同。

set "login:ken thompson:id" 1
set "login:dennis ritchie:id" 2
set "login: Joe Armstrong:id" 3

这样每次用户登录的时候业务逻辑如下(python版),r是redis对象,name是已经获知的用户名。

#获得用户的id
uid = r.get("login:%s:id" % name)
#自增用户的登录次数
ret = r.incr("login:%s:login_times" % uid)
#更新该用户的最后登录时间
ret = r.set("login:%s:last_login_time" % uid, datetime.datetime.now())

如果需求仅仅是已知id,更新或者获取某个用户的最后登录时间,登录次数,关系型和kv数据库无啥区别。一个通过btree pk,一个通过hash,效果都很好。

假设有如下需求,查找最近登录的N个用户。开发人员看看,还是比较简单的,一个sql搞定。

select * from login order by last_login_time desc limit N

DBA了解需求后,考虑到以后表如果比较大,所以在last_login_time上建个索引。执行计划从索引leafblock 的最右边开始访问N条记录,再回表N次,效果很好。

过了两天,又来一个需求,需要知道登录次数最多的人是谁。同样的关系型如何处理?DEV说简单

select * from login order by login_times desc limit N

DBA一看,又要在login_time上建立一个索引。有没有觉得有点问题呢,表上每个字段上都有素引。

关系型数据库的数据存储的的不灵活是问题的源头,数据仅有一种储存方法,那就是按行排列的堆表。统一的数据结构意味着你必须使用索引来改变sql的访问路径来快速访问某个列的,而访问路径的增加又意味着你必须使用统计信息来辅助,于是一大堆的问题就出现了。

没有索引,没有统计计划,没有执行计划,这就是kv数据库。

redis里如何满足以上的需求呢? 对于求最新的N条数据的需求,链表的后进后出的特点非常适合。我们在上面的登录代码之后添加一段代码,维护一个登录的链表,控制他的长度,使得里面永远保存的是最近的N个登录用户。

#把当前登录人添加到链表里
ret = r.lpush("login:last_login_times", uid)
#保持链表只有N位
ret = redis.ltrim("login:last_login_times", 0, N-1)

这样需要获得最新登录人的id,如下的代码即可

last_login_list = r.lrange("login:last_login_times", 0, N-1)

另外,求登录次数最多的人,对于排序,积分榜这类需求,sorted set非常的适合,我们把用户和登录次数统一存储在一个sorted set里。

zadd login:login_times 5 1
zadd login:login_times 1 2
zadd login:login_times 2 3

这样假如某个用户登录,额外维护一个sorted set,代码如此

#对该用户的登录次数自增1
ret = r.zincrby("login:login_times", 1, uid)

那么如何获得登录次数最多的用户呢,逆序排列取的排名第N的用户即可

ret = r.zrevrange("login:login_times", 0, N-1)

可以看出,DEV需要添加2行代码,而DBA不需要考虑索引什么的。

TAG系统

tag在互联网应用里尤其多见,如果以传统的关系型数据库来设计有点不伦不类。我们以查找书的例子来看看redis在这方面的优势。

关系型数据库的设计

两张表,一张book的明细,一张tag表,表示每本的tag,一本书存在多个tag。

mysql> select * from book;
+------+-------------------------------+----------------+
| id | name    | author  |
+------+-------------------------------+----------------+
| 1 | The Ruby Programming Language | Mark Pilgrim |
| 1 | Ruby on rail   | David Flanagan |
| 1 | Programming Erlang  | Joe Armstrong |
+------+-------------------------------+----------------+

mysql> select * from tag;
+---------+---------+
| tagname | book_id |
+---------+---------+
| ruby | 1 |
| ruby | 2 |
| web | 2 |
| erlang | 3 |
+---------+---------+

假如有如此需求,查找即是ruby又是web方面的书籍,如果以关系型数据库会怎么处理?
select b.name, b.author from tag t1, tag t2, book b
where t1.tagname = ‘web‘ and t2.tagname = ‘ruby‘ and t1.book_id = t2.book_id and b.id = t1.book_id

tag表自关联2次再与book关联,这个sql还是比较复杂的,如果要求即ruby,但不是web方面的书籍呢?

关系型数据其实并不太适合这些集合操作。

REDIS的设计

首先book的数据肯定要存储的,和上面一样。

set book:1:name ”The Ruby Programming Language”
Set book:2:name ”Ruby on rail”
Set book:3:name ”Programming Erlang”

set book:1:author ”Mark Pilgrim”
Set book:2:author ”David Flanagan”
Set book:3:author ”Joe Armstrong”

tag表我们使用集合来存储数据,因为集合擅长求交集、并集

sadd tag:ruby 1
sadd tag:ruby 2
sadd tag:web 2
sadd tag:erlang 3

那么,即属于ruby又属于web的书?

inter_list = redis.sinter("tag.web", "tag:ruby")

即属于ruby,但不属于web的书?

inter_list = redis.sdiff("tag.ruby", "tag:web")

属于ruby和属于web的书的合集?

inter_list = redis.sunion("tag.ruby", "tag:web")

简单到不行阿。

从以上2个例子可以看出在某些场景里,关系型数据库是不太适合的,你可能能够设计出满足需求的系统,但总是感觉的怪怪的,有种生搬硬套的感觉。

尤其登录系统这个例子,频繁的为业务建立索引。放在一个复杂的系统里,ddl(创建索引)有可能改变执行计划。导致其它的sql采用不同的执行计划,业务复杂的老系统,这个问题是很难预估的,sql千奇百怪。要求DBA对这个系统里所有的sql都了解,这点太难了。这个问题在oracle里尤其严重,每个DBA估计都碰到过。对于MySQL这类系统,ddl又不方便(虽然现在有online ddl的方法)。碰到大表,DBA凌晨爬起来在业务低峰期操作,这事我没少干过。而这种需求放到redis里就很好处理,DBA仅仅对容量进行预估即可。

未来的OLTP系统应该是kv和关系型的紧密结合。

浅谈REDIS数据库的键值设计(转)

标签:

热心网友 时间:2022-04-07 17:52

redis是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库。是NoSQL(非关系型数据库)的典型代表,也是时下是最流行的键值对存储数据库。它支持字符串、哈希、链表、集合、有序集合五种数据存储类型。由于其基于内存运行的特性,相较于基于硬盘的数据库系统,从执行效率上讲有非常大的优势。但其本身的读与写的速度没有太大的差别。如果对这部分内容感兴趣,可以从黑马程序员获取测试相关课程了解一下。也有免费的公开课,官网对话框问一下就给

热心网友 时间:2022-04-07 19:10

性能极高–Redis读的速度是11W次/s,写的速度是81K次/s
支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
丰富的数据类型,Redis不仅仅支持简单的key-value类型的数据,同时还提供Strings,Lists,Hashes,Sets及Ordered
Sets等数据结构的存储。
支持数据的备份,即master-slave模式的数据备份。

热心网友 时间:2022-04-07 20:45

Redis是一个高性能的key-value数据库。
Redis的三个主要特点:
1、Redis将数据库完全保存在内存中,仅使用磁盘进行持久化。
2、相比于其他键值数据库,Redis有相对丰富的数据结构。
3、Redis可以将数据复制到任意数量的从机中。

Redis的优点:
1、快。每秒可以执行大约110000次设置(set)操作,每秒大约可执行81000次读取(get)操作。
2、支持丰富的数据类型。Redis有5种数据类型。
3、操作具有原子性。所有Redis操作都是原子操作,这确保了两个客户端并发访问,Redis服务器能接收更新的值。
4、多实用工具。Redis可用于多种用例,如:缓存,消息队列(支持发布和订阅),应用程序中的任何短期数据,如:session等。

Redis的5种数据类型:
1、字符串——String
2、双向链表——List
3、无序集合——Set
4、排序集合——SortedSet
5、哈希类型(类似java中的map)——Hash
redis数据库有哪些特点?

redis是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库。是NoSQL(非关系型数据库)的典型代表,也是时下是最流行的键值对存储数据库。它支持字符串、哈希、链表、集合、有序集合五种数据存储类型。由于其基于内存运行的特性,相较于基于硬盘的数据库系统,从执行效率上讲...

redis到底是个什么东西

2. Redis特点 Redis以内存作为数据存储介质,所以读写数据的效率极高,远远超过数据库。以设置和获取一个256字节字符串为例,它的读取速度可高达110000次/s,写速度高达81000次/s。Redis跟memcache不同的是,储存在Redis中的数据是持久化的,断电或重启后,数据也不会丢失。因为Redis的存储分为内存存储...

redis是什么数据库

2. 持久性存储:尽管Redis主要在内存中操作,但它也提供了持久性功能。通过RDB和AOF技术,Redis可以将数据保存到硬盘中,以防止数据在电源中断或其他意外情况下丢失。3. 作为缓存层的应用:由于其极高的读写速度和内存存储的特性,Redis常被用作缓存层,在服务器和数据库之间提供快速的数据存取。它有效...

redis是关系型数据库吗

redis的特点 1、数据的持久化:Redis支持将内存中的数据持久化到磁盘中,这样即使系统出现故障,数据也不会丢失。2、数据的备份:Redis支持master-slave模式的数据备份,这样可以在主服务器出现问题时,从服务器可以接替主服务器的工作,保证数据的可用性。3、丰富的数据结构:Redis支持多种数据结构,如字符...

三分钟读懂redis数据库

(3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行 (4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除 2. redis相比memcached有哪些优势?(1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型 (2) ...

redis是什么数据库

1. 内存数据库:Redis最显著的特点是其基于内存的数据存储。这意味着数据访问速度非常快,特别适合于需要高频读写操作的应用场景。然而,由于数据存储在内存中的特性,Redis在数据持久性方面不如传统的磁盘数据库。为了解决这个问题,Redis支持将数据定期同步到硬盘,以在服务器重启后恢复数据。2. 数据结构...

移动云云数据库Redis在数据安全方面有哪些优点?

移动云云数据库Redis在数据安全方面有以下几个优点:1、数据加密:Redis支持对数据进行加密,保证数据传输和存储的安全性,能够防止敏感数据泄露和数据被篡改。2、访问控制:Redis支持多种认证和访问控制机制,例如IP白名单、密码认证等,可以限制数据库的访问权限,保护数据的安全性。3、数据备份和恢复:Redis...

移动云云数据库Redis在数据安全方面有哪些优点?

移动云云数据库Redis具备三大优点。一是数据持久化存储,云数据库Redis支持数据秒级持久化到云盘,在提供高速数据读写能力的同时能够满足数据持久化需求,实现服务重启后数据不丢失。二是备份及一键恢复,云数据库Redis能提供灵活的备份策略与备份方式,支持将误删除或损坏的数据备份,一键恢复到原实例,能有效...

什么是Redis?

Redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库 Redis与其他key - value缓存产品有以下三个特点:①Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。②Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构...

Redis是什么

Redis的卓越性能,简单性和数据结构的原子操作有助于解决使用传统关系数据库实现时难以实现或执行不佳的问题。Redis主要特点高级数据结构:为值提供五种可能的数据类型:字符串,列表,集合,哈希和有序集合。提供了这些数据类型独有的操作,并且具有记录良好的时间复杂度(Big O表示法)。高性能:由于其...

redis 写数据到数据库 数据库中数据的特点 数据库具有什么特点 数据库redis redis做数据库 redis进入数据库 redis属于什么数据库 redis默认数据库 为啥redis16个数据库
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
word里的表格怎么调整行高和列宽 怎样调整word表格的行高与列宽 一吨煤能发多少功率 微信不打开微信就收不到语音和视频提示怎么办? 微信来电不显示怎么办 ...公众号里添加文字连接?比如“点击报名”几个字,点进去就是一个报名... 顺丰快递笔记本电脑多少钱? 东莞市捷高电子材料有限公司公司简介 淘宝的购买记录保留多久? 为什么蜻蜓喜欢飞来飞去? Redis有几种数据结构,和其他数 redis的基本数据结构有哪些,都有什么应用 redis数据类型有什么好处 Redis有哪些数据结构? redis一般用来存储什么数据 radis有几种数据类型 redis支持的数据类型有哪些 redis数据类型是什么? Redis支持几种数据类型? 如果微信支付被限制,换一个用原来的实名可以吗? 王者荣耀微信登录的,可以换绑微信吗? 手机号码不换怎么换掉码 网贷钱还了,不消条可以换手机号码,么 打微信客服电话能改吗 怎么在一年之内修改 什么时候可以改二次 一年没满 想更改怎么更改 未满一年怎么修改 改怎么满足条件? 一年没满 想更改怎么更改? redis 什么类型数据库 Redis数据库适合使用于哪些应用场景? 怎么向redis数据库中同时插入不同类型的数据 oppo如何设置农历在手机界面 oppo手机怎么设置桌面显示农历时间 如何用excel制作好看图表 如何用用Excel画出漂亮的图表 使用excel制作一份精美图表的具体操作步骤 怎么用excel制作漂亮的图表 如何用excel作出好看的图表效果 Excel 怎么做漂亮的图表 如何在excel中生成漂亮图表 如何用excel绘漂亮的统计图 如何制作图表非常精美的 Excel 文档? 如何通过Excel制作精美图表 一推文章 如何使用excel制作图表 如何用excel做出漂亮的数据分析图 Excel SwiffChart怎么制作精美的图表 在职场上,老员工都是一副爱理不理新员工的吗? 员工总喜欢教育新来的员工,这是为什么呢?