一、数据库类型
1. 类型
关系型数据库 -sql
- 操作数据必须使用sql语句
- 数据存储到磁盘、容量大
- 举例:mysql、oracle、sqlite - 文件数据库(嵌入式)、sql sever
非关系型数据库 -nosql
- 操作数据不使用sql语句:使用命令
- 数据默认存储到内存
- 速度快效率高
- 容量小
- 不需要数据库表:使用键值对
2. SQL与NoSQL关系
- 所有的数据默认存储在关系型数据库中
- 客户端访问服务器, 有一些数据, 服务器需要频繁的查询数据
- 服务器首先将数据从sql中读出到服务器,服务器同时将数据写到redis
- 客户端以后访问的服务器的数据是从redis中读取的
- redis的数据发生修改后,服务器会同步到sql中
二、Redis基本介绍
1. 登录与退出
#服务器启动
redis-server #默认启动
redis-server confFileName #根据配置文件的设置启动
#客户端登录
redis-cli #默认连接本地,绑定了6379端口的服务器
redis-cli -p 端口号
redis-cli -h ip地址 -p 端口号 #连接远程服务器
#客户端测试命令
ping [MSG] #连接成功服务器会有回应
#通过客户端关闭服务器
shutdown
2. 数据类型
2.1 基本介绍
redis中都是以键值对的形式存储数据
key必须为字符串
value:
- string:字符串
- list:链表,即多个string字符串
- set:集合,与stl中set区别是此处为无序的
- SortedSet:排序集合,集合中每个元素分为[分数,成员], 如[66, “tom”];
- Hash:也是键值对的形式
2.2 数据类型分析
string类型
--set/get与mset/mget
set hello world --设置键值对
get hello --获取键值对
mset h1 world1 h2 world2 h3 world --批量设置,最大为10个
mget h1 h2 h3 --批量获取
--append
append hello 123456 --在hello的value后追加123456
--incr/decr与incrby/decrby
set num 110
incr num --num的value值+1
decr num --num的value值-1
incrby 10 num; --num的value值+10
decrby 10 num --num的value值-10
list类型
--Lpush/Rpush/Lpop/Rpop
LPUSH list1 1 2 3 4 --从左侧插入数据
RPUSH list2 1 2 3 4 --从右侧插入数据
LPOP list1 --弹出左一数据
RPOP list2 --弹出右一数据
--lRange/lINdex
LRANGE list1 0 -1 --遍历链表从第0个元素到倒数第一个
LINDEX list1 2 --查看第2个元素
--lrem
LREM list1 2 4 --删除2个值为4的元素
LLEN list1 --获取链表长度
set类型
--添加数据到集合,重复的默认忽略
SADD st1 1 2 3 aa bb cc 1 2 3 --1 2 3只保存一遍
--遍历集合中的元素
SMEMBERS st1
--差集/交集/并集
SADD st2 7 8 9 aa bb cc
SDIFF st1 st2 --差集结果 7 8 9
SINTER st1 st2 --交集结果 aa bb cc
SUNION st1 st2 --并集结果 1 2 3 aa bb cc 7 8 9
SortedSet类型
--添加数据
ZADD zt1 12 a 34 b 56 c
--遍历数据
ZRANGE zt1 -1 0 --升序遍历
ZREVRANGE zt1 -1 0 --降序遍历
--查看指定分数区间中,元素的个数
ZCOUNT zt1 13 56 --结果为2
--删除数据
ZREM zt1 ab --每次只能删除一个成员
--查看指定数据在集合中的排名(从0开始)
ZRANK zt1 ab --升序时的排名
ZREVRANK zt1 ab --降序时的排名
Hash类型
--添加/批量数据
HSET ht1 id 1 --添加一条数据
HSET ht1 age 10 --添加第二条数据
HMSET ht2 id 1 name a age 10
--取/批量数据
HGET ht1 id --取数据
HMGET ht2 id name age --批量取数据
--删除键值对
HDEL ht2 id name
key相关的命令
-- 删除键值对
keys */h?llo/h*llo --查看指定的键
DEL key1 --删除以key1为键的键值对
--设置/取消键值对的生命时长
EXPIRE key1 100 --设置key1的生命时长为100s
PERSIST key --取消时长
--查看key对应的value类型
TYPE key
三、redis的高级用法
1. 配置文件分析
# redis服务器绑定的IP
bind 127.0.0.1 192.168.1.100 # 任何客户端都能访问服务器, 需要注释该选项
# 保护模式
protected-mode yes # 如果要远程客户端访问服务器, 该模式要关闭
# reids服务器启动时候绑定的端口
port 6379 # 默认为6379
# 超时时长
timeout 0 # 0位关闭该选项, >0则开启
# 服务器启动之后不是守护进程
daemonize no
# 如果服务器是守护进程, 就会生成一个pid文件
pidfile ./redis.pid # ./ -> reids服务器启动时候对应的目录
# 日志级别
loglevel notice
# 如果服务器是守护进程, 才会写日志文件
logfile "" # 这是没写
logfile ./redis.log
# redis中数据库的个数
databases 16 # 切换 select dbID [dbID == 0 ~ 16-1]
2. Redis的持久化
持久化: 数据从内存到磁盘的过程
持久化的两种方式:
- rdb方式
- 这是一种默认的持久化方式, 默认打开
- 磁盘的持久化文件xxx.rdb
- 将内存数据以二进制的方式直接写入磁盘文件
- 文件比较小, 恢复时间短, 效率高
- 以用户设定的频率 -> 容易丢失数据
- 数据完整性相对较低
- aof方式
- 默认是关闭的
- 磁盘的持久化文件xxx.aof
- 直接将生成数据的命令写入磁盘文件
- 文件比较大, 恢复时间长, 效率低
- 以某种频率 -> 1sec
- 数据完整性高
# rdb的同步频率, 任意一个满足都可以
save 900 1
save 300 10
save 60 10000
# rdb文件的名字
dbfilename dump.rdb
# 生成的持久化文件保存的那个目录下, rdb和aof
dir ./
# 是不是要打开aof模式
appendonly no
-> 打开: yes
# 设置aof文件的名字
appendfilename "appendonly.aof"
# aof更新的频率
# appendfsync always
appendfsync everysec
# appendfsync no
3. redis的事务
3.1 基本概念
一个指令的队列,顺序、排他、连续的去执行。
- 事务的基本操作
- 开启事务
multi
- 取消事务
discard
- 关闭事务
exec
multi --开启事务
set age 10 --插入数据
set name 20
exec --提交事务
multi --开启事务
set age 10 --插入数据
discard --取消事务
- 事务的流程[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Awekmnzk-1595382219771)(C:\Users\10139\AppData\Roaming\Typora\typora-user-images\1595378129694.png)]
- 注意事项
- 事务中,命令语法输入错误,则事务中所有的命令均不执行。
- 事务中,命令类型输入错误(如list命令用在set类型中),则事务中只执行正确命令。
- 因此需要程序员自己回滚数据重新输入正确命令。
- 单数据直接set,多数据修改对应值或整体复制。
3.2 redis的锁
监视锁:为了防止进程1正对数据进行操作时,被别的进程修改该数据。即事务的隔离性。
对key添加监视锁,在执行exec前如果key发生了变化,无论事务中是否对key进行操作,事务中的指令都将无效。
--进程1 监视key
set name 123
watch name
--进程1 开启事务处理数据
set age 11 --未对监视数据进行处理
get age
--进程2 对监视的key进行了修改
set name 321
--进程1 提交事务
exec --提交失败,因为key发生变化
--进程1 解除监视
unwatch
分布式锁(互斥锁):为了防止多个事务对同一个数据进行操作,即事务的原子性。
设置定时,时间到自动解锁
--进程1 加锁
set num 10
setnx lock-num 1 --加锁
expire lock-num 5 --设置锁的时效
--进程1 对数据进行操作
incrby num -1 --num-1
--进程2 对该数据加锁
setnx lock-num 1 --失败,因为进程1加锁中
--进程1 解锁
del lock-num