第一部分:Redis数据库的简介与应用
以下是本篇文章正文内容,如有错误麻烦请指出。 谢谢 !!!
一、Redis简介
1、NoSql 数据库
- NoSQL: 即 Not-Only SQL( 泛指非关系型的数据库),作为关系型数据库的补充。
- 作用: 应对基于海量用户和海量数据前提下的数据处理问题。
- 特征:
(1)可扩容,可伸缩
(2)大数据量下高性能
(3)灵活的数据模型
(4)高可用 - 常见 Nosql 数据库:
(1)Redis
(2)memcache
(3)HBase
(4)MongoDB
2、不同数据库应对场景介绍
- 解决方案(电商场景)
3、Redis相关介绍
-
角色: Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件
-
概念: Redis (REmote DIctionary Server) 是用 C 语言开发的一个开源的高性能键值对(key-value)数据库。
-
特征:
(1)数据间没有必然的关联关系
(2)内部采用单线程机制进行工作
(3)高性能。官方提供测试数据,50个并发执行100000 个请求,读的速度是110000 次/s,写的速度是81000次/s。 -
支持多种类型的数据结构(常用的五种数据结构):
-
字符串类型 String:
- String 是 Redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value;
- String 类型是二进制安全的,意思是 Redis 的 String 可以包含任何数据。比如 jpg 图片或者序列化的对象;
- String 类型是 Redis 最基本的数据类型,String 类型的值最大能存储 512MB。
- 列表类型 List
- Redis 列表是简单的字符串列表,按照插入顺序排序,可以添加一个元素到列表的头部(左边)或者尾部(右边)。
- 散列类型 Hash
- Redis hash 是一个键值(key=>value)对集合,即编程语言中的Map类型;
- Redis hash 是一个 string 类型的 field 和 value 的映射表。
- 集合类型 Set
- Redis 的 Set 是 String 类型的无序集合,集合成员是唯一的,这就意味着集合中不能出现重复的数据;
- Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
- 有序集合类型 ZSet(Sorted_Set)
- Redis 有序集合和集合一样也是 String类型元素的集合,且不允许重复的成员;
- 不同的是每个元素都会关联一个Double类型的分数;
- Redis正是通过分数来为集合中的成员进行从小到大的排序。
- 有序集合的成员是唯一的,但分数(score)却可以重复。
- 支持多种类型的数据结构(其它数据结构):
- Bitmaps
- Hyperloglogs
- 地理空间(Geospatial)索引半径查询
- 其他特点:
- 内置了复制(Replication)
- LUA脚本(Lua scripting)
- LRU驱动事件(LRU eviction)
- 事务(Transactions)
- 不同级别的磁盘持久化(Persistence),可以进行数据灾难恢复
- 通过 Redis 哨兵(Sentinel)和自动分区(Cluster)提供高可用性(High Availability)
二、Redis应用场景
1、场景介绍
- 为热点数据加速查询(主要场景),如热点商品、热点新闻、热点资讯、推广类等高访问量信息等
- 任务队列,如秒杀、抢购、购票排队等
- 即时信息查询,如各位排行榜、各类网站访问统计、公交到站信息、在线人数信息(聊天室、网站)、设
备信号等 - 时效性信息控制,如验证码控制、投票控制等
- 分布式数据共享,如分布式集群架构中的 session 分离
- 消息队列
- 分布式锁
2、八种不同应用场景说明
-
缓存
-
缓存现在几乎是所有中大型网站都在用的必杀技,合理的利用缓存不仅能够提升网站访问速度,还能大大降低数据库的压力;
-
Redis提供了键过期功能,也提供了灵活的键淘汰策略,所以现在Redis用在缓存的场合非常多。
-
排行榜
-
很多网站都有排行榜应用的,如京东的月度销量榜单、商品按时间的上新排行榜等,Redis提供的有序集合数据类型能实现各种复杂的排行榜应用。
-
计数器
-
什么是计数器,如电商网站商品的浏览量、视频网站视频的播放数等。为了保证数据实时效,每次浏览都得给+1,并发量高时如果每次都请求数据库操作无疑是种挑战和压力。
-
Redis提供的incr命令来实现计数器功能,内存操作,性能非常好,非常适用于这些计数场景。
-
分布式会话
-
集群模式下,在应用不多的情况下一般使用容器自带的session复制功能就能满足,当应用增多相对复杂的系统中,一般都会搭建以Redis等内存数据库为中心的session服务,session不再由容器管理,而是由session服务及内存数据库管理。
-
分布式锁
-
在很多互联网公司中都使用了分布式技术,分布式技术带来的技术挑战是对同一个资源的并发访问,如全局ID、减库存、秒杀等场景,并发量不大的场景可以使用数据库的悲观锁、乐观锁来实现。但在并发量高的场合中,利用数据库锁来控制资源的并发访问是不太理想的,大大影响了数据库的性能。可以利用Redis的setnx功能来编写分布式的锁,如果设置返回1说明获取锁成功,否则获取锁失败,实际应用中要考虑的细节要更多。
-
社交网络
-
点赞、踩、关注/被关注、共同好友等是社交网站的基本功能,社交网站的访问量通常来说比较大,而且传统的关系数据库类型不适合存储这种类型的数据,Redis提供的哈希、集合等数据结构能很方便的的实现这些功能。
-
最新列表
-
Redis列表结构,LPUSH可以在列表头部插入一个内容ID作为关键字,LTRIM可用来限制列表的数量,这样列表永远为N个ID,无需查询最新的列表,直接根据ID去到对应的内容页即可。
-
消息系统
-
消息队列是大型网站必用中间件,如ActiveMQ、RabbitMQ、Kafka等流行的消息队列中间件,主要用于业务解耦、流量削峰及异步处理实时性低的业务。Redis提供了发布/订阅及阻塞队列功能,能实现一个简单的消息队列系统。另外,这个不能和专业的消息中间件相比。
3、不同数据类型应用的场景
- 字符串类型 String:
(1)会话缓存
- 用户登录系统后,使用Redis保存用户的Session信息,每次用户查询登录信息都直接从Redis中获取.
(2)计数器
-
比如登录系统会限制密码错误次数,当一个用户在一定时间内连续输入密码错误,就不能登录,需要一段时间后才能登录,我们可以使用redis,把username作为key,错误的次数作为value,同时设置过期时间即可;
-
手机验证码限收到短信的次数;
-
统计其他计数。
(3)定时器
- Redis的key可以设置过期时间,我们基于此特性设置一个定时器。
(4)对象
- 我们把对象序列化后,可以使用Redis保存该对象,然后在获取对象信息的时候,反序列化value。
(5)分布式锁
-
Redis提供了setnx()方法,即SET IF NOT EXIST,只有在key不存在的时候才能set成功,这就意味着同一时间多个请求只有一个请求能保存成功,这样可以自行搜索Redis的分布式锁。
-
列表类型 List
(1)消息队列
- Redis的lpush+brpop命令组合即可实现阻塞队列,生产者客户端使用lrpush从列表左侧插入元素,多个消费者客户端使用brpop命令阻塞式的"抢"列表尾部的元素,多个客户端保证了消费的负载均衡和高可用性。
(2)类目/文章/活动等列表
- 最常见的就是各个系统的首页数据,包括电商系统的商品类目,拼团活动列表,博客园的首页文章列表等。
(3)其他
- 根据push和pop的方式不同,有以下组合方式:
lpush + lpop = Stack(栈)
lpush + rpop = Queue(队列)
lpush + ltrim = Capped Collection(有限集合)
lpush + brpop = Message Queue(消息队列)
-
散列类型 Hash
-
Hash 特别适合用于存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值(Memcached中需要取出整个字符串反序列化成对象修改完再序列化存回去)。
-
集合类型 Set
(1)标签(tag)
- 比如在点餐评价系统中,用户给某商家评价,商家会有多个评价标签,但是不会重复的,如果100万人给某商家评价打了标签,如果使用MySQL数据库获取大数据量去重后的评价标签,会影响数据库的性能和系统的并发量。
(2)相同点/异同点
-
利用交集、并集、差集等操作,可以计算两个人的共同喜好,全部的喜好,自己独有的喜好等功能.
-
有序集合类型 ZSet(Sorted_Set)
(1)排行榜
- 例如博客园需要对用户发表的文章做排行榜,榜单的维度可能是多个方面的:时间、点赞数、热度,浏览数等。
对以前的知识回顾,加深基础知识!
每天进步一点点,也许某一天你也会变得那么渺小!!!