03 06 2022

Reids数据库基础知识


一、Redis简介

            1.1 问题现象

            image.png

            1.2 NoSql

            NoSql:Not-Only-Sql(泛指非关系型的数据库),“作为关系型数据库的补充

            作用:应对给予海量用户和海量数据前提下的数据处理问题

            特征:不遵循SQL标准、远超于SQL性能、不支持ACID

            NoSql应用场景:对数据高并发的读写、海量数据的读写、对数据高可扩展性

            NoSql不适合的场景:需要事务支持、基于SQL的结构化查询,处理复杂的关系

            常见的NoSql数据库:Redis、memcache、HBase、MongoDB

            image.png

            image.png

            1.3 Redis

            概念:Redis(Remote Dictionary Sever)  使用C语言开发的一个开源的高性能键值对(key-value)数据库

            1.4 Redis特征

            image.png

            image.png

            redis是一个单线程+多路I/O复用机制;memcached是多线程+锁机制

            image.png

            1.5 Redis的应用

            image.png

            1.6 Redis在windows下的安装

            image.png

            1.7 命令行模式工具使用思考

            功能性命令

            清楚屏幕信息

            帮助信息查询

            退出指令

            

二、Redis基础操作

            2.1 信息添加

            功能:设置key、value数据

            命令:set  key  value

            2.2 信息查询

            功能:根据key查询对应的value,如果不存在,返回 nil 

            命令:get  key 

            2.3 清除屏幕信息

            功能:清除屏幕中的信息

            命令:clear

            2.4 帮助

            功能:获取命令帮助文档,获取组中所有命令信息名称

            命令:help  命令名称      help   @组名(help 空格 table)

            image.png

            image.png

            2.5 退出

            功能:退出客户端

            命令:quit   exit   esc(这个玩意儿慎用)


三、Redis数据类型

            3.1 数据业务使用场景介绍

            image.png

            image.png

            3.2 数据存储类型基本介绍

            Redis有5大数据存储类型,分别是string、hash、list、set、sorted_set

            redis数据存储格式:

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

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

            image.png

            3.2.1 string类型

            存储的数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型

            存储数据的格式:一个存储空间保存一个数据

            存储内容:通常使用字符串,如果字符串以整数的形式展示,可以作为数字操作使用

            

            string类型数据的基本操作:

            操作成功提示integer 1   操作失败提示integer 0

            a、添加/修改数据:set   key   value

            b、获取数据:get  key 

            c、删除数据:del  key

            d、添加/修改多个数据:mset  key1  value1   key2  value2

            e、获取多个数据:mget  key1  key2

            f、获取数据字符个数(字符串长度):strlen   key

            g、追加信息到原始信息后部(如果原始信息存在就追加,否则新建):append  key  value

            image.png


            string类型数据的扩展操作:

            a、设置数值数据增加指定范围的值

            指定键的value值加1:incr  key 

            image.png

            指定键的value值加上指定整数值:incrby  key  increment

            image.png

            image.png

            指定键的value值加上指定浮点数值:incrbyfloat  key  increment

            image.png

            b、设置数值数据减少指定范围的值

            decr  key 

            image.png

            decrby  key  decrement

            image.png

            c、设置数据具有指定的生命周期

            setex  key  seconds  value  

            image.png

            psetex key milliseconds value

            image.png

            为key设置过期时间  expire key seconds

            image.png

            获取值的范围  getrange key start end

            image.png


            string作为数值操作:

            string在redis内部存储默认就是一个字符串,当遇到增减类操作incr,decr时会转成数值类型进行计算

            string的所有操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发带来的数据影响

            注意:按数值进行操作的数据,如果原始数据不能转成数值,或超越了redis数值上限范围,将报错

            

            提示:

            1、redis用于控制数据库表主键id,为数据库表主键提供生成策略,保证数据库表的主键唯一性;此方案适用所有数据库,且支持数据库集群

            2、redis控制数据的生命周期,通过数据是否失效控制业务行为,适用于所有具有时效性限定控制的操作

            

            string类型数据操作注意事项:

            1、数据操作不成功的反馈与数据正常操作之间的差异

            image.png

            2、数据未获取到

            nil等同于null

            3、数据最大存储量

            string类型数据,单个value最大存储量512MB

            

            string类型应用场景:

            image.png

            image.png

            说明:   表名:主键字段:主键值:说明字段(粉丝、关注量等等...)

            image.png

            用json形式存放一组数据

            image.png

            注意:数据库中的热点数据key命名案例

            image.png


            3.2.2 hash类型

            新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息

            image.png

            需要的存储结构:一个存储空间保留多个键值对数据

            image.png

            

            hash类型数据的基本操作

            a、添加/修改数据:hset  key  field  value

            image.png

            b、获取数据:hget  key  field        hgetall   key

            image.png

            c、删除数据:hdel  key  field1   field2

            image.png

            d、添加/修改多个数据:hmset  key  field1  value1  field2   value2

            image.png

            e、获取多个数据:hmget  key  field1  field2

            image.png

            f、获取hash表中字段的数量:hlen  key

            image.png

            g、获取hash表中是否存在指定的字段:hexists  key  field

            image.png


            hash类型数据的扩展操作

            a、获取hash表中所有的字段名或字段值:hkeys  key     hvals  key

            image.png

            image.png

            b、设置指定字段的数值数据增加指定范围的值:hincrby key field increment(指定字段增加整数)   、  hincrbyfloat key field increment(指定字段增加浮点数)

            image.png

            image.png


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

            1、hash类型下的value只能存储字符串,不允许存储其它类型数据,不存在嵌套现象。如果数据未获取到,对应的值为 nil

            2、每个hash可以存储2的32次方-1个键值对 

            3、hash类型十分贴近对象的数据存储形式,并且可以灵活的添加删除对象属性,但hash设计初衷不是为了存储大量对象而设计的,切记不可滥用,更不可以将hash作为对象列表使用

            4、hgetall操作可以获取全部属性,如果内部field过多,遍历整体数据效率就会低,有可能成为数据访问瓶颈


            hash类型应用场景:

            1、电商网站购物车设计与实现(属于买家)

            image.png

            image.png

            image.png

            image.png

            当前仅仅是将数据存储到了redis中,并没有起到加速的作用,商品信息还需要二次查询数据库

            image.png

            image.png

            hsetnx  key  field  value 在此场景的使用:如果当前key中对应的field有值,就什么都不做;如果没值,我就把它加进去!!! 

            image.png


            2、双十一活动,销售手机充值卡的商家对移动、联通、电信的30元、50元100元商品推出的抢购活动,比如商品抢购上限1000单(属于卖家)

            image.png

            image.png

            image.png


            业务场景:

            string存对象(json)与hash存对象的优缺点,string讲究整体性,数据一次性整体操作,要么一次性更新要么一次性读取,以读为主;而hash因为有field字段把属性隔离开,讲究更新操作更具有灵活性,以更新为主!!!  开发的时候根据需求灵活设置数据类型


            3.2.3 list类型

            数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分

            需要的存储结构:一个存储空间保存多个数据,且通过数据可以体现进入顺序

            list类型:保存多个数据,底层使用双向链表存储结构实现,哪边都能进  哪边都能出

            image.png

            image.png


            list类型数据的基本操作

            a、添加/修改数据:lpush key value [value ...]       rpush key value [value ...] 

            image.png

            b、获取数据/查询数据:

            lrange key start stop 获取列表指定范围的元素,lrange key start stop ,这里的start代表开始,stop代表结束,当stop为-1的时候表示取到最后一个值,当stop为-2的时候,表示取到倒数第二个值,以此类推;lrange key 0 -1,表示全部取出

            左边进去的1  2  3 ,左边查询出来3  2  1 

            image.png

            右边进去的 1  2  3,左边查询出来 1  2  3 

            image.png


            c、lindex key index ,通过索引从列表中获取/查询元素

            image.png

            d、llen key ,获取链表的长度

            image.png

            e、从左边“移除”数据(移出、弹出),lpop  key,当队列中数据移出完以后会删掉key

            image.png

            f、从右边“移除”数据(移出、弹出), rpop  key,当队列中数据移出完以后会删掉key

            image.png


            list类型数据的扩展操作

            规定时间内获取并移除数据

            a、 blpop key [key ...] timeout     删除并获取列表的第一个元素,或阻止直到有可用的元素

            image.png

            拿不出来就一直在那儿等,直到设置时间到,返回nil

            image.png

            image.png

            b、 brpop key [key ...] timeout     删除并获取列表的第一个元素,或阻止直到有可用的元素

            image.png

            

            list类型数据操作注意事项:

            1、list中保存的数据都是string类型的,数据总量是有限的,最多2的32次方-1个元素(4294967295)

            2、list具有索引的概念,但是操作数据时通常以队列的形式进行入队出队操作,或以栈的形式进行入栈出栈操作

            3、获取全部数据操作结束的索引设置为-1

            4、list可以对数据进行分页操作,通常第一页的信息来自于list,第2页及更多的信息通过数据库的形式加载


            list类型应用场景:

            1、微信朋友圈点赞,要求按照点赞顺序现实点赞好友信息

            image.png

            从列表中删除元素,移除指定数据,lrem key count value 

            image.png

            image.png

            2、新浪微博、腾讯微博中个人用户的关注列表需要按照用户的关注顺序进行展示,粉丝列表需要将最近关注的粉丝列在前面

            image.png

            image.png

            image.png

            image.png


            3.2.4 set类型

            数据存储需求:存储大量的数据,在查询方面提供更高的效率

            需要的存储结构:能够保存大量的数据,高效的内部存储机制,便于查询

            set类型:与hash存储结构完全相同,仅存储键,不存储值(nil),并且值是不允许重复的

            image.png

            image.png


            set类型数据的基本操作

            a、添加数据:sadd key member [member ...]

            image.png

            b、获取全部数据:smembers key

            image.png

            c、删除数据:srem key member [member ...]

            image.png

            d、获取集合数据总量:scard key

            image.png

            e、判断集合中是否包含指定数据:sismember key member

            image.png


            set类型应用场景:

            1、应用场景举例1

            image.png

            set类型数据的扩展操作:

            a、随机获取集合中指定数量的数据:srandmember key [count]

            image.png

            b、随机获取集合中的某个数据并将该数据移出集合:spop  key

            image.png

            提示:redis应用于随机推荐类信息检索,列如热点歌单推荐,热点新闻推荐,热卖旅游路线推荐,应用APP推荐,大V推荐等


            2、应用场景举例2

            image.png


            image.png

            c、求两个集合的交集:sinter key [key ...]

            image.png

            d、求两个集合的并集:sunion key [key ...]

          image.png  

            e、求两个集合的差集:sdiff key [key ...]

            image.png

            f、求两个集合的交集、并集、差集并存储到指定的集合中

            image.png

            image.png

            g、将指定数据从原始集合中移动到目标集合中:smove source destination member

            image.png

            提示:

            image.png

            set类型数据注意事项:

            1、set类型不允许数据重复,如果添加的数据在set中已经存在,将只保留一份

            image.png

            2、set虽然与hash存储结构相同,但是无法启用hash中存储至的空间

            image.png

            

            3、应用场景举例3

            image.png

            image.png

            image.png

            校验工作:redis提供基础数据还是提供校验结果?    尽量提供基础数据,不在redis数据端做数据校验


            4、应用场景举例4

            image.png

            image.png

            提示:redis应用于同类型数据的快速去重            


            5、应用场景举例5

            image.png

          image.png

            

            3.2.5 sotred_set类型

            数据存储需求:数据排序有利于数据的有效显示,需要提供一种可以根据自身特征进行排序的方式

            需要的存储结构:新的存储模型,可以保存可排序的数据

            sorted_set类型:在set的存储结构基础上添加可排序字段

            image.png

            

            sorted_set数据的基本操作:

            a、添加数据:zadd key [NX|XX] [CH] [INCR] score member [score memb

            image.png

            b、获取全部数据(从小到大):zrange key start stop [WITHSCORES]

            image.png

            image.png

            加了参数withscores以后的结果:

            image.png

            c、获取全部数据(从大到小):zrevrange key start stop [WITHSCORES]

            image.png

            d、删除数据:zrem key member [member ...]

            image.png

            e、按条件获取数据(从小到大):zrangebyscore key min max [WITHSCORES] [LIMIT offset count]

            image.png

            f、按条件获取数据(从大到小):zrevrangebyscore key max min [WITHSCORES] [LIMIT offset count]

            image.png

            附加limit条件查询:

            image.png

            g、按条件索引删除数据:zremrangebyrank key start stop

            image.png

            h按条件删除数据:zremrangebyscore key min max

            image.png

            image.png

            i、获取集合数据总量:zcard score

            image.png

            j、统计集合某个范围的数据:zcount  key  min  max

            image.png

            k、集合交集操作:zinterstore destination numkeys key [key ...] [WEIGHTS weight] [AG

            image.png


            sorted_set类型应用场景:

            1、应用场景举例1

            image.png

            m、获取数据对应的索引(由小到大):zrank  key  member

            image.png

            n、获取数据对应的索引(由大到小):zrank  key  member

           image.png

            o、score值得获取

            image.png

            p、score值修改

            image.png

            提示:

            image.png


            sorted_set类型数据注意事项:

            1、score保存的数据存储空间是64位,如果整数范围是-9007199254740992~9007199254740992

            2、score保存的数据也可以是一个双精度的double值,基于双精度浮点数的特征,可能会丢失精度,使用时候要慎重

            3、sorted_set底层存储还是基于set结构,因此数据不能重复,如果重复添加相同的数据,score将被反复覆盖,保留最后一次修改结果



            image.png

            image.png