redis非关系型数据库

2023-12-17 20:41:28

redis非关系型数据库,缓存型数据库

关系型数据库和非关系型数据库的区别:

关系型数据库是一个机构化的数据库,行和列。

列:声明对象

行:记录对象的属性

表与表之间是有关联。使用sql语句,来对指定的表,库,进行增删改查

在创建表时,我们是设计好了表的结构。按照表结构来存储数据。数据与表结构不匹配,存储数据,会失败。

非关系型数据库:nosql not only sql

不需要定义库,也不需要定义表结构,直接记录即可,而且每条记录都可以有不同的数据类型,字段(字段个数)

redis key:value 键值对形式存储。每个键之间没有直接关联。库与库之间互相独立。

区别:

  1. 数据的存储方式不同
  2. 扩展方式,性能上的提升。关系型数据库靠的是提升本机性能。非关系型数据库,可以横向扩展,加入节点服务器的方式提高性能
  3. 对事务的支持性,mysql支持事务

原子性 隔离性 一致性 持久性

非关系型数据库也支持事务,redis也可以支持事务,但是稳定性和处理能力都不如关系型数据库。

非关系型数据的主要场景:1.操作的扩展

  1. 海量数据处理 ????????????

Web2.0主要功能:交互

纯动态网站的三高问题:

  1. 对数据库高并发读写的需求
  2. 对海量数据高效存储与访问的需求
  3. 对数据库的高可扩展性与高可用性的需求

数据库缓存:

Web页面缓存

cpu和硬盘之间缓存

常见的缓存需求场景

关系型数据库:

库————表————行,列————存储数据

非关系型数据库:

库————集合————键值对

不需要手动的创建库和集合

redis:开源的,使用c语言编写的NQL数据库

redis:基于内存的运行,支持持久化(数据恢复)。采用的就是key-value(键值对)的存储形式。目前在分布式架构中,非常重要的一环。

Redis服务器程序,是一个单进程模式,即只有一个主进程工作。也就是说在一台服务器上可以启动多个redis(端口号不能冲突)

Redis的实际处理速度是完全依靠主进程的执行效率。

服务器只部署了一个redis进程,多个客户端访问,可能会导致redis的处理能力下降

如果部署了多个redis进程,虽然能提高redis的并发处理能力,但是会给服务器的cpu带来很大的压力。

一台服务器,一般部署3个redis进程。(根据情况来看,高并发,要部署多个。一般的情况,单进程足够)

redis的特点:

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

redis为什么这么快?

  1. redis是纯内存结构,避免磁盘I/O的耗时
  2. 核心模块是一个单进程,减少了线程切换和回收线程的时间
  3. I/O的多路复用机制。每一个执行线路,都可以同时执行读和写,高并发的效率大大提高

**特殊说明:redis的读写,仍然是单进程处理

redis的源码编译安装

#关闭防火墙

?systemctl stop firewalld

?setenforce 0

?#安装环境依赖包

?yum install -y gcc gcc-c++ make

?#上传软件包并解压

?cd /opt

?tar zxvf redis-5.0.7.tar.gz -C /opt/

?cd /opt/redis-5.0.7

?#开2核编译安装,指定安装路径为/usr/local/redis

?make -j?2 && make install

make PREFIX=/usr/local/redis install

?#由于Redis源码包中直接提供了Makefile 文件,所以在解压完软件包后,不用先执行./configure 进行配置,可直接执行make与make install命令进行安装。

??

?#执行软件包提供的install_server.sh 脚本文件,设置Redis服务所需要的相关配置文件

?cd /opt/redis-5.0.7/utils

?./install_server.sh

?.......?#一直回车

??

?Please select the redis executable path [] /usr/local/redis/bin/redis-server

?#这里默认为/usr/local/bin/redis-server,需要手动修改为/usr/local/redis/bin/redis-server,注意要一次性正确输入

??

?Selected config:

?Port: 6379 ?????????????????????????????????????#默认侦听端口为6379

?Config file: /etc/redis/6379.conf ??????????????#配置文件路径

?Log file: /var/log/redis_6379.log ??????????????#日志文件路径

?Data dir : /var/lib/redis/6379 ?????????????????#数据文件路径

?Executable: /usr/local/redis/bin/redis-server ??#可执行文件路径

?Cli Executable : /usr/local/bin/redis-cli ??????#客户端命令工具

??

?#把redis的可执行程序文件放入路径环境变量的目录中便于系统识别

?ln -s /usr/local/redis/bin/* /usr/local/bin/

#当 install_server.sh 脚本运行完毕,Redis 服务就已经启动,默认监听端口为 6379

netstat -natp | grep redis

redis的服务控制命令:

/etc/init.d/redis_6379 stop #停止

/etc/init.d/redis_6379 start #启动

/etc/init.d/redis_6379 restart #重启

/etc/init.d/redis_6379 status #状态

修改配置 /etc/redis/6379.conf 参数

vim /etc/redis/6379.conf

bind 127.0.0.1 192.168.120.10 #70行,添加 监听的主机地址

port 6379 #93行,Redis默认的监听端口

daemonize yes #137行,启用守护进程(后台运行)

pidfile /var/run/redis_6379.pid #159行,指定 PID 文件

loglevel notice #167行,日志级别

logfile /var/log/redis_6379.log #172行,指定日志文件

重启

/etc/init.d/redis_6379 restart

redis的命令工具:

redis-server:直接启动redis,只能启动

redis-benchmark:检测redis在本机的运行效率

redis-cli:命令行工具

redis-check-aof:检测AOF文件是否正常

redis-check-rdb:检测rdb文件是否正常

redis-benchmark:

-h:指定服务器的主机名IP地址

-p:指定服务器的端口号

-c:指定并发连接数

-n:指定请求数

如何进入redis

redis-cli -h192.168.120.110 -p 6379

-h:指定ip地址

-p:指定端口号

-a指定登录密码

#向 IP 地址为 192.168.120.110、端口为 6379 的 Redis 服务器发送 100 个并发连接与 100000 个请求测试性能

redis-benchmark -h 192.168.120.110 -p 6379 -c 100 -n 100000

#测试存取大小为 100 字节的数据包的性能

redis-benchmark -h 192.168.120.110 -p 6379 -q -d 100

#测试本机上 Redis 服务在进行 set 与 lpush 操作时的性能

redis-benchmark -t set,lpush -n 100000 -q

redis的数据类型 五大数据类型:

  1. string(字符串):也是redis最近本的类型,最大能存储512MB的数据,可以存储任何数据,数字,文字,图片等等。

  1. list数据类型

列表当中的元素还是string类型

  1. hash类型:

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

  1. set数据类型(无序集合)元素类型也是string,元素是唯一的,不允许重复。多个集合类型可以进行并集。交集和差集运算。

set当中的元素类型是唯一的,可以跟踪一些唯一性的数据。访问微博的用户名。只要把对应名称redis,set集合可以启动保存唯一性方便下一次的访问

5. zset有序集合 ?元素类型也是string,元素唯一,不能重复

?????????????每个元素都会关联一个double(小数点)的分数(score,表示权重),可

通过权重的大小,进行排序,元素的权重可以相同

在线积分的排行榜,可以实时更新用户的分数。zrange命令回去积分top10的用户。zrank命令通过username来获取用户的排行信息

set和hset 创建普通类型和hash类型,一般情况下,如无特殊需求,普通的创建方式即可

对一个键进行多字段存储,节省内存,使用hash方式

String数据类型:

set:存放数据,命令格式为 set key value

get:获取数据,命令格式为 get key

# keys 命令可以取符合规则的键值列表,通常情况可以结合*、?等选项来使用。

#查看当前数据库中所有键

192.168.120.110:6379> keys *

#查看当前数据库中以 v 开头的数据

192.168.120.110:6379> keys v*

#查看当前数据库中以 v 开头后面包含任意一位的数据

192.168.120.110:6379> keys v?

#查看当前数据库中以 v 开头 v 开头后面包含任意两位的数据

192.168.120.110:6379> keys v??

# exists 命令可以判断键值是否存在。

exists ?键 ??

返回结果 为0 则为不存在,返回为1即为存在

删除键

del 键

type 命令可以获取 key 对应的 value 值类型

type 键

键值对追加

append test hello

#该键并不存在,因此append命令返回当前Value的长度

append test world

#该键已经存在,因此返回追加后Value的长度

get test

#通过get命令获取该键,以判断append的结果

查看键值长度

strlen test

set还可以直接覆盖原有值

INCR key:key值递增加1(key值必须为字符类型)

DECR key:key值递减1(key值必须为字符类型)

#减少指定的整数

decrby test 10

#增加指定的整数

incrby test 33

设置指定key的过期时间为seconds

setex key seconds value

192.168.120.110:6379> setex test1 5 lo

#设置指定Key的过期时间为5秒。

192.168.120.110:6379> ttl test1

(integer) 2

#通过tt1命令查看指定Key的剩余存活时间(秒数),0表示已经过期,-1表示永不过期。

192.168.120.110:6379> ttl test1

(integer) -2

#该ttl命令的返回值显示,该Key已经过期。

(integer)-2 表示已过期

(integer)-1 表示永不过期

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

expire test?5

批量创建多个值对

redis 127.0.0.1:6379> mset key1 "hello" key2 "world" ???#批量设置了key1和key2两个键。

redis 127.0.0.1:6379> mget key1 key2 ???????????????????#批量获取了key1和key2两个键的值。

1) "hello"

2) "world"

?rename 命令是对已有 key 进行重命名。(覆盖)

renamenx ?源key 目标key

list数据类型:

正序插入查看:192.168.120.110:6379> rpush dym1 1 2 3 4

(integer) 4

192.168.120.110:6379> LRANGE dym1 0 -1

1) "1"

2) "2"

3) "3"

4) "4"

倒序插入查看:192.168.120.110:6379> lpush dym a b c d 1 2 3

(integer) 7

192.168.120.110:6379> LRANGE dym 0 -1

1) "3"

2) "2"

3) "1"

4) "d"

5) "c"

6) "b"

7) "a"

取从位置1开始到位置2结束的2个元素。

192.168.120.110:6379> LRANGE dym1 1 2

1) "2"

2) "3"

取链表中的全部元素,其中0表示第一个元素,-1表示最后一一个元素。

192.168.120.110:6379> LRANGE dym1 0 -1

获取索引值为4(头部的第二个元素)的元素值

192.168.120.110:6379> lindex dym 4

获取列表长度

192.168.120.110:6379> llen dym1

根据索引下标修改元素

在元素shuai的前面插入新元素2

在元素shuai的后面插入新元素4

hash数据类型:

创建hash类型的数据

hset 键名 字段 值

hset dym2 tall yes

创建多个值

hmset 键名 字段 值 字段 值 字段 值

hmset dym2 tall 1 rich 2 age 23

获取字段的值

hget 键名 字段

hget dym2 tall

获取所有字段和值

hgetall 键名

添加一个新的字段

hset 键名 字段 值

hset dym2 handsan yes

获取多个字段的值

hmget 键名 字段 字段

hmget dym2 tall handsan

删除单个字段

hdel 键名 字段

hdel dym2 handsan

删除多个字段

hdel 键名 字段 字段

hdel dym2 tall age

Set数据类型

flushall

#清除所有库的所有内容

#创建无序集合myset并创建成员(合集中不能插入重复数据!)

sadd 集合名 值

sadd myset a a c

?#查看成员信息

smembers 集合名

SMEMBERS myset

查看合集中数据是否存在

1表示存在0表示不存在

sismember 键名 值

sismember myset c

随机返回一个值

srandmember 集合名

SRANDMEMBER myset

随机移除一个值

spop 集合名

spop myset

指定值删除

srem 集合名 ?值

srem myset c?e f

查看合集的内容

smembers 集合名

SMEMBERS myset

zset数据类型:

创建有序集合myzset 权重是1 元素是one

zadd 集合名 权重 元素

zadd myzset 1 one

创建多个元素

zadd 集合名 权重 元素 权重 元素

zadd myzset 2 two 3 three

获取所有元素

zrange 集合名 ?索引下标范围 WITHSCORES

zrange myzset 0 -1 WITHSCORES

#不加WITHSCORES是只显示元素

#加WITHSCORES是权重和元素都显示

查看位置索引

zrank 集合名 元素

zrank myzset one

如果成员不存在返回nil

zrank 集合名 元素

zrank myzset fore

查询成员数量

zcard 集合名

zcard myzset

表示查询权重的范围

查询权重1-2的范围之内的成员数量

zcont ?集合名 ?权重范围

zcount myzset 1 2

删除成员

zrem 集合名 ?元素

zrem myzset three

查看所有成员,查看删除后的结果

zrange 集合名 ?索引下标范围 withscores

zrange myzset 0 -1 withscores

查看权重

zscore 集合名 元素

zscore myzset two

查询redis库

Redis的库 库都是创建好的库,16个库

数字排名:0-15每个数据库之间互相独立,互不干扰

查看当前库中键的数量

dbsize

keys *

切换库

select 库的序号

select 1

keys *

redis库是按照数字排列的:0-15 一共16个 初始位置默认是0库

把键移动到其他的库中

move 键名 ??库的序号

move dym1 15

创建redis的密码

可以进入redis的库但是看不到库

config set requirepass 密码

config set requirepass 123456

在内声明密码

auth 123456

在外声明密码

redis-cli -h 20.0.0.26 -p 6379 -a 123456

-h指定ip地址

-p指定端口

-a指定密码

清空当前库

Flushdb

清空所有库(不要使用!!!)

flushall

总结:

redis的特点:读写速度快

数据类型:

1、 string(包含所有,不只是字符串)

2、 list

3、 hash 对一个键进行多字段操作要用hash 节省内存空间。只要没有持久化之前都是保存在内存当中的。

4、 无序集合 set 元素不能重复,可以用来定义唯一值

5、 有序集合zset 元素不能重复,但是权重可以相同。可以用来排名
?

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