Redis为键值型数据库,数据以键值形式存储。没有表,没有约束。
mysql就是典型的关系型数据库(SQL)。
目的都是数据的增删改查,但数据存储方式不一样。
关系型和非关系型在结构上有差异
关系型的结构一般定好后就很少修改,非关系型的就更加自由
关系型数据库的关系体现如下,不同表可以通过外键进行联系
非关系型数据库因为没有表,所以像下面记录一个用户下的订单需要通过json嵌套的形式
查询方面差异
关系型数据库都可以使用同一套SQL语句进行查询,NoSQl的查询语法不统一,不同的NoSQl数据库有不同的语法
事物上的差异
关系型数据库的事物有ACID特性: 原子性,一致性,隔离性,持久性
NoSQl数据库要么无事务,要么就是只能做基本的一致性,ACID无法全部满足,只有BASE性:系统能够基本运行,一直提供服务
速度差异:磁盘读写速度远慢于CPU速度,因此存在内存中的NoSQl速度很快。
因为redis官方没有提供windows版本(但听说github上有),只有liunx,所以这里有两种选择,一是在本地安装虚拟机跑redis,而是在云服务器跑redis
这里我选择在云服务器装redis, 官方也有提供redis的docker镜像
这里首先在云服务器上使用如下命令拉取redis镜像
docker pull redis
拉取速度慢的话可以换源,可以看下面这个博主的文章,建议换阿里的源,快的不是一点半点
docker 换镜像源以解决拉取镜像速度慢的问题_dock拉取镜像很慢_farkuai的博客-CSDN博客
然后用镜像创建一个容器
docker run -d -p 6379:6379 --name myredis redis
用docker ps -a 看容器的id
docker ps -a
然后用以下命令打开redis服务
docker exec -it 容器的id redis-cli
然后就可以直接使用一个软件进行连接了,不需要管配置文件那些什么的,更不需要文件夹映射什么的
这里拉取容器下来的redis默认是没有密码的,所以可以直接用服务器+端口后进行连接
为了安全起见,还是要先修改密码。
//使用如下命令查询信息
config get requirepass
//使用如下命令修改密码
config set requirepass password
//使用如下命令确认密码,否则报错
auth password
//再次查看密码
config get requirepass
设置完密码之后的每次登陆都要带上密码,否则能进去但不能使用命令
docker exec -it b66f2d4fb5b3 redis-cli -a 234799
连接成功时界面是这样的
# 选择 0号库
select 0
#查看相关命令的信息
help commad
#查询所有的key
keys *
#查询所有以n开头的key
keys n*
#查询所有带有n的key
keys *n*
//类似sql的模糊查询
#删除指定的key
del key
#删除多个key
del k1 k2 k3 k4 #实际删除多少个就会返回多少个
//只能指定key后删除
#判断key是否存在
exists k1 k2 #返回值是存在的key的数量
#给一个key设置有效期,到期就会删除,因为redis在内存存储,不删的话会爆内存
expire key 20 #20s有效期
#查看一个key的有效期
ttl key #返回剩余秒数
返回-1则是永久有效
甚至可以把图片变成字节流存在redis里面
#设置三个键值对 k1:v1 ....
mset k1 v1 k2 v2 k3 v3
#获取多个key的值
mget k1 k2 k3
#返回值是自增后的结果
incr age
#让age每次自增-2
incrby age -2
#浮点数自增0.5
incrbyfloat age 0.5
#如果不存在才增加,可以有效防止覆盖
setnx age 2
set age 2 nx #效果相同
#添加一个key=5并设置有效期为10
setex age 10 5
set age 5 ex 10
//可以覆盖已有的key,相当于set和expire组合
使用如下的四条语句设置4条数据
set itheima:user:1 '{"id":1, "name":"Jack", "age": 21}'
set itheima:user:2 '{"id":2, "name":"Rose", "age": 18}'
set itheima:user:3 '{"id":1, "name":"小米11", "price": 4999}'
set itheima:user:4 '{"id":2, "name":"荣耀6", "price": 2999}'
然后在图形界面客户端可以看见有如下层级
类比就是map
hmset已经弃用,使用hset可以达到hmset效果
hdel :删除一个key下面指定的field和values