redis---非关系型数据库

2023-12-13 12:02:05

关系数据库与非关系型数据库

redis非关系型数据库,又名缓存型数据库。
数据库类型:关系型数据库和非关系型数据库
关系型数据库是一 个机构化的数据库,行和列。
列:声明对象。
行:记录对象属性。
表与表之间的的关联。
sql语句,对指定的表,库,进行增删查改。
在创建表时,我们是设计好了表的结构。按照表结构来存储数据。数据与表结构不匹配,存储数据,会失败。


非关系型数据库:nosql not only sql
不需要定义数据库,也不需要定义表的结构,直接记录即可,而且每条记录都可以有不同的数据类型,字段(字段个数)
redis key:values 键值对形式储存。每个键之间没有直接关联,库与库之间相互独立。

关系型非关系区别
1、数据的储存方式不同。

关系型数据库:库---------->表----------->行、列------------>存储数据

非关系型数据库:库--------->集合---------->键值

2、扩展方向:性能上的提升。关系型数据库靠的是提升本机性能。非关系型关系型数据库可以横向扩展,加入节点服务器的方式提高性能。
3、对事物的支持性,mysql支持事务。
关系型数据库:原子性、隔离性、一致性、持久性
非关系型数据库:也可以支持事务,redise也可以支持事务,但稳定性和处理能力都不如关系型数据库。

非关系型数据的主要场景: 1、操作的扩展
?? ??? ??? ??? ?????????????????????????? 2、海量数据处理

纯动态网站的三高问题:
1、对数据库高并发读写的需求。
2、对海量数据高效存储与访问的需求。
3、对数据库的高扩展性与高可用的需求。

redis非关系型数据库

数据库缓存:

ab85b3cbac974f4dbcd48de88b616dee.png

redis的工作特点:

redis服务器程序是一个单进程模式,即只有一个主进程工作。也就是说在一台服务器上启多个redis(端口号不能冲突)
redis的实际处理速度是完全依靠主进程的执行效率。

服务器只部署了一个redis进程,多个客户端访问,可能会导致redis的处理能力下降
如果部署了多个redis进程,虽然能提高redis的并发处理能力, 但是会给服务器的cpu带来很大的压力。
一台服务器,一般部署3个redis进程。(更具情况来看,高并发要部署多个。)一般的情况,单进程足够)
?

redis的特点:

1、具有极高的读写速度,数据读取每秒110000次,写入数据每秒81000次写入。
2、支持丰富的数据类型。
3、支持持久化。平常的数据保存在内存中,持久化可以写入磁盘中,既可以保存在本地,也可以实现备份。
4、原子性,所有的操作都是原子性
5、支持数据主从模式------master slave模式

rdis为什么这么快?

1、redis纯内存结构,避免了磁盘I/O的耗时
2、核心模块是一个单进程,减少了线程切换和回收线程的时间。
3、redis采用的是I/O多路复用的机制,一条执行线路可以执行读也可以执行写,高并发。
***特殊说明:redis的读写,依旧是单进程处理。

redis部署

yum install -y gcc gcc-c++ make
cd /opt/
将包拖到opt下
tar -xf redis-5.0.7.tar.gz
cd redis-5.0.7/
make -j 4 
make PREFIX=/usr/local/redis install
cd utils/
./install_server.sh
---第四个回车后---
/usr/local/redis/bin/redis-server

ln -s /usr/local/redis/bin/* /usr/local/bin/
vim /etc/redis/6379.conf
70行 加本机ip

redis的服务控制命令:

/etc/init.d/redis_6379 restart
/etc/init.d/redis_6379 status
/etc/init.d/redis_6379 stop
/etc/init.d/redis_6379 start

查看端口是否启动成功

ss -antp | grep redis

32581a03bd0a47fa9c830cd70fa72a8a.png

redis的命令工具:

redis-server:直接启动redis,只能启动
redis-benchmark: 检测redis在本机的运行效率
redis-cli:命令行工具
redis-check-aof: 检测AOF文件是否正常
redis-check-rdb: 检测rdb文件是否正常

redis-benchmark

-h指定服务器的主机名 ip地址
-p指定服务器的端口号
-c指定并发连接数
-n指定请求数
-a指定登陆密码

进入redis命令
1、redis-cil -h 192.168.10.80 -p6379
2、redis-cli 仅限制本地使用,远程访问需要指定ip和端口

redis的五大数据类型

1、 string(字符串)

string是redis最基本的类型,最大能存储512MB的数据,可以存储任何数据

格式:

创建?? ?set 键名 键的值

0a904d8f083a429e80380c74e2105cc2.png

删除 ?? ?del 键名

ce1846df8e1544a0826addf77baa2917.png

查看键值对的值? ? get 键名

44196111ccf54748bfd7556813edd2dd.png

查看所有键值对? ? keys *?

模糊查询?(表示单个字符)? ? ? ? ?*(多个字符)

查看键名生命周期:ttl 键名(秒)

3e69ffbcdb43454fbf3e79ff84bd3cf6.png

APPEND 有则拼接,无则创建输入

????????????????APPEND 键名 键值

2a0ccd0e748c4dda91dc3f739895a056.png

EXISTS?

fec577f8a3d1422aaebf8fbabc687d68.png

STRLEN 标记长度

????????STRLEN 键名

fcf761c9538f4d69aac3c84af61d9c3b.png

INCR ? 自增一????????INCR 键名(只针对数字类型)

12f2a93e0cf441ad9517f88835f78afe.png

DECR? 自减一????????DECR 键名(只针对数字类型)

9595d684c0794682a9bcb8b8eb718e82.png

incrby 键值对 数值

40775d9e33684f7e9d0ae7c6bf65037f.png
decrby 键值对?数值

8b97ad31fbbd44cc9aa94c31b055bfaf.png

EXPIRE?对已有键值对设置生命周期

EXPIRE 键值对名 周期时间

1075e4aeb75147bba67a485973ac7b3a.png
(integer) -1 表示永不过期
(integer) -2 表示已过期

新建时声明键值对的声明周期

setex 键名 生命周期时间 内容

7a072c07c66e4aea8772c35ec4f1d29f.png

mset 键名1  值  键名2  值
mset key1 hello key2 world
#批量设置键
 
keys *
#查看键
 
mget 键名1 键名2
mget key1 key2
#同时打印多个键的值

2、list数据类型

正序查看:RPUSH test1 a b c 1 2 3

倒叙查看:LPUSH test a b c 1 2 3

#创建列表 后面时内容,但是当中的元素还是string类型

192.168.10.80:6379> LPUSH test a b c 1 2 3 
(integer) 6
192.168.10.80:6379> lrange test 0 -1
1) "3"
2) "2"
3) "1"
4) "c"
5) "b"
6) "a"
192.168.10.80:6379> LINDEX test 0
"3"
192.168.10.80:6379> LINDEX test 1
"2"
192.168.10.80:6379> RPUSH test1 a b c 1 2 3
(integer) 6
192.168.10.80:6379> lrange test1 0 -1
1) "a"
2) "b"
3) "c"
4) "1"
5) "2"
6) "3"
192.168.10.80:6379> LINDEX test 0
"3"
192.168.10.80:6379> LINDEX test1 0
"a"
192.168.10.80:6379> LPUSH test 1 2 3 4 5 6
(integer) 6
192.168.10.80:6379> LINDEX test -1
"1"
192.168.10.80:6379> LINDEX test 0
"6"
192.168.10.80:6379> LINDEX test 1
"5"
192.168.10.80:6379> LINDEX test 2
"4"
192.168.10.80:6379> LINDEX test 3
"3"
192.168.10.80:6379> LINDEX test 4
"2"
192.168.10.80:6379> 

list操作命令

lpush quoqi a b c d 12 13
#创建列表 后面时内容,但是当中的元素还是

lrange 键名 0 -1
#查看列表中的数据(倒叙)

lindex 键名 0
#根据索引下标打印数据

lindex 键名 索引号
#根据索引下标打印数据

rpush 键名 1 2 3 4
#创建列表正序查看 从右到左 从右-1开始自增

lrange 键名 0 -1
#正序查看

lrange 键名 1 2
#指定范围查看

RPUSHX test 值
#在test其右侧加入一个值

LPUSH test 值
#在test其左侧加入一个值



lpop  键名
lpop guoqi1
#从左边开始删
 
lrange guoqi1 0 -1
#范围查看键值对内部的值
 
rpop  键名
rpop guoqi1
#从右边开始删
 
lrange guoqi1 0 -1
 
llen  键名
llen guoqi1
#查询列表内的元素
 
lindex  键名  索引下标
lindex guoqi1 3
#指定索引下标查询
 
lrange guoqi1 0 -1
 
linsert 键名   before 索引下标范围
linsert guoqi1 before 3 10
#在指定位置前插入数据
 

3、hash类型

????????hash类型用于存储对象,采用hash格式来进行操作。占用磁盘少,而且占用一个hash可以占用4294967295个键值对

创建:HSET 键名 字段 值
查看:HGET 键名 字段
创建多个:HSET 键名1 字段1 值2 字段2 值 字段3 值3
查看多个:HMGET 键名 字段1 字段2
查看所有字段:HGETALL 键名
删除:HDEL 键名 字段1 字段2
192.168.10.80:6379> HSET test tall 150
(integer) 1
192.168.10.80:6379> HGET test tall
"150"
192.168.10.80:6379> HMSET test age yes sex nan
OK
192.168.10.80:6379> HMGET test tall age sex
1) "150"
2) "yes"
3) "nan"
192.168.10.80:6379> HGETALL test
1) "tall"
2) "150"
3) "age"
4) "yes"
5) "sex"
6) "nan"
192.168.10.80:6379> HDEL test age
(integer) 1
192.168.10.80:6379> HGETALL test
1) "tall"
2) "150"
3) "sex"
4) "nan"
192.168.10.80:6379>

4、set数据类型

????????无序集合元素类型也是string,元素是唯一的,不允许重复。多个集合类型可以进行并集。交集和差集运算.
set 元素类型是唯一的,可以跟踪一些唯一性的数据。只要把对应名称redis,set 可以

创建:SADD 集合名 
查看:SMEMBERS 集合名
随机给出一个元素:SRANDMEMBER 集合名
随机移除一个元素:SPOP 集合名
指定移除:SREM 集合名

5、有序集合

????????有序集合,元素类型也是string,元素唯一,不能重复,每个元素都会关联一个double (小数点)的分数(score,表示权重)可以通过权重的大小,进行排序。元素的权重可以相同。
zset:可以应用到在线积分的排行榜,可以实时更新用户的分数。

创建:
ZADD 集合名 权重1 元素1  权重2 元素2  权重3 元素3
ZADD test1 1 one 2 two 3 three

查看+权重:
ZRANGE 集合名 0 -1 WITHSCORES                   WITHSCORES安照权重来排序
ZRANGE test1 0 -1 withscores

查看不加权重:
ZRANGE 集合名 0 -1
ZRANGE test1 0 -1

获取成员数量:
ZCARD 集合名
ZCARD test1

获取成员数量权重范围 
ZCOUNT 集合名 权重范围
ZCOUNT test1 2 3

删除集合元素        
ZREM 集合名 元素
ZREM test1 three

查看元素权重 
ZSCORE 集合名 元素
ZSCORE test1 two

操作过程

192.168.10.80:6379> ZADD test1 1 one 2 two 3 three
(integer) 3
192.168.10.80:6379> ZRANGE test1 0 -1
1) "one"
2) "two"
3) "three"
192.168.10.80:6379> ZRANGE test1 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
192.168.10.80:6379> ZCARD test1
(integer) 3
192.168.10.80:6379> ZCOUNT test1 2 3
(integer) 2
192.168.10.80:6379> ZREM test1 three
(integer) 1
192.168.10.80:6379> ZRANGE test1 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"
192.168.10.80:6379> ZSCORE test1 two
"2"
192.168.10.80:6379> 

查询redis库

redis的库都是创建好的,有16个库

数字排名:0-15

每个数据库之间互相独立,互不干扰

select [0-15]
#切换库 

dbsize
#查看当前库中键的数量

keys *
查看键


move 键名  库的序号
MOVE test1 1

查看键的类型
type 键名
192.168.10.80:6379> KEYS *
1) "test"
2) "test1"
192.168.10.80:6379> KEYS *
1) "test"
192.168.10.80:6379> SELECT 1
OK
192.168.10.80:6379[1]> KEYS *
1) "test1"
192.168.10.80:6379[1]> 

密码

设置密码
config set requirepass 密码
config set requirepass 123456

在内声明密码
auth 密码
auth 123456

在外生声明密码
redis-cli -h ip -p 6379 -a 密码
redis-cli -h 192.168.10.80 -p 6379 -a 123456

清除库

FLUSHDB
#清除当前库

FLUSHALL
#清空所有库

总结:

redis读写速度快

数据类型:

1、string
2、list
3、hash 对一个键进行多字段操作用于hash 节省内存空间
4、set 元素不能重复,可以定义唯一值
5、zset 元素不能重复,单权重可以重复

面试题:

rdis为什么这么快?
1、redis纯内存结构,避免了磁盘I/O的耗时
2、核心模块是一个单进程,减少了线程切换和回收线程的时间。
3、redis采用的是I/O多路复用的机制,一条执行线路可以执行读也可以执行写,高并发。
***特殊说明:redis的读写,依旧是单进程处理。

文章来源:https://blog.csdn.net/qq_61843057/article/details/134506190
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。