Redis

    技术2023-05-30  20

    Redis

    NoSQL非关系型数据库概述

    NoSQL概念

    Not Only SQL:不仅仅是SQL,指的就是非关系型数据库,它是关系型数据库有益的补充。最终的数据还是保存在关系型数据库中。非关系型数据库主要是提升数据库的查询速度,一般做为数据的缓存来使用。

    非关系型数据库

    非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等。

    优点
    格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;成本低:nosql数据库部署简单,基本都是开源软件。
    缺点

    不提供sql支持,学习和使用成本较高;

    数据结构相对复杂,复杂查询方面不方便。

    为什么要使用NOSQL

    数据库高并发访问 :

    在同一个时间点,同时有海量的用户并发访问。往往要达到每秒上万次读写请求。关系数据库应付上万次SQL查询还勉强顶得住,但是应付上万次SQL写数据请求,硬盘IO就已经无法承受了,。

    如天猫的双11,从凌晨0点到2点这段时间,每秒达到上千万次的访问量。12306春运期间,过年回家买火车抢票的时间,用户不断查询有没有剩余票。

    解决方案

    海量数据的存储

    数据库中数据量特别大,数据库表中每天产生海量的数据。

    ​ 类似QQ,微信,微博,每天用户产生海量的用户动态,每天产生几千万条记录。对于关系数据库来说,在一张几亿条记录的表里面进行SQL查询,效率是极其低下乃至不可忍受的。

    高可扩展性和高可用性的需求

    关系型数据库进行扩展和升级是比较麻烦的一样事,对于很多需要提供24小时不间断服务的网站来说,对数据库系统进行升级和扩展是非常痛苦的事情,往往需要停机维护和数据迁移。

    ​ 非关系型数据库可以通过不断的添加服务器节点来实现扩展,而不需对原有的数据库进行维护。

    特征:

    ⚫ 可扩容,可伸缩

    ⚫ 大数据量下高性能

    ⚫ 灵活的数据模型

    ⚫ 高可用

    常见 Nosql 数据库:

    ⚫ Redis

    ⚫ memcache

    ⚫ HBase

    ⚫ MongoDB

    企业级应用的常见问题:

    海量用户

    高并发

    Redis

    Redis概念

    Redis (REmote DIctionaryServer) 是用 C 语言开发的一个开源的高性能键值对(key-value)数据库。

    特征:

    数据间没有必然的关联关系内部采用单线程机制进行工作高性能。官方提供测试数据,50个并发执行100000 个请求,读的速度是110000 次/s,写的速度是81000次/s。多数据类型支持 ◆ 字符串类型 string ◆ 列表类型 list◆ 散列类型 hash◆ 集合类型 set◆ 有序集合类型 zset/sorted_set 支持持久化,可以进行数据灾难恢复

    Redis 的应用

    ⚫ 为热点数据加速查询(主要场景),如热点商品、热点新闻、热点资讯、推广类等高访问量信息等

    ⚫ 即时信息查询,如各位排行榜、各类网站访问统计、公交到站信息、在线人数信息(聊天室、网站)、设备信号等

    ⚫ 时效性信息控制,如验证码控制、投票控制等

    ⚫ 分布式数据共享,如分布式集群架构中的session 分离

    ⚫ 消息队列

    Redis 的基本操作

    Redis的5种数据类型

    值的数据类型说明string类型字符串list类型列表:元素可以重复,元素是有索引号,有先后顺序的set类型集合:元素是不可重复的,元素没有索引号,没有先后顺序的hash类型值由多个键值对组成set类型集合:元素不可重复的,每个元素有索引号,还有一个分数值,可以根据分数进行排序

    常用命令

    命令功能set 键 值存入字符串类型的键和值,如果键不存在就是添加,存在就是修改get 键通过键获取值,如果不存在,返回空(nil)del 键通过键删除键和值

    string

    redis 数据存储格式

    ⚫ redis 自身是一个 Map,其中所有的数据都是采用key : value 的形式存储

    ⚫ 数据类型指的是存储的数据的类型,也就是value 部分的类型,key 部分永远都是字符串

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

    应用场景

    主页高频访问信息显示控制,例如新浪微博大V主页显示粉丝数与微博数量

    hash

    hash 类型数据的基本操作

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

    hash存储结构优化 :

    如果field数量较少,存储结构优化为类数组结构如果field数量较多,存储结构使用HashMap结构

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

    hash类型中value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。如果数据未获取到,对应的值为(nil)每个 hash 可以存储 232 - 1 个键值对hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计初衷不是为了存储大量对象而设计 的,切记不可滥用,更不可以将hash作为对象列表使用hgetall 操作可以获取全部属性,如果内部field过多,遍历整体数据效率就很会低,有可能成为数据访问瓶颈

    应用场景

    双11活动日,销售手机充值卡的商家对移动、联通、电信的30元、50元、100元商品推出抢购活动,每种商品抢购上限1000 张

    list

    list 类型:

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

    list 类型数据操作注意事项

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

    应用场景

    企业运营过程中,系统将产生出大量的运营数据,如何保障多台服务器操作日志的统一顺序输出?

    set

    新的存储需求:存储大量的数据,在查询方面提供更高的效率需要的存储结构:能够保存大量的数据,高效的内部存储机制,便于查询set类型:与hash存储结构完全相同,仅存储键,不存储值(nil),并且值是不允许重复的 set 类型数据的基本操作

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

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

    应用场景:

    黑名单

    资讯类信息类网站追求高访问量,但是由于其信息的价值,往往容易被不法分子利用,通过爬虫技术, 快速获取信息,个别特种行业网站信息通过爬虫获取分析后,可以转换成商业机密进行出售。例如第三方火 车票、机票、酒店刷票代购软件,电商刷评论、刷好评。同时爬虫带来的伪流量也会给经营者带来错觉,产生错误的决策,有效避免网站被爬虫反复爬取成为每 个网站都要考虑的基本问题。在基于技术层面区分出爬虫用户后,需要将此类用户进行有效的屏蔽,这就是 **黑名单**的典型应用。ps:不是说爬虫一定做摧毁性的工作,有些小型网站需要爬虫为其带来一些流量。

    白名单

    对于安全性更高的应用访问,仅仅靠黑名单是不能解决安全问题的,此时需要设定可访问的用户群体, 依赖**白名单**做更为苛刻的访问验证
    Processed: 0.018, SQL: 8