基础
一.简介
Nosql
即 Not-Only SQL( 泛指非关系型的数据库),作为关系型数据库的补充。
作用:应对基于海量用户和海量数据前提下的数据处理问题。
特征: 可扩容,可伸缩 大数据量下高性能 灵活的数据模型 高可用
常见 Nosql 数据库:Redis memcache HBase MongoDB
Redis是用 C 语言开发的一个开源的高性能键值对(key-value)数据库。
特征:
1)数据间没有必然的关联关系
2)内部采用单线程机制进行工作(一条线往下走 )
3)高性能。官方提供测试数据,50个并发执行100000 个请求,读的速度是110000 次/s,写的速度是81000次/s。
4)多数据类型支持
字符串类型 string 列表类型 list
散列类型 hash 集合类型 set 有序集合类型 sorted_set
5)持久化支持。可以进行数据灾难恢复
应用:
1)为热点数据加速查询(主要场景),如热点商品、热点新闻、热点资讯、推广类等高访问量信息等
2)任务队列,如秒杀、抢购、购票排队等
3)即时信息查询,如各位排行榜、各类网站访问统计、公交到站信息、在线人数信息(聊天室、网站)、设备信号等
4)时效性信息控制,如验证码控制、投票控制等
5)分布式数据共享,如分布式集群架构中的 session 分离
6)消息队列
7)分布式锁
二、下载与安装
三、基本操作
1.添加信息
功能:设置 key,value 数据
命令:set key value eg:set name itheima
2.查询信息
功能:根据 key 查询对应的 value,如果不存在,返回空(nil)
命令:get key eg:get name
3.清除屏幕信息
功能:清除屏幕中的信息
命令:clear (不同系统可能不一样,有的是cls)
4. 退出客户端命令行模式
功能:退出客户端
命令: quit exit
<ESC>(用CMD执行可以避免esc之后直接退出客户端)
5.帮助
功能:获取命令帮助文档,获取组中所有命令信息名称
命令:help 命令名称 (看单个命令) help @组名(可以获取到群组命令)
四、数据类型
redis 数据存储格式,自身是一个 Map,其中所有的数据都是采用 key : value 的形式存储
数据类型指的是存储的数据的类型,也就是 value 部分的类型,key 部分永远都是字符串
string
1.存储的数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型
2.存储数据的格式:一个存储空间保存一个数据
3.存储内容:通常使用字符串,如果字符串以整数的形式展示,可以作为数字操作使用(但实际上还是字符串)
4.基本操作:
添加/修改数据 set key value
获取数据 get key
删除数据 del key
添加/修改多个数据 mset key1 value1 key2 value2 … (m –> Multiple多个)
获取多个数据 mget key1 key2 …
获取数据字符个数(字符串长度) strlen key
追加信息到原始信息后部(如果原始信息存在就追加,否则新建)append key value
5.扩展操作:
大型企业级应用中,分表操作是基本操作,使用多张表存储同类型数据,但是对应的主键 id 必须保证统一性,不能重复。
Oracle 数据库具有 sequence 设定,
MySQL数据库并不具有类似的机制,解决方式如下
设置数值数据增加指定范围的值
incr key
incrby key increment (increment的值可以为正[加效果]或负[减效果],)
incrbyfloat key increment (小数就只能用这种方法去加)
设置数值数据减少指定范围的值
decr key
decrby key increment
string 作为数值操作,在redis内部存储默认就是一个字符串,当遇到增减类操作incr,decr时会转成数值型进行计算。
redis所有的操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发带来的数据影响。(a调用的时候,b调用不到)
注意:按数值进行操作的数据,如 果原始数据不能转成数值,或超越了redis 数值上限范围,将报错。 9223372036854775807(java中long型数据最大值,Long.MAX_VALUE)
redis用于控制数据库表主键id,为数据库表主键提供生成策略,保障数据库表的主键唯一性。此方案适用于所有数据库,且支持数据库集群
设置数据具有指定的生命周期
setex key seconds value
psetex key milliseconds value
redis 控制数据的生命周期,通过数据是否失效控制业务行为,适用于所有具有时效性限定控制的操作
redis应用于各种结构型和非结构型高热度数据访问加速
6.string 类型数据操作的注意事项
1)数据操作不成功的反馈与数据正常操作之间的差异
1]表示运行结果是否成功 (integer) 0 → false 失败 (integer) 1 → true 成功
2]表示运行结果值 (integer) 3 → 3 3个 (integer) 1 → 1 1个
2)数据未获取到 (nil)等同于null
3)数据最大存储量 512MB
4)数值计算最大范围(java中的long的最大值) 9223372036854775807
hash
1.新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息
2.需要的存储结构:一个存储空间保存多个键值对数据
3.hash类型:底层使用哈希表结构实现数据存储
4.hash存储结构优化
如果field数量较少,存储结构优化为类数组结构
如果field数量较多,存储结构使用HashMap结构
5.基本操作
添加/修改数据 hset key field value
获取数据 hget key field hgetall key
删除数据 hdel key field1 [field2]
添加/修改多个数据hmset key field1 value1 field2 value2 …
获取多个数据hmget key field1 field2 …
获取哈希表中字段的数量hlen key
获取哈希表中是否存在指定的字段hexists key field
6.扩展操作
获取哈希表中所有的字段名或字段值
hkeys key
hvals key
设置指定字段的数值数据增加指定范围的值
hincrby key field increment
hincrbyfloat key field increment
7.注意事项:
hash类型下的value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。如果数据未获取到,对应的值为(nil)
hash 可以存储 232 - 1 个键值对
hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计初衷不是为了存储大量对象而设计的,切记不可滥用,更不可以将hash作为对象列表使用
hgetall 操作可以获取全部属性,如果内部field过多,遍历整体数据效率就很会低,有可能成为数据访问瓶颈
String整体性,一次性数据更新或获取,以读为主
Hash群组概念,可以用filed进行隔开,以更新为主
list
1.数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分
2.需要的存储结构:一个存储空间保存多个数据,且通过数据可以体现进入顺序
3.list类型:保存多个数据,底层使用双向链表存储结构实现
4.基本操作:
添加/修改数据
lpush key value1 [value2] ……(从左边进)
rpush key value1 [value2] ……(从右边进 )
获取数据
lrange key start stop
lindex key index
llen key
获取并移除数据
lpop key(从左边把元素给拿出来 )
rpop key
规定时间内获取并移除数据
blpop key1 [key2] timeout(b是阻塞的意思)
brpop key1 [key2] timeout
brpoplpush source destination timeout
5.扩展操作
移除指定数据 lrem key count value
redis 应用于具有操作先后顺序的数据控制
6.注意事项
list中保存的数据都是string类型的,数据总容量是有限的,最多232 - 1 个元素 (4294967295)。
list具有索引的概念,但是操作数据时通常以队列的形式进行入队出队操作,或以栈的形式进行入栈出栈操作
获取全部数据操作结束索引设置为-1
list可以对数据进行分页操作,通常第一页的信息来自于list,第2页及更多的信息通过数据库的形式加载
解决方案
依赖list的数据具有顺序的特征对信息进行管理
使用队列模型解决多路信息汇总合并的问题
使用栈模型解决最新消息的问题
redis 应用于最新消息展示
set
1.新的存储需求:存储大量的数据,在查询方面提供更高的效率
2.需要的存储结构:能够保存大量的数据,高效的内部存储机制,便于查询
3.set类型:与hash存储结构完全相同,仅存储键,不存储值(nil),并且值是不允许重复的
4.基本操作
添加数据 sadd key member1 [member2]
获取全部数据 smembers key
删除数据 srem key member1 [member2]
获取集合数据总量 scard key
判断集合中是否包含指定数据 sismember key member
5.拓展操作
随机获取集合中指定数量的数据 srandmember key [count]
随机获取集合中的某个数据并将该数据移出集合 spop key [count]
redis 应用于随机推荐类信息检索,例如热点歌单推荐,热点新闻推荐,热卖旅游线路,应用APP推荐,大V推荐等
求两个集合的交、并、差集
sinter key1 [key2]
sunion key1 [key2]
sdiff key1 [key2]
求两个集合的交、并、差集并存储到指定集合中
sinterstore destination key1 [key2]
sunionstore destination key1 [key2]
sdiffstore destination key1 [key2]
将指定数据从原始集合中移动到目标集合中
smove source destination member
redis 应用于同类信息的关联搜索,二度关联搜索,深度关联搜索
显示共同关注(一度检索)
显示共同好友(一度检索)
由用户A出发,获取到好友用户B的好友信息列表(一度检索)
由用户A出发,获取到好友用户B的购物清单列表(二度检索)
由用户A出发,获取到好友用户B的游戏充值列表(二度检索)
6.注意事项
set 类型不允许数据重复,如果添加的数据在 set 中已经存在,将只保留一份
set 虽然与hash的存储结构相同,但是无法启用hash中存储值的空间
Redis应用于同类型不重复数据的合并操作(校验时提供基础数据不要提供校验结果,即图片上的红色所指部分)
sortes_set
1.新的存储需求:数据排序有利于数据的有效展示,需要提供一种可以根据自身特征进行排序的方式
2.需要的存储结构:新的存储模型,可以保存可排序的数据
3.sorted_set类型:在set的存储结构基础上添加可排序字段
4.基本操作
添加数据 zadd key score1 member1 [score2 member2]
获取全部数据
zrange key start stop [WITHSCORES](正向排序,从小到大)
zrevrange key start stop [WITHSCORES](反向操作)
删除数据zrem key member [member ...](按值去的,不是按score去的)
按条件获取数据
zrangebyscore key min max [WITHSCORES] [LIMIT](limit 有一种分页的感觉)
zrevrangebyscore key max min [WITHSCORES]
条件删除数据
zremrangebyrank key start stop zremrangebyscore key min max