redis非关系型数据库

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

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

关系型数据库

关系型数据库是一个结构化的数据库。

记录方式:行和列

行的作用:记录对象的属性

列的作用:声明对象

表与表之间是有关联的:外键关联、左连接、右连接、内连接。使用sql语句,来对指定的表、库进行增删改查。

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

非关系型数据库

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

非关系型数据库不需要定义库也不需要定义表的结构,而且直接记录即可,每条记录可以有不同的数据类型、字段。甚至字段个数都可以自定义。

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

区别

1、 存储方式不同:关系型数据库需要提前声明数据类型。非关系型则不需要提前声明数据类型。是键值对形式存储

2、 扩展方式,性能上的提升。关系型数据库靠的是提升本机性能。非关系型数据库,可以横向扩展,加入节点服务器的方式提高性能

3、 对事务的支持性不同:原子性:最小单元、隔离性:一个事务执行不能被其他事务干扰、一致性:前后数据保持一致,保证诗句完整性、持久性:一旦写入不可更改

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

非关系型数据库的主要场景

1、 操作的扩展性

2、 大数据量处理(海量数据处理)

非关系型数据库产生的原因

web2.0的核心作用:交互

纯动态网站的三高问题:

1、 对数据库高并发读写的需求

2、 对海量数据高效存储与访问的需求

3、 对数据库的高可扩展性与高可用性的需求

常见的缓存需求场景:数据库缓存、web页面缓存、cpu和硬盘之间的缓存

非关系型数据库缓存工作流程图:

总结

关系型数据库:

库--->---表---->---行,列--->----存储数据

非关系型数据库:

库---->---集合---->键值对

非关系型数据库不需要手动创建库和集合(本身自带)

夹在两个应用程序之间就是中间键

什么是redis?

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

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

redis的数据流向和工作流程架构图:

redis的工作特点

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

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

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

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

工作中,一台服务器,一般部署3个redis进程。(视情况而定)一般情况单进程足够了。

redis的特点

1、 具有极高的读写速度,数据读取支持每秒11万次。写入数据支持每秒执行8万1千次写入。

2、 可以支持丰富的数据类型。

3、 支持持久化。平常的数据都是保存在内存中。持久化可以写入到磁盘中。既可以保存到本地也可也实现备份。

4、 原子性:最小单位。redis所有的操作都是原子性。要么都成功要么都失败

5、 支持主从模式实现数据同步。master-slave模式

redis部署

bash 复制代码
tar -xf redis
#解压redis安装包
make -j4
#编译
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/
#创建一个软连接
netstat -antp | grep redis
#查看一下redis端口是否启动成功


redis安装成功!

redis进行服务控制命令

redis的服务为控制命令:

bash 复制代码
/etc/init.d/redis_6379 
/etc/init.d/redis_6379 stop 
#停止redis服务

/etc/init.d/redis_6379 start 
#启动redis服务

/etc/init.d/redis_6379 restart 
#重启redis服务

/etc/init.d/redis_6379 status
#查看redis的状态

vim /etc/redis/6379.conf
70行添加本机的ip即可

redis的命令工具:

bash 复制代码
redis-server
#可以直接启动redis

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

redis-cli
#命令行工具

redis-check-aof
#检测持久化文件AOF文件是否正常

redis-check-rbd
#检测持久化文件RBD文件是否正常

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

bash 复制代码
redis-benchmark -h
#指定服务器的主机名 ip地址

redis-benchmark -p
#指定服务器的端口号

redis-benchmark -c
#指定并发连接数

redis-benchmark -n
#指定请求数

redis的数据类型

如何进入redis?

bash 复制代码
redis-cli -h 本机ip -p 端口号
redis-cli -h 20.0.0.26 -p 6379 
#进入redis

redis-cli
#仅限于本地,远程登录还是需要指定目标服务器的ip地址

redis-cli -h 20.0.0.26 -p 6379 
#-h 指定IP地址
#-p 指定端口号
#-a 指定登录密码

redis五大数据类型

1、 string(字符串):是redis最基本的类型,最大能存储512MB的数据,可以存储任何数据

查询键值对和修改键值对名
bash 复制代码
KEYS *
#查看有哪些键

set 键名 值
set test zyg
#set给键起个名字

get 键名
get test
#查询键的值

set test 10
#可以直接替换键内部的值

keys 键名
keys test
#模糊查询法

keys t*
#模糊查询法任意长度(生产中尽量别用*)

keys t?
#以t开头后面任意1位的键

keys t??
#以t开头后面意义2位置的键
查询键值对是否存在和删除键指定键
bash 复制代码
exists 键名
exists test
#判断键名是否存在。返回1表示存在,返回0表示不存在

del 键名 键名
del t1 t22 
#删除键,可以一次1个也可也一次多个
查询键值对的类型和长度
bash 复制代码
type 键名
type test
#查看键值对的类型

append 键名 值
append test1 hello
#如果键不存在,直接返回键的长度

append test1 world
#如果键已经存在,会拼接起来,返回拼接后的总长度

strlen 键名
strlen test1
#直接返回键的长度
键值对的自增和自减
bash 复制代码
set 键名 值
set test1 10
#可以直接覆盖键的值

get test1
incr 键名
incr test1
#自增1

decr 键名
decr test1
#自减1

只能对数字类型进行操作
对指定数值进行增加和减少
bash 复制代码
set test1 15
decrby 键名 值
decrby test1 10
#对指定数值进行减少

incrby 键名 值
incrby test1 20
#对指定数值增加

get test1
声明键值对的生命周期
bash 复制代码
setex 键名 生命周期  值
setex test2 5 lo
#新建时声明键值对的声明周期

ttl 键名
ttl test2
#查看键值对的生命周期 -2代表键值对已经失效-1表示永不过期

expire 键名  时间(秒)
expire test 30
#对已有键值对修改生命周期 30秒
批量创建键值对
bash 复制代码
mset 键名1  值  键名2  值
mset key1 hello key2 world
#批量设置键

keys *
#查看键

mget 键名1 键名2
mget key1 key2
#同时打印多个键的值

2、 list数据类型:列表。但是列表当中的元素还是string类型

创建列表
bash 复制代码
lpush 键名   值
lpush zyg a b c d 1 2 3
#创建列表 后面时内容,但是当中的元素还是string类型

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

lindex 键名 索引下标
lindex zyg 0
lindex zyg 4
#根据索引下标打印数据
rpush  键名  值
rpush guoqi1 1 2 3 4
#创建列表正序查看
lrange guoqi1 0 -1
#正序查看
lrange guo1i1 1 2
#指定范围查看
对列表插入值
bash 复制代码
lpushx  键名  值
lpushx guoqi1 10
#共左插入

lrange  键名  范围
lrange guoqi1 0 -1
#通过索引下标范围查看

rpushx guoqi1 5
#从右插入

lrange guoqi1 0 -1
#通过索引下标范围查看
删除列表内的值
bash 复制代码
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
#在指定位置前插入数据

lrange guoqi1 0 -1

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

创建hash类型的数据
bash 复制代码
hset  键名  字段  值
hset zyg2 tall yes
#创建一个hash类型的数据

hget  键名 字段
hget zyg2 tall
#打印tall的值

hset 键名  字段    值
hset zyg2 hangsan yes
#添加1个字段

hmget 键名 字段  字段
hmget zyg2 tall handsan
#批量打印字段

hset 键名 字段 值
hset zyg2 age 20
#再添加一个字段

hmget 键名  字段   字段   字段
hmget zyg2 tall hangdsan age
#一次性打印多个字段
删除一个或多个
bash 复制代码
hdel  键名   字段
hdel zyg2 hangsan
#删除单个字段

hdel  键名 字段 字段
hdel zyg2 tall age
#删除多个字段

hmget  键名  字段 字段   字段
hmget zyg2 tall hangsan age
#差选多个字段
一次性创建多个值
bash 复制代码
hmset 键名  字段 值 字段 值 字段 值 字段 值
hmset zyg3 tall 1 rich 2 age 23 fcz 500
#一次性创建多个字段

hmget 键名 字段 字段 字段 字段
hmget zyg3 tall rich age fcz
#一次性打印多个名称和值
直接查看键值对的所有字段和值
bash 复制代码
hgetall  键名
hgetall zyg3
#查看键的字段和值

hkeys  键名
hkeys zyg3
#当前键值对的字段名

hvals  键名
hvals zyg3
#当前键值对的值
删除键值对
bash 复制代码
del zyg3
#删除键值对
4、 set数据类型(无序集合)元素类型也是string。元素是唯一的,不允许重复,多个集合类型可以进行并集。交集和差集运算。

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

创建集合

bash 复制代码
flushall
#清除所有库的所有内容

sadd 集合名 值
sadd myset a a c
#创建无序集合myset并创建成员

smembers 集合名
SMEMBERS myset
#查看成员信息

合集中不能插入重复数据!

查看合集中值是否存在

bash 复制代码
sismember 键名 值
sismember myset c
#查看合集中数据是否存在

1表示存在0表示不存在
随机返回和移除
bash 复制代码
srandmember 集合名
SRANDMEMBER myset
#随机返回一个值

spop 集合名
spop myset
#随机移除一个值

srem 集合名  值
srem myset a e f
#指定值删除

smembers 集合名
SMEMBERS myset
#查看合集的内容
5、 有序集合:有序集合,元素类型也是string,元素唯一,不能重复。

每个元素都会关联一个double(小数点)的分数(score,表示权重)通过权重大小。进行排序。元素的权重可以相同。

zset:运用在在线积分的排行榜,可以实时跟新用户的分数和排名。

zrange命令返回积分top10的用户。zrank命令通过username来获取用户的排行信息。

通过权重来排列

创建有序集合

bash 复制代码
zadd 集合名 权重 元素
zadd myzset 1 "one"
#创建有序集合myzset 权重是1 元素是one

zadd 集合名 权重 元素 权重 元素
zadd myzset 2 two 3 three
#创建多个元素

zrange 集合名  索引下标范围 WITHSCORES
zrange myzset 0 -1 WITHSCORES
#打印所有元素
#不加WITHSCORES是只显示元素
#加WITHSCORES是权重和元素都显示
获取集合中的位置索引
bash 复制代码
zrank 集合名 元素
zrank myzset one
#查看位置索引

zrank 集合名 元素
zrank myzset fore
#如果成员不存在返回nil

zcard 集合名
zcard myzset
#查询成员数量

zcont  集合名  权重范围
zcount myzset 1 2
#表示查询权重的范围
#查询权重1-2的范围之内的成员数量

表示权重范围:1<=score<=3
如何删除成员和查看权重
bash 复制代码
zrem 集合名  元素
zrem myzset three
#删除成员

zrange 集合名  索引下标范围 withscores
zrange myzset 0 -1 withscores
#查看所有成员,查看删除后的结果

zscore 集合名 元素
zscore myzset two
#查看权重

如何对已有key进行重命名

set和hset:创建普通类型和hash类型,一般情况下,如无特殊需求,普通的创建方式即可,对一个键进行多字段存储,节省内存,使用hash方式。(一般工作中set足够)

bash 复制代码
set test 10
get test

rename 键名 新键名
rename test zygg
#对键重命名

查询redis库

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

数字排名:0-15

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

bash 复制代码
dbsize
#查看当前库中键的数量

keys *

select 库的序号
select 1
#切换库

keys *

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

移动键到其他库

bash 复制代码
move 键名   库的序号
move guoqi1 1
#把键移动到其他的库中

创建密码

bash 复制代码
config set requirepass 密码
config set requirepass 123456
#创建redis的密码
可以进入redis的库但是看不到库

auth 123456
#在内声明密码

redis-cli -h 20.0.0.26 -p 6379 -a 123456
#在外声明密码
#-h指定ip地址
#-p指定端口
#-a指定密码

如何清空当前库和所有库

bash 复制代码
flushdb
#清空当前库
flushall
#清空所有库

不建议使用了解即可!

总结

redis的特点:读写速度快

数据类型:

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

2、 list

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

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

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

补充

redis快的原因是什么?

1、 redis是纯内存结构。避免了磁盘I/O的耗时

2、 redis只有一个主进程,没有其他的限制。核心模块是一个单进程,减少了线程切换和回收线程资源的事件。

3、 实现I/O的多路复用机制。每一个执行线路都可以同时执行读和写。高并发的效率大大提高。

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

相关推荐
weixin_472339468 分钟前
MySQL MCP 使用案例
数据库·mysql
lqlj22331 小时前
Spark SQL 读取 CSV 文件,并将数据写入 MySQL 数据库
数据库·sql·spark
遗憾皆是温柔2 小时前
MyBatis—动态 SQL
java·数据库·ide·sql·mybatis
未来之窗软件服务2 小时前
Cacti 未经身份验证SQL注入漏洞
android·数据库·sql·服务器安全
fengye2071612 小时前
在MYSQL中导入cookbook.sql文件
数据库·mysql·adb
Ailovelearning3 小时前
neo4j框架:ubuntu系统中neo4j安装与使用教程
数据库·neo4j
_星辰大海乀4 小时前
表的设计、聚合函数
java·数据结构·数据库·sql·mysql·数据库开发
未来之窗软件服务4 小时前
solidwors插件 开发————仙盟创梦IDE
前端·javascript·数据库·ide·仙盟创梦ide
yc_12244 小时前
SqlHelper 实现类,支持多数据库,提供异步操作、自动重试、事务、存储过程、分页、缓存等功能。
数据库·c#
小白学大数据4 小时前
基于Scrapy-Redis的分布式景点数据爬取与热力图生成
javascript·redis·分布式·scrapy