NoSQL简介
NoSQL数据库是一种非关系型数据库,它在处理大规模、高并发的动态网站数据时具有明显优势。NoSQL数据库的出现是为了解决传统关系数据库在处理大数据量和高并发请求时遇到的性能瓶颈。NoSQL数据库的设计允许它们在分布式环境中更有效地扩展,同时提供灵活的数据模型来适应不断变化的数据需求。
NoSQL的四大分类
1. 键值(Key-Value)存储数据库
- 特点:这种类型的数据库使用一个简单的键值对模型,其中键是一个唯一的标识符,值是与键相关联的数据。这种模型易于实现和部署,但在需要查询或更新部分数据时,效率可能较低。
- 相关产品:
- Redis:一个开源的、基于内存的键值存储,常用作数据库、缓存或消息代理。
- Tokyo Cabinet/Tyrant:一个持久化的键值存储系统,支持多种数据类型和原子操作。
- SSDB:一个基于磁盘的键值存储系统,支持多种数据类型和持久化。
- Voldemort:一个分布式键值存储系统,用于处理大规模数据集。
- Oracle BDB:Oracle提供的高性能、可扩展的键值存储解决方案。
2. 列存储数据库
- 特点:这种类型的数据库适用于处理大量数据,其中数据按列存储,这使得查询特定列变得非常高效。列存储数据库通常用于时间序列数据、日志数据和其他需要高效写入和查询的场景。
- 相关产品:
- Cassandra:一个分布式NoSQL数据库,设计用于处理大量数据跨多个数据中心。
- HBase:一个分布式、可扩展的大数据存储系统,建立在Hadoop之上。
- ClickHouse:一个用于在线分析处理(OLAP)的列式数据库管理系统。
3. 文档型数据库
- 特点:文档型数据库存储半结构化的文档,如JSON或BSON格式。这些数据库提供了比键值数据库更丰富的查询功能,并且可以存储复杂的数据结构。
- 相关产品:
- MongoDB:一个流行的开源文档型数据库,支持高吞吐量的数据持久化。
- CouchDB:一个使用HTTP和JSON的分布式、面向文档的数据库。
- SequoiaDB:一个支持SQL的文档型数据库,适用于处理大规模数据集。
4. 图形(Graph)数据库
- 特点:图形数据库使用图形模型来存储和查询数据,这使得它们非常适合处理复杂的关系和网络结构。图形数据库在社交网络分析、推荐系统和路径查找等领域有广泛应用。
- 相关产品:
- Neo4J:一个高性能的图形数据库,支持ACID事务和丰富的图形查询语言Cypher。
- InfoGrid:一个分布式图形数据库,支持大规模图形数据的存储和查询。
- Infinite Graph:一个可扩展的图形数据库,提供高性能的图形查询能力。
NoSQL应用场景
NoSQL数据库适用于以下场景:
- 数据模型简单:当数据结构不复杂,且不需要复杂的事务支持时。
- 需要灵活的IT系统:当系统需要快速适应数据模型的变化时。
- 对数据库性能要求高:当需要处理大量数据和高并发请求时。
- 不需要高度数据一致性:当可以接受最终一致性模型,以换取更好的性能和可扩展性时。
Redis概述
Redis(Remote Dictionary Server)是一个开源的、基于内存的数据结构存储系统,它可以用作数据库、缓存、消息中间件和流引擎。Redis以其高性能和低延迟而闻名,特别适合实时数据存储和访问。
Redis特点
高性能
- Redis的所有操作都是内存中进行的,这意味着它的读写速度非常快。内存中的数据存储方式使得Redis能够处理大量的并发请求,而不会出现传统磁盘数据库那样的性能瓶颈。
丰富的数据类型
- Redis支持多种数据类型,包括字符串(string)、列表(list)、集合(set)、有序集合(sorted set)和哈希(hash)。这些数据类型为开发人员提供了灵活的方式来存储和处理数据。
持久化
- 尽管Redis是基于内存的,但它提供了持久化机制,可以将内存中的数据保存到磁盘上。这确保了即使在系统崩溃后,数据也不会丢失。Redis支持两种持久化方式:快照(RDB)和追加文件(AOF)。
单线程、单进程
- Redis的单线程模型意味着它在处理客户端请求时不需要考虑线程安全问题。这简化了Redis的内部实现,并有助于提高性能。然而,这也意味着Redis的性能受限于单个CPU核心的处理能力。尽管如此,Redis仍然能够通过优化内存管理和网络I/O来实现高吞吐量。
Redis的这些特点使其成为许多现代应用程序的理想选择,特别是在需要高性能和可扩展性的场景中。
Redis详细安装步骤
以下是Redis安装的详细步骤,包括环境准备、下载、安装和启动服务,需要注意的是,安装和配置过程中相关一些的命令需要在特定的目录下才能执行
环境准备
- 虚拟机软件:使用VMware 12.x或以上版本。
- 操作系统:使用CentOS 7.x或以上版本。
下载Redis源码包
- 访问Redis官方网站:https://redis.io/
- 下载Redis源码包,例如
redis-7.0.0.tar.gz
。
上传源码包到Linux
将下载的源码包上传到你的Linux服务器
解压缩文件
在Linux服务器上,使用以下命令解压缩Redis源码包(这里我们选择解压到上级目录):
tar -zxvf redis-7.0.0.tar.gz -C ../
安装gcc
Redis的编译需要gcc编译器,如果系统中尚未安装,可以使用以下命令安装(进入到解压目录里安装):
yum install -y gcc
yum install -y tcl
分别执行两个命令,安装过程不报错即可安装成功
编译Redis
进入解压缩后的Redis目录,并执行编译命令:
make MALLOC=libc
安装Redis
使用以下命令安装Redis到指定目录:
make install PREFIX=/usr/local/soft/redis
配置环境变量(在/usr/local/soft/redis目录下)
为了在任意目录下执行Redis命令,可以设置环境变量:
vim /etc/profile
添加如下变量并保存退出(wq)
export REDIS_HOME=/usr/local/soft/redis
export PATH=.:$PATH:$REDIS_HOME/bin
执行source命令使环境变量生效
source /etc/profile
启动Redis服务(验证redis是否安装成功,并且可以使用)
这里选择在soft目录下新建bigdata32目录,并在bigdata32中新建redis-test目录,进入redis-test启动redis服务(这里看自己需求创建目录即可,创建目录使用命令mkdir-目录名)
redis-server
查看当前是否有redis服务
ps aux|grep redis
修改端口号
由于在哪里启动redis哪个目录就是一个数据库,一台服务器可以有多个redis服务,但redis端口号默认是6379,当启动多个服务时会发生端口号冲突导致启动服务失败
解决方案是要修改Redis服务的端口号,需要编辑redis.conf
配置文件中的port
设置。配置文件通常位于Redis-7.0.0的安装目录下。
修改前,这里先选择在bigdata32目录下新建redis-ports文件夹,在里面创建7000和7001两个文件夹(一个存放7000端口号一个存放7001,端口号可以自行修改只要不和其他的端口号冲突即可),现在7000和7001两个文件里都是空的,我们需要将配置文件复制过来
创建7000和7001
mkdir7000
mkdir7001
复制配置文件(注意路径是否和自己的路径一样)
cp /usr/local/soft/jars/redis-7.0.0/redis.conf ./7000/
cp /usr/local/soft/jars/redis-7.0.0/redis.conf ./7001/
复制完成后进入7000目录下修改redis.conf文件
vim redis.conf
进入配置文件后找到端口号6379修改为7000
修改后先不要急着退出,这里还需要修改两个参数,否者是无法使用第三方可视化工具连接redis的,具体如下图(应该是在配置文件中端口号的上面去找),修改成和图中一样即可,记得使用wq保存并退出
检验是否修改成
指定当前目录去启动redis
redis-server ./redis.conf
到这里就基本修改完成了,另一个7001的配置文件和7000的一样去修改就行了
6379端口号的只要修改后面两个参数就行了
测试使用客户端连接Redis服务
使用Redis客户端连接到Redis服务,要连接到特定IP地址和端口号上的Redis服务,可以使用以下命令:
./redis-cli -h localhost -p 7000
其中./表示当前目录下 -h 服务器的ip地址 -p 端口号
如果Redis服务运行在默认端口(6379)上,可以省略-p 6379
参数(默认就是6379)。
Redis数据库相关指令
Redis基本数据类型及操作指令
1. String类型
- 内存存储模型:简单的key/value对,value可以是字符串、整数或浮点数。
- 常用操作命令:
set
:设置key的值。get
:获取key的值。mset
:同时设置多个key-value对。mget
:同时获取多个key的值。getset
:获取key的值,并设置新的值。strlen
:获取key值的长度。append
:向key的值追加字符串。getrange
:获取key值的子字符串。setex
:设置key的值,并指定过期时间(秒)。psetex
:设置key的值,并指定过期时间(毫秒)。setnx
:如果key不存在,则设置key的值。decr
:将key的整数值减1。decrby
:将key的整数值减去指定数值。incr
:将key的整数值加1。incrby
:将key的整数值加上指定数值。incrbyfloat
:将key的浮点数值加上指定浮点数值。
2. List类型
- 内存存储模型:元素有序且可重复的列表,可以作为栈或队列使用。
- 常用操作指令:
lpush
:在列表左侧插入元素。lpushx
:仅当列表存在时,在左侧插入元素。rpush
:在列表右侧插入元素。rpushx
:仅当列表存在时,在右侧插入元素。lpop
:从列表左侧弹出元素。rpop
:从列表右侧弹出元素。lrange
:获取列表指定范围内的元素。llen
:获取列表长度。lset
:设置列表指定索引的元素。lindex
:获取列表指定索引的元素。lrem
:移除列表中与给定值相等的元素。ltrim
:修剪列表,保留指定范围内的元素。linsert
:在列表中的元素前或后插入新元素。
3. Set类型
- 特点:元素无序且不可重复的集合。
- 常用命令:
sadd
:向集合添加元素。smembers
:获取集合的所有元素。scard
:获取集合的元素个数。spop
:随机弹出集合中的一个元素。smove
:将元素从源集合移动到目标集合。srem
:从集合中移除元素。sismember
:检查元素是否是集合的成员。srandmember
:随机返回集合中的一个或多个元素。sdiff
:返回两个集合的差集。sinter
:返回两个集合的交集。sunion
:返回两个集合的并集。
4. ZSet类型
- 特点:可排序的set集合,元素不可重复,每个元素关联一个分数。
- 常用命令:
zadd
:向有序集合添加元素。zcard
:获取有序集合的元素个数。zrange
:按分数从小到大获取有序集合的元素。zrevrange
:按分数从大到小获取有序集合的元素。zrangebyscore
:按分数范围获取有序集合的元素。zrank
:获取元素在有序集合中的排名。zrevrank
:获取元素按分数从大到小在有序集合中的排名。zscore
:获取元素的分数。zrem
:移除有序集合中的元素。zincrby
:有序集合中元素的分数增加指定数值。
5. Hash类型
- 特点:value是一个map结构,key无序,适合存储对象。
- 常用命令:
hset
:为哈希表添加字段。hget
:获取哈希表中字段的值。hgetall
:获取哈希表中所有的字段和值。hdel
:删除哈希表中的字段。hexists
:检查字段是否存在于哈希表中。hkeys
:获取哈希表中所有的字段名。hvals
:获取哈希表中所有的值。hmset
:同时设置哈希表中的多个字段。hmget
:同时获取哈希表中的多个字段的值。hsetnx
:仅当字段不存在时设置字段的值。hincrby
:哈希表中字段的整数值增加指定数值。hincrbyfloat
:哈希表中字段的浮点数值增加指定浮点数值。
可视化工具(连接时都要先启动redis服务)
DataGrip(在IDEA官网就能找到,好用但是需要收费,只能试用一个月)
https://www.jetbrains.com.cn/datagrip/promo/
Redis Insight(redis官方提供的,免费的)
https://redis.io/insight/
连接步骤和DataGrip相似
使用JAVA连接redis
在开始之前,请确保你已经添加了 Jedis 依赖到你的项目中。如果你使用的是 Maven,可以在 pom.xml
文件中添加以下依赖:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>版本号</version>
</dependency>
测试连接
使用示例
String 类型操作
String 类型是 Redis 中最基本的数据结构,对应的 Java 操作如下:
// 设置 key-value 对
jedis.set("name", "法海");
// 获取 value
String name = jedis.get("name");
System.out.println(name);
// 设置 key 的过期时间,单位为秒
jedis.expire("name", 10);
// 检查 key 是否存在
boolean exists = jedis.exists("name");
System.out.println(exists);
List 类型操作
List 类型是一个有序列表,可以进行两端添加和删除操作。
// 将多个值添加到列表的头部
long listLength = jedis.lpush("list1", "hello", "world", "apple");
System.out.println("List length: " + listLength);
// 获取列表中的元素
List<String> listElements = jedis.lrange("list1", 0, -1);
System.out.println("List elements: " + listElements);
Set 类型操作
Set 类型是一个无序集合,可以添加、删除和查询元素。
// 向集合中添加元素
jedis.sadd("set1", "cat", "dog", "fish");
// 获取集合中的所有元素
Set<String> setMembers = jedis.smembers("set1");
System.out.println("Set members: " + setMembers);
ZSet 类型操作
ZSet 类型是一个有序集合,每个元素都有一个分数与之关联。
// 向有序集合中添加元素
HashMap<String, Double> scoreMap = new HashMap<>();
scoreMap.put("小白", 100.0);
scoreMap.put("小青", 50.1);
scoreMap.put("小花", 120.2);
scoreMap.put("小马", 99.3);
jedis.zadd("scores", scoreMap);
// 获取有序集合中分数在指定范围内的元素
List<Tuple> scores = jedis.zrangeByScoreWithScores("scores", 50, 200);
for (Tuple score : scores) {
String element = score.getElement();
double scoreValue = score.getScore();
System.out.println(element + "-" + scoreValue);
}
Hash 类型操作
Hash 类型是一个键值对集合,适合存储对象。
// 向哈希表中添加字段
HashMap<String, String> studentMap = new HashMap<>();
studentMap.put("name", "小白");
studentMap.put("age", "18");
studentMap.put("sex", "女");
studentMap.put("clazz", "一班");
jedis.hset("student", studentMap);
// 获取哈希表中的所有字段和值
Map<String, String> student = jedis.hgetAll("student");
for (Map.Entry<String, String> entry : student.entrySet()) {
System.out.println(entry.getKey() + "-" + entry.getValue());
}
断开连接
最后,不要忘记关闭与 Redis 的连接。
jedis.close();
以上是 Redis 五种基本数据类型的操作示例,包括 String、List、Set、ZSet 和 Hash。每个示例都包含了详细的代码解析注释,帮助你更好地理解和使用 Redis。
注意事项
- 防火墙设置:确保Linux服务器的防火墙设置允许Redis服务使用的端口。
- 端口占用:检查是否有其他服务占用了Redis服务的端口,可以使用
netstat -tulnp
命令查看端口使用情况。
通过以上步骤,你可以成功安装并使用Redis数据库。可视化工具可以帮助你更直观地管理和操作Redis数据。
标签:截图,key,Redis,数据库,元素,redis,详细,集合 From: https://www.cnblogs.com/bjynjj/p/18503740