Redis入门篇(1):涉及到Redis概念、Redis下载安装、命令行操作、Redis数据结构、持久化操作
Redis入门篇(2):了解使用Java客户端操作Redis。Redis连接池、实际应用案例。
一.Redis概念
Redis概念: Redis是一款高性能的NOSQL系列的非关系型数据库。
了解redis前,先来理清一些概念。
1.1 什么是NOSQL
NoSQL(NoSQL = Not Only SQL)
,意即“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型的数据库。
百度百科:
- 随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题。
- 而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NOSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
web1.0网站,一般是静态网站,用户只是访问网站,数据都是依靠工作人员来发布和维护的,不能很好的支持大数据存储。
web2.0网站,纯动态的网站,以用户自己为中心。用户可以发布一些自己的资源到网络上,比如说抖音,用户上传自己的短视频到平台上。当好几亿的用户上传数据到服务器上,如果使用关系型数据库,获取、查询用户数据就会非常的慢。这就对数据库大数据存储要求非常高了。
1.1.1 NOSQL和关系型数据库比较
关系型和非关系型数据库比较图:
关系型数据库,像MySQL、Oracle…,特点:
- 1.数据之间有关联关系
- 2.数据存储在电脑硬盘的文件上
非关系型数据库(NOSQL),像Redis、Hbase…,数据格式是“ key:value
”形式,特点:
- 1.数据之间没有关联关系
- 2.数据存储在内存中
重点理解缓存的思想:
比如有需求,经常查询一些不经常变化的数据,像用户的账号。仅仅只使用关系型数据库,频繁查询获取用户的账号是没有必要的。并且降低系统性能,影响用户体验,因为操作关系型数据是非常耗时的,从硬盘中IO读写数据。
这时候,我们就可以利用缓存的思想解决这样的问题。在内存中开辟一块区域,称为缓存,用户获取数据变成从缓存中获取数据。如果缓存中没有数据,就从数据库中查询获取到数据,将数据存放到缓存中,再将数据返回给用户;下次用户再要查询相同的数据的时候,缓存中有数据,就直接返回数据给用户,不需要再和数据库进行交互了,很好提升了整体性能。
非关系数据库的数据特点存储在内存中,所以NOSQL非常适合作为缓存。Redis一个非常重要的功能就是做缓存。
NOSQL和关系型数据库比较
优点:
- 成本:nosql数据库简单易部署,基本都是开源软件,不需要像使用oracle那样花费大量成本购买使用,相比关系型数据库价格便宜
- 查询速度:nosql数据库将数据存储于缓存之中,关系型数据库将数据存储在硬盘中,自然查询速度远不及nosql数据库。
- 存储数据的格式:nosql的存储格式是key,value形式、文档形式、图片形式等等,所以可以存储基础类型以及对象或者是集合等各种格式,而数据库则只支持基础类型。
- 扩展性:关系型数据库有类似join这样的多表查询机制的限制导致扩展很艰难。
缺点:
- 维护的工具和资料有限,因为nosql是属于新的技术,不能和关系型数据库10几年的技术同日而语。
- 不提供对sql的支持,如果不支持sql这样的工业标准,将产生一定用户的学习和使用成本。
- 不提供关系型数据库对事务的处理。
1.1.2 非关系型数据库的优势
- 性能。NOSQL是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过SQL层的解析,所以性能非常高。
- 可扩展性。同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展。
1.1.3 关系型数据库的优势
- 复杂查询。可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询。
- 事务支持。使得对于安全性能很高的数据访问要求得以实现。对于这两类数据库,对方的优势就是自己的弱势,反之亦然。
1.1.4 小结
关系型数据库与NoSQL数据库并非对立而是互补的关系,即通常情况下使用关系型数据库,在适合使用NoSQL的时候使用NoSQL数据库,让NoSQL数据库对关系型数据库的不足进行弥补。
一般会将数据存储在关系型数据库中,在NoSQL数据库中备份存储关系型数据库的数据。
1.1.5 主流的NOSQL产品
1.键值(Key-Value)存储数据库
- 相关产品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
- 典型应用: 内容缓存,主要用于处理大量数据的高访问负载。
- 数据模型: 一系列键值对
- 优势: 快速查询
- 劣势: 存储的数据缺少结构化
2.列存储数据库
- 相关产品:Cassandra, HBase, Riak
- 典型应用: 分布式的文件系统
- 数据模型:以列簇式存储,将同一列数据存在一起
- 优势: 查找速度快,可扩展性强,更容易进行分布式扩展
- 劣势: 功能相对局限
3.文档型数据库
- 相关产品:CouchDB、MongoDB
- 典型应用: Web应用(与Key-Value类似,Value是结构化的)
- 数据模型: 一系列键值对
- 优势: 数据结构要求不严格
- 劣势: 查询性能不高,而且缺乏统一的查询语法
4.图形(Graph)数据库
- 相关数据库:Neo4J、InfoGrid、Infinite Graph
- 典型应用:社交网络
- 数据模型:图结构
- 优势:利用图结构相关算法。
- 劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。
知道了以上内容,再来看看Redis就比较清晰了。
1.2 什么是Redis
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供测试数据(50个并发执行100000个请求,读的速度是110000次/s,写的速度是81000次/s )且Redis通过提供多种键值数据类型来适应不同场景下的存储需求。
目前为止Redis支持的键值数据类型如下(重点):
1) 字符串类型 string
2) 哈希类型 hash
3) 列表类型 list
4) 集合类型 set
5) 有序集合类型 sortedset
1.2.1 Redis的应用场景
Redis在实际应用非常的广发:
- 缓存(数据查询、短连接、新闻内容、商品内容等等)
- 聊天室的在线好友列表
- 任务队列。(秒杀、抢购、12306等等)
- 应用排行榜
- 网站访问统计
- 数据过期处理(可以精确到毫秒
- 分布式集群架构中的session分离
二.Redis下载安装
官网:https://redis.io,下载比较慢。
也可以在中文网下载,较快:http://www.redis.net.cn/,电脑操作系统对应的Redis版本下载,下载后是一个压缩包。
压缩包解压后直接可以使用:
打开redis文件夹:
文件说明:
- redis.windows.conf:redis配置文件
- redis-cli.exe:redis的客户端
- redis-server.exe:redis服务器端
三.Redis命令操作,Redis数据结构
使用Redis有两种方式:
- 一种是通过redis命令行的方式操作;
- 另一种是通过Java代码(或其它语言)的方式来操作redis,后面介绍。
操作redis最主要的就是数据的存储和获取了,那我们就需要了解redis的数据结构,redis的数据结构是学习redis非常重要的一块。
3.1 redis的数据结构
redis存储的是:"key,value
"格式的数据,其中key都是字符串类型,value有5种不同的数据结构:
redis存储数据可以看成是一个大的Map集合.
value的数据结构:
- 字符串类型 string
- 哈希类型 hash :可以理解为map格式
- 列表类型 list : 就像Java中的LinkedList格式。支持重复元素
- 集合类型 set : 就像Java中的HashSet格式。不允许重复元素
- 有序集合类型 sorted set:不允许重复元素,且元素有顺序,元素存入后会自动排序。
下面就使用命令行的形式操作这些数据结构。
3.2 字符串类型string
命令行指令:
- 存储数据:
set key value
- 获取数据:
get key
- 删除数据:
del key
先打开redis服务器端redis-server.exe,再打开redis的客户端redis-cli.exe,再进行命令行操作
演示:
(integet) 1 :表示被操作影响的元素个数
(nil):表示不存在
3.3 哈希类型 hash
存储的value,可以理解为map格式。命令行指令:
1.存储: hset key field value
2.获取:
hget key field
: 获取指定的field对应的值hgetall key
:获取所有的field和value
3.删除: hdel key field
演示:
3.4 列表类型 list
列表类型list:可以添加一个元素到列表的头部(左边)或者尾部(右边),允许重复元素。命令行指令:
1.添加:
lpush key value
: 将元素加入列表左表rpush key value
:将元素加入列表右边
2.获取:
lrange key start end
:范围获取
3.删除:
lpop key
: 删除列表最左边的元素,并将元素返回rpop key
: 删除列表最右边的元素,并将元素返回
演示:
lrange myList 0 -1:表示查询myList列表的所有元素
注意:命令行指令不区分大小写,数据的键值对区分大小写。
3.5 集合类型 set
集合类型 set : 不允许重复元素。命令行指令:
1.存储:sadd key value
2.获取:
smembers key
:获取set集合中所有元素
3.删除:
srem key value
:删除set集合中的某个元素
演示:
3.6 有序集合类型 sorted set
有序集合类型 sortedset:不允许重复元素,且元素有顺序。每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
命令行指令:
1.存储:zadd key score value
2.获取:zrange key start end [withscores]
zrange key 0 -1
:获取所有元素zrange key 0 -1 withscores
:获取所有元素以及每个元素关联的分数。
3.删除:zrem key value
:删除key中指定的value
演示:
3.7 通用命令
常见的redis命令行通用指令:
keys *
: 查询所有的键type key
: 获取键对应的value的类型del key
:删除指定的key value数据
演示:
本文仅演示了常用的命令行指令,更多指令可以参考:Redis 教程 | 菜鸟教程
四.Redis持久化操作
4.1 Redis持久化是什么?
redis是一个内存数据库,当redis服务器重启,或者电脑重启,数据就会丢失。要想不丢失,就需要对内存中的数据进行持久化操作,我们可以将Redis内存中的数据持久化保存到电脑硬盘的文件中,意外重启后redis就会加载硬盘中的数据,确保数据不会丢失。
4.2 Redis持久化机制
redis持久化有两种不同的机制:RDB和AOF;
1.RDB:默认方式,不需要进行配置,默认就使用这种机制
RDB机制
是redis在一定的间隔时间中,检测key的变化情况,然后持久化数据。推荐使用默认机制,该机制下对性能的影响比较低,比较少的IO操作。
RDB配置方式:
1.1 编辑redis.windwos.conf配置文件,找到文件中如下代码
save 900 1
save 300 10
save 60 10000
解释一下:
# 如果900秒(15分钟)后至少有1个key改变的话,就持久化一次
save 900 1
# 如果300秒(5分钟)后至少有10个key改变的话,就持久化一次
save 300 10
# 如果60秒后至少有10000个key改变的话,就持久化一次
save 60 10000
根据实际需求,修改相应的值后保存就可以了。配置成功还需要完成第二步。
1.2 重新启动redis服务器,并指定配置文件名称
打开控制台黑窗口,进入redis的文件夹,为redis的服务器指定配置文件,指令为:
redis-server.exe redis.windows.conf
到这RDB配置完成。redis每次持久化后会在redis文件夹下生成一个dump.rdb
的持久化文件,重启redis就会加载 .rdb
文件里面的数据。
2.AOF:日志记录的方式,可以记录每一条命令的操作。可以每一次命令操作后,持久化数据
AOF机制
,redis执行一次命令就会持久化一次。不推荐使用,对性能的影响比较大。
AOF配置方式:
2.1 编辑redis.windwos.conf配置文件,找到文件中如下代码
appendonly no
# appendfsync always
appendfsync everysec
# appendfsync no
解释一下:
appendonly no(关闭aof)--> appendonly yes (开启aof)
AOF机制默认关闭,no改为yse意味着开启AOF机制。下面是一些AOF操作相关配置:
appendfsync always
: 每一次操作都进行持久化,性能不好。appendfsync everysec
: 每隔一秒进行一次持久化,性能不好。appendfsync no
: 不进行持久化
使用什么持久化操作,改变一下注释即可。配置成功还需要完成第二步,参照RDB配置第二步。
到这AOF配置完成。redis每次持久化后会在redis文件夹下生成一个appendonly.aof
的持久化文件,重启redis就会加载 .aof
文件里面的数据。
总结:AOF持久化
对数据库性能影响比较大,会有频繁的IO操作;而RDB机制
则可能会丢失部分数据。所以Redis持久化并不能保证所有的数据都不会丢失,只能保证大部分数据不丢失。这样的内存数据库并不是绝对安全的,所以要想保证数据绝对安全,还是得依赖一些关系型数据库。
以上就是Redis入门篇(1)的全部内容。Redis入门篇(2)重点实际应用中如何使用Redis。
推荐阅读:
Redis入门篇(1).
Redis入门篇(2).
欢迎点赞评论,指出不足,笔者由衷感谢哦!~