NoSQL概述
1、什么是 NoSQL
NoSQL泛指非关系型的数据库Not Only SQL。
2、NoSQL 数据库的四大分类
- 键值(key-value)存储
- 列存储
- 文档数据库
- 图形数据库
分类 | 相关产品 | 典型应用 | 数据模型 | 优点 | 缺点 |
---|---|---|---|---|---|
键值(key-value) | Tokyo、 Cabinet/Tyrant、Redis、Voldemort、Berkeley DB、Memcached | 内容缓存,主要用于处理大量数据的高访问负载 | 一系列键值对 | 快速查询 | 存储的数据缺少结构化 |
列存储数据库 | Cassandra, HBase, Riak | 分布式的文件系统 | 以列簇式存储,将同一列数据存在一起 | 查找速度快,可扩展性强,更容易进行分布式扩展 | 功能相对局限 |
文档数据库 | CouchDB, MongoDB | Web应用(与Key-Value类似,value是结构化的) | 一系列键值对 | 数据结构要求不严格 | 查询性能不高,而且缺乏统一的查询语法 |
图形(Graph)数据库 | Neo4J, InfoGrid, Infinite Graph | 社交网络,推荐系统等。专注于构建关系图谱 | 图结构 | 利用图结构相关算法 | 需要对整个图做计算才能得出结果,不容易做分布式集群方案 |
MongoDB主要用来解决海量数据的访问效率问题,他是最像关系型数据库的非关系型数据库。
MongoDB 的主要适用场景为:数据不是特别重要(例如通知,推送这些),数据表结构变化较为频繁,数据量特别大,数据的并发性特别高,数据结构比较特别(例如地图的位置坐标),这些情况下用 MongoDB
Memcached主要是用来提高访问关系型数据库的效率问题,只局限于访问。
redis在我看来算是Memcached的升级版,加入了提高数据库写入的功能。
3、NoSQL 的特点
易扩展
灵活的数据模型
大数据量,高性能
高可用
4、为什么需要 NoSQL
随着web2.0互联网的诞生!传统的关系型数据库很难对付web2.0时代!尤其
是超大规模的高并发的社区! 暴露出来很多难以克服的问题,NoSQL在当今大数据环境下发展的十分迅
速,Redis是发展最快的,而且是我们当下必须要掌握的一个技术!
很多的数据类型用户的个人信息,社交网络,地理位置。这些数据类型的存储不需要一个固定的格式!
不需要多月的操作就可以横向扩展的 ! Map<String,Object> 使用键值对来控制!
Redis简介
Redis(Remote Dictionary Server ),即远程字典服务
使用C语言编写的开源NoSQL数据库
高性能Key-Value内存数据库
支持将内存数据持久化到磁盘和即master-slave模式的数据备份(RDB和AOF)
5、大基本数据类型
string(字符串)最基本的数据类型一个redis中字符串value最多可以是512M nx set if not exists
hash(Hash表)
list(列表)
set(无序集合)
zset(sorted set) (有序集合)
下面来对这5种数据结构类型作简单的介绍:
结构类型 | 结构存储的值 | 结构的读写能力 |
---|---|---|
String | 可以是字符串、整数或者浮点数 | 对整个字符串或者字符串的其中一部分执行操作;对象和浮点数执行自增(increment)或者自减(decrement) |
List | 一个链表,链表上的每个节点都包含了一个字符串 | 从链表的两端推入或者弹出元素;根据偏移量对链表进行修剪(trim);读取单个或者多个元素;根据值来查找或者移除元素 |
Set | 包含字符串的无序收集器(unorderedcollection),并且被包含的每个字符串都是独一无二的、各不相同 | 添加、获取、移除单个元素;检查一个元素是否存在于某个集合中;计算交集、并集、差集;从集合里卖弄随机获取元素 |
Hash | 包含键值对的无序散列表 | 添加、获取、移除单个键值对;获取所有键值对 |
Zset | 字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分值的大小决定 | 添加、获取、删除单个元素;根据分值范围(range)或者成员来获取元素 |
3种特殊数据类型
Geospatial 地理位置
推算地理位置的信息,两地之间的距离,方圆几里的人
Hyperloglog
使用基数估计统计网站访客数
Bitmap
统计用户信息,活跃,不活跃! 登录 、 未登录!签到打卡 两个状态的,都可以使用
常用命令
set / get / del /getset
expire
Redis对于过期键有三种清除策略:
被动删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key
主动删除:由于惰性删除策略无法保证冷数据被及时删掉,所以Redis会定期主动淘汰一批已过期的key
当前已用内存超过maxmemory限定时,触发主动清理策略
maxmemory 当前已用内存超过maxmemory限定时,触发主动清理策略
- volatile-lru:只对设置了过期时间的key进行LRU(默认值)
- allkeys-lru : 删除lru算法的key
- volatile-random:随机删除即将过期key
- allkeys-random:随机删除
- volatile-ttl : 删除即将过期的
- noeviction : 永不过期,返回错误
exists
incr
setrange
应用场景
- 缓存
- 限时业务的运用
- 计数器相关问题(网站访问统计)
- 排行榜相关问题
- 任务队列
- 分布式集群架构中的 session 分离
SpringBoot整合
依赖
1 | <dependency> |
配置
1 | ## Redis 配置 |
数据持久化
下面给出一些常用的时间格式
“”0 30 1 ? * * “每天凌晨1:30执行
“0 0 12 * * ?” 每天中午十二点触发
“0 15 10 ? * *” 每天早上10:15触发
“0 15 10 * * ?” 每天早上10:15触发
“0 15 10 * * ? *” 每天早上10:15触发
“0 15 10 * * ? 2005” 2005年的每天早上10:15触发
“0 * 14 * * ?” 每天从下午2点开始到2点59分每分钟一次触发
“0 0/5 14 * * ?” 每天从下午2点开始到2:55分结束每5分钟一次触发
“0 0/5 14,18 * * ?” 每天的下午2点至2:55和6点至6点55分两个时间段内每5分钟一次触发
“0 0-5 14 * * ?” 每天14:00至14:05每分钟一次触发
“0 10,44 14 ? 3 WED” 三月的每周三的14:10和14:44触发
“0 15 10 ? * MON-FRI” 每个周一、周二、周三、周四、周五的10:15触发
Session共享配置
1 | <!--session-redis--> |
Session存储设置
1 | 配置 |
附录
Redis操作复杂数据类型
1 | package com.ctgu.demo; |
项目代码:
关于Redis的参考
👉 Redis命令手册 https://www.redis.net.cn/order/
👉 Redis练习平台 https://try.redis.io/
👉 菜鸟教程 https://www.runoob.com/redis/redis-keys.html
👉 SpringBoot整合Redis https://segmentfault.com/a/1190000017057950