NoSQL非关系型数据库Redis (键值对(key-value)数据库) 学习笔记
redis是一款高性能的NOSQL系列的非关系型数据库
1.1.什么是NOSQL
NoSQL(NoSQL = Not Only SQL),意即“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型的数据库。
随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
1.1.1. NOSQL和关系型数据库比较
优点:
1)成本:nosql数据库简单易部署,基本都是开源软件,不需要像使用oracle那样花费大量成本购买使用,相比关系型数据库价格便宜。
2)查询速度:nosql数据库将数据存储于缓存之中,关系型数据库将数据存储在硬盘中,自然查询速度远不及nosql数据库。
3)存储数据的格式:nosql的存储格式是key,value形式、文档形式、图片形式等等,所以可以存储基础类型以及对象或者是集合等各种格式,而数据库则只支持基础类型。
4)扩展性:关系型数据库有类似join这样的多表查询机制的限制导致扩展很艰难。
缺点:
1)维护的工具和资料有限,因为nosql是属于新的技术,不能和关系型数据库10几年的技术同日而语。
2)不提供对sql的支持,如果不支持sql这样的工业标准,将产生一定用户的学习和使用成本。
3)不提供关系型数据库对事务的处理。
1.1.2. 非关系型数据库的优势:
1)性能NOSQL是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过SQL层的解析,所以性能非常高。
2)可扩展性同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展。
1.1.3. 关系型数据库的优势:
1)复杂查询可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询。
2)事务支持使得对于安全性能很高的数据访问要求得以实现。对于这两类数据库,对方的优势就是自己的弱势,反之亦然。
1.1.4. 总结
关系型数据库与NoSQL数据库并非对立而是互补的关系,即通常情况下使用关系型数据库,在适合使用NoSQL的时候使用NoSQL数据库,
让NoSQL数据库对关系型数据库的不足进行弥补。
一般会将数据存储在关系型数据库中,在nosql数据库中备份存储关系型数据库的数据
1.2.主流的NOSQL产品
• 键值(Key-Value)存储数据库
相关产品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
典型应用: 内容缓存,主要用于处理大量数据的高访问负载。
数据模型: 一系列键值对
优势: 快速查询
劣势: 存储的数据缺少结构化
• 列存储数据库
相关产品:Cassandra, HBase, Riak
典型应用:分布式的文件系统
数据模型:以列簇式存储,将同一列数据存在一起
优势:查找速度快,可扩展性强,更容易进行分布式扩展
劣势:功能相对局限
• 文档型数据库
相关产品:CouchDB、MongoDB
典型应用:Web应用(与Key-Value类似,Value是结构化的)
数据模型: 一系列键值对
优势:数据结构要求不严格
劣势: 查询性能不高,而且缺乏统一的查询语法
• 图形(Graph)数据库
相关数据库:Neo4J、InfoGrid、Infinite Graph
典型应用:社交网络
数据模型:图结构
优势:利用图结构相关算法。
劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。
1.3 什么是Redis
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供测试数据,50个并发执行100000个请求,读的速度是110000次/s,写的速度是81000次/s ,且Redis通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如下:
1) 字符串类型 string
2) 哈希类型 hash
3) 列表类型 list
4) 集合类型 set
5) 有序集合类型 sortedset
1.3.1 redis的应用场景
• 缓存(数据查询、短连接、新闻内容、商品内容等等)
• 聊天室的在线好友列表
• 任务队列。(秒杀、抢购、12306等等)
• 应用排行榜
• 网站访问统计
• 数据过期处理(可以精确到毫秒
• 分布式集群架构中的session分离
1.4 Redis 下载与安装
官网:https://redis.io/
中文网: https://www.redis.net.cn/
Linux版下载,(5.0.4 2019年发布) : http://download.redis.io/releases/
GitHub上有Windows版本,(3.0.504 2016年发布) 地址是:https://github.com/MicrosoftArchive/redis
Linux版本的安装
$ tar zxvf redis-5.0.4.tar.gz
$ cd redis-5.0.4
$ make
$ src/redis-server #启动服务器端
$ src/redis-cli #启动客户端
redis> set foo bar #存储一个键值对
OK
redis> get foo #查看刚刚的键
"bar"
can't connect to redis-server
安装完Linux服务器上的redis后,在windows本地上使用 RedisDesktopManager连接该redis后一直报can't connect to redis-server
解决方案如下:
https://blog.csdn.net/gwd1154978352/article/details/79339195
修改配置文件 redis.conf
daemonize yes #136行 no改为yes
# bind 127.0.0.1 #69行注释掉
protected-mode no #88行 yes改为no
再次启动时候,加上配置参数
src/redis-server redis.conf
1.5 Redis 中文网里面的命令操作指南
https://www.redis.net.cn/order/
Redis 字符串(String) 命令
Redis 列表(List) 命令
Redis 哈希(Hash) 命令--Map
Redis 集合(Set) 命令
Redis 有序集合(sorted set) 命令
1.6 Redis 字符串常用命令,其它命令参考官方文档说明即可.
- > GET KEY_NAME
- 返回 key 的值,如果 key 不存在时,返回 nil。 如果 key 不是字符串类型,那么返回一个错误。
- > SET KEY_NAME VALUE
- 在 Redis 2.6.12 以前版本, SET 命令总是返回 OK 。
- 从 Redis 2.6.12 版本开始, SET 在设置操作成功完成时,才返回 OK
- > APPEND KEY_NAME NEW_VALUE
- 返回 追加指定值之后, key 中字符串的长度。
- > PSETEX key1 EXPIRY_IN_MILLISECONDS value1
- 设置成功时,返回OK。
1.7 Redis 哈希(Hash)常用命令,其它命令参考官方文档说明即可.
- > HSET KEY_NAME FIELD VALUE
- 如果字段是哈希表中的一个新建字段,并且值设置成功,返回 1 。 如果哈希表中域字段已经存在且旧值已被新值覆盖,返回 0 。
- > HGET KEY_NAME FIELD_NAME
- 返回给定字段的值。如果给定的字段或 key 不存在时,返回 nil
- > HGETALL KEY_NAME
- 以列表形式返回哈希表的字段及字段值。 若 key 不存在,返回空列表。
- > HDEL KEY_NAME FIELD1.. FIELDN
- 被成功删除字段的数量,不包括被忽略的字段
1.8 Redis 列表(List)常用命令,其它命令参考官方文档说明即可.
- > LPUSH KEY_NAME VALUE1.. VALUEN
- Lpush 命令将一个或多个值插入到列表头部(最左边)
- 执行 LPUSH 命令后,返回列表的长度。
- 在Redis 2.4版本以前的 LPUSH 命令,都只接受单个 value 值
- > RPUSH KEY_NAME VALUE1..VALUEN
- 用于将一个或多个值插入到列表的尾部(最右边)。
- 执行 RPUSH 操作后,返回列表的长度。
- 在Redis 2.4版本以前的 RPUSH 命令,都只接受单个 value 值
- > LRANGE KEY_NAME START END
- Lrange 返回列表中指定区间内的元素,区间以偏移量 START 和 END 指定。 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
- 返回一个列表,包含指定区间内的元素
- > LLEN KEY_NAME
- 移除并返回列表的第一个元素。 当列表 key 不存在时,返回 nil 。
- > RPOP KEY_NAME
- 移除并返回列表的最后一个元素。 当列表不存在时,返回 nil 。
1.9 Redis 集合(Set)常用命令,其它命令参考官方文档说明即可.
- > SADD KEY_NAME VALUE1..VALUEN
- 将一个或多个成员元素加入到集合中,已经存在于集合的成员元素将被忽略
- 在Redis2.4版本以前, SADD 只接受单个成员值
- 返回被添加到集合中的新元素的数量,不包括被忽略的元素。
- > SMEMBERS KEY VALUE
- 返回集合中的所有成员。
- > SREM KEY MEMBER1..MEMBERN
- Srem 命令用于移除集合中的一个或多个成员元素,不存在的成员元素会被忽略
- 在 Redis 2.4 版本以前, SREM 只接受单个成员值。
- 被成功移除的元素的数量,不包括被忽略的元素。
1.10 Redis 有序集合(SortedSet)常用命令,其它命令参考官方文档说明即可.
- > ZADD KEY_NAME SCORE1 VALUE1.. SCOREN VALUEN
- 用于将一个或多个成员元素及其分数值加入到有序集当中
- 如果某个成员已经是有序集的成员,那么更新这个成员的分数值,并通过重新插入这个成员元素,来保证该成员在正确的位置上
- 分数值可以是整数值或双精度浮点数(分数值是排序的依据)
- 在 Redis 2.4 版本以前, ZADD 每次只能添加一个元素
- 返回被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员。
- > ZRANGE key start stop [WITHSCORES]
-
其中成员的位置默认按分数值递增(从小到大)来排序。
-
下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。
你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。
- 返回指定区间内,带有分数值(可选)的有序集成员的列表。
-
- > Zrem key member
- 在 Redis 2.4 版本以前, ZREM 每次只能删除一个元素。
- Zrem 命令用于移除有序集中的一个或多个成员,不存在的成员将被忽略
- 返回被成功移除的成员的数量,不包括被忽略的成员。
-
1.11 Redis 通用命令,其它命令参考官方文档说明即可.
- > KEYS PATTERN
- PATTERN 正则表达式
- 返回符合给定模式的 key 列表 (Array)。
- > TYPE KEY_NAME
- 返回 key 的数据类型,数据类型有:
- none (key不存在)
- string (字符串)
- list (列表)
- set (集合)
- zset (有序集)
- hash (哈希表)
- > DEL KEY_NAME
-
返回被删除 key 的数量
1.12 Redis持久化
Redis是一个内存数据库,当Redis重启后数据会丢失;所以我们要将内存中的数据持久化。
它不能保证所有的内存数据都能持久化而不丢失,只能保证大多数数据。
Redis持久化机制
1) RDB 默认使用这种机制, 在一定间隔时间中,监测key的变化情况,然后持久化数据
对性能影响小,推荐的方式. 生成的持久化文件就是 dump.rdb
redis.conf配置文件中配置的如下内容就是RDB机制
2) AOF 日志记录的方式,可以记录每一条命令的操作,可以每一次命令操作后持久化.
对性能影响大 生成的持久化文件就是 appendonly.aof
1.13 Java客户端 Jedis
Jedis是Java操作Redis数据库的工具, 类似于导入一个mysql-connector-java.jar包就能通过jdbc操作mysql数据库.
1. 提前下载jar包(如下截图的)
2. 在IDEA中 File-->New-->Project-->Java Enterprise-->勾选 Create project from template-->填项目名称及其选择路径.
3. 新建lib文件夹,将包拷贝到lib目录,并且选中lib目录,右键Add as Library
4.新建包和类,类内容如下截图
5.运行测试类,到Redis客户端工具查看结果.
1.14 Java客户端 Jedis工具类
未经作者 https://www.cnblogs.com/xin1006/ 梦相随1006 同意,不得擅自转载本文,否则后果自负