Reids数据库基础知识
一、Redis简介
1.1 问题现象
1.2 NoSql
NoSql:Not-Only-Sql(泛指非关系型的数据库),“作为关系型数据库的补充”
作用:应对给予海量用户和海量数据前提下的数据处理问题
特征:不遵循SQL标准、远超于SQL性能、不支持ACID
NoSql应用场景:对数据高并发的读写、海量数据的读写、对数据高可扩展性
NoSql不适合的场景:需要事务支持、基于SQL的结构化查询,处理复杂的关系
常见的NoSql数据库:Redis、memcache、HBase、MongoDB
1.3 Redis
概念:Redis(Remote Dictionary Sever) 使用C语言开发的一个开源的高性能键值对(key-value)数据库
1.4 Redis特征
redis是一个单线程+多路I/O复用机制;memcached是多线程+锁机制
1.5 Redis的应用
1.6 Redis在windows下的安装
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)
2.5 退出
功能:退出客户端
命令:quit exit esc(这个玩意儿慎用)
三、Redis数据类型
3.1 数据业务使用场景介绍
3.2 数据存储类型基本介绍
Redis有5大数据存储类型,分别是string、hash、list、set、sorted_set
redis数据存储格式:
redis自身是一个Map,其中所有的数据都采用key:value的形式存储
数据类型:指的是存储的数据类型,也就是value部分的类型,key部分永远都是字符串
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
string类型数据的扩展操作:
a、设置数值数据增加指定范围的值
指定键的value值加1:incr key
指定键的value值加上指定整数值:incrby key increment
指定键的value值加上指定浮点数值:incrbyfloat key increment
b、设置数值数据减少指定范围的值
decr key
decrby key decrement
c、设置数据具有指定的生命周期
setex key seconds value
psetex key milliseconds value
为key设置过期时间 expire key seconds
获取值的范围 getrange key start end
string作为数值操作:
string在redis内部存储默认就是一个字符串,当遇到增减类操作incr,decr时会转成数值类型进行计算
string的所有操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发带来的数据影响
注意:按数值进行操作的数据,如果原始数据不能转成数值,或超越了redis数值上限范围,将报错
提示:
1、redis用于控制数据库表主键id,为数据库表主键提供生成策略,保证数据库表的主键唯一性;此方案适用所有数据库,且支持数据库集群
2、redis控制数据的生命周期,通过数据是否失效控制业务行为,适用于所有具有时效性限定控制的操作
string类型数据操作注意事项:
1、数据操作不成功的反馈与数据正常操作之间的差异
2、数据未获取到
nil等同于null
3、数据最大存储量
string类型数据,单个value最大存储量512MB
string类型应用场景:
说明: 表名:主键字段:主键值:说明字段(粉丝、关注量等等...)
用json形式存放一组数据
注意:数据库中的热点数据key命名案例
3.2.2 hash类型
新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息
需要的存储结构:一个存储空间保留多个键值对数据
hash类型数据的基本操作
a、添加/修改数据:hset key field value
b、获取数据:hget key field hgetall key
c、删除数据:hdel key field1 field2
d、添加/修改多个数据:hmset key field1 value1 field2 value2
e、获取多个数据:hmget key field1 field2
f、获取hash表中字段的数量:hlen key
g、获取hash表中是否存在指定的字段:hexists key field
hash类型数据的扩展操作
a、获取hash表中所有的字段名或字段值:hkeys key hvals key
b、设置指定字段的数值数据增加指定范围的值:hincrby key field increment(指定字段增加整数) 、 hincrbyfloat key field increment(指定字段增加浮点数)
hash类型数据操作注意事项:
1、hash类型下的value只能存储字符串,不允许存储其它类型数据,不存在嵌套现象。如果数据未获取到,对应的值为 nil
2、每个hash可以存储2的32次方-1个键值对
3、hash类型十分贴近对象的数据存储形式,并且可以灵活的添加删除对象属性,但hash设计初衷不是为了存储大量对象而设计的,切记不可滥用,更不可以将hash作为对象列表使用
4、hgetall操作可以获取全部属性,如果内部field过多,遍历整体数据效率就会低,有可能成为数据访问瓶颈
hash类型应用场景:
1、电商网站购物车设计与实现(属于买家)
当前仅仅是将数据存储到了redis中,并没有起到加速的作用,商品信息还需要二次查询数据库
hsetnx key field value 在此场景的使用:如果当前key中对应的field有值,就什么都不做;如果没值,我就把它加进去!!!
2、双十一活动,销售手机充值卡的商家对移动、联通、电信的30元、50元100元商品推出的抢购活动,比如商品抢购上限1000单(属于卖家)
业务场景:
string存对象(json)与hash存对象的优缺点,string讲究整体性,数据一次性整体操作,要么一次性更新要么一次性读取,以读为主;而hash因为有field字段把属性隔离开,讲究更新操作更具有灵活性,以更新为主!!! 开发的时候根据需求灵活设置数据类型
3.2.3 list类型
数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分
需要的存储结构:一个存储空间保存多个数据,且通过数据可以体现进入顺序
list类型:保存多个数据,底层使用双向链表存储结构实现,哪边都能进 哪边都能出
list类型数据的基本操作
a、添加/修改数据:lpush key value [value ...] rpush key value [value ...]
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
右边进去的 1 2 3,左边查询出来 1 2 3
c、lindex key index ,通过索引从列表中获取/查询元素
d、llen key ,获取链表的长度
e、从左边“移除”数据(移出、弹出),lpop key,当队列中数据移出完以后会删掉key
f、从右边“移除”数据(移出、弹出), rpop key,当队列中数据移出完以后会删掉key
list类型数据的扩展操作
规定时间内获取并移除数据
a、 blpop key [key ...] timeout 删除并获取列表的第一个元素,或阻止直到有可用的元素
拿不出来就一直在那儿等,直到设置时间到,返回nil
b、 brpop key [key ...] timeout 删除并获取列表的第一个元素,或阻止直到有可用的元素
list类型数据操作注意事项:
1、list中保存的数据都是string类型的,数据总量是有限的,最多2的32次方-1个元素(4294967295)
2、list具有索引的概念,但是操作数据时通常以队列的形式进行入队出队操作,或以栈的形式进行入栈出栈操作
3、获取全部数据操作结束的索引设置为-1
4、list可以对数据进行分页操作,通常第一页的信息来自于list,第2页及更多的信息通过数据库的形式加载
list类型应用场景:
1、微信朋友圈点赞,要求按照点赞顺序现实点赞好友信息
从列表中删除元素,移除指定数据,lrem key count value
2、新浪微博、腾讯微博中个人用户的关注列表需要按照用户的关注顺序进行展示,粉丝列表需要将最近关注的粉丝列在前面
3.2.4 set类型
数据存储需求:存储大量的数据,在查询方面提供更高的效率
需要的存储结构:能够保存大量的数据,高效的内部存储机制,便于查询
set类型:与hash存储结构完全相同,仅存储键,不存储值(nil),并且值是不允许重复的
set类型数据的基本操作
a、添加数据:sadd key member [member ...]
b、获取全部数据:smembers key
c、删除数据:srem key member [member ...]
d、获取集合数据总量:scard key
e、判断集合中是否包含指定数据:sismember key member
set类型应用场景:
1、应用场景举例1
set类型数据的扩展操作:
a、随机获取集合中指定数量的数据:srandmember key [count]
b、随机获取集合中的某个数据并将该数据移出集合:spop key
提示:redis应用于随机推荐类信息检索,列如热点歌单推荐,热点新闻推荐,热卖旅游路线推荐,应用APP推荐,大V推荐等
2、应用场景举例2
c、求两个集合的交集:sinter key [key ...]
d、求两个集合的并集:sunion key [key ...]
e、求两个集合的差集:sdiff key [key ...]
f、求两个集合的交集、并集、差集并存储到指定的集合中
g、将指定数据从原始集合中移动到目标集合中:smove source destination member
提示:
set类型数据注意事项:
1、set类型不允许数据重复,如果添加的数据在set中已经存在,将只保留一份
2、set虽然与hash存储结构相同,但是无法启用hash中存储至的空间
3、应用场景举例3
校验工作:redis提供基础数据还是提供校验结果? 尽量提供基础数据,不在redis数据端做数据校验
4、应用场景举例4
提示:redis应用于同类型数据的快速去重
5、应用场景举例5
3.2.5 sotred_set类型
数据存储需求:数据排序有利于数据的有效显示,需要提供一种可以根据自身特征进行排序的方式
需要的存储结构:新的存储模型,可以保存可排序的数据
sorted_set类型:在set的存储结构基础上添加可排序字段
sorted_set数据的基本操作:
a、添加数据:zadd key [NX|XX] [CH] [INCR] score member [score memb
b、获取全部数据(从小到大):zrange key start stop [WITHSCORES]
加了参数withscores以后的结果:
c、获取全部数据(从大到小):zrevrange key start stop [WITHSCORES]
d、删除数据:zrem key member [member ...]
e、按条件获取数据(从小到大):zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
f、按条件获取数据(从大到小):zrevrangebyscore key max min [WITHSCORES] [LIMIT offset count]
附加limit条件查询:
g、按条件索引删除数据:zremrangebyrank key start stop
h、按条件删除数据:zremrangebyscore key min max
i、获取集合数据总量:zcard score
j、统计集合某个范围的数据:zcount key min max
k、集合交集操作:zinterstore destination numkeys key [key ...] [WEIGHTS weight] [AG
sorted_set类型应用场景:
1、应用场景举例1
m、获取数据对应的索引(由小到大):zrank key member
n、获取数据对应的索引(由大到小):zrank key member
o、score值得获取
p、score值修改
提示:
sorted_set类型数据注意事项:
1、score保存的数据存储空间是64位,如果整数范围是-9007199254740992~9007199254740992
2、score保存的数据也可以是一个双精度的double值,基于双精度浮点数的特征,可能会丢失精度,使用时候要慎重
3、sorted_set底层存储还是基于set结构,因此数据不能重复,如果重复添加相同的数据,score将被反复覆盖,保留最后一次修改结果