一、数据库类型

1. 类型

关系型数据库 -sql

  1. 操作数据必须使用sql语句
  2. 数据存储到磁盘、容量大
  3. 举例:mysql、oracle、sqlite - 文件数据库(嵌入式)、sql sever

非关系型数据库 -nosql

  1. 操作数据不使用sql语句:使用命令
  2. 数据默认存储到内存
  1. 速度快效率高
  2. 容量小
  1. 不需要数据库表:使用键值对

2. SQL与NoSQL关系

  1. 所有的数据默认存储在关系型数据库中
  2. 客户端访问服务器, 有一些数据, 服务器需要频繁的查询数据
  1. 服务器首先将数据从sql中读出到服务器,服务器同时将数据写到redis
  2. 客户端以后访问的服务器的数据是从redis中读取的
  3. redis的数据发生修改后,服务器会同步到sql中

redis sql支持 redis sql查询_redis

二、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

  1. string:字符串
  2. list:链表,即多个string字符串
  3. set:集合,与stl中set区别是此处为无序的
  4. SortedSet:排序集合,集合中每个元素分为[分数,成员], 如[66, “tom”];
  5. 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 基本概念

一个指令的队列,顺序、排他、连续的去执行。

  1. 事务的基本操作
  1. 开启事务multi
  2. 取消事务discard
  3. 关闭事务exec
multi	--开启事务
set age 10	--插入数据
set name 20	
exec	--提交事务

multi	--开启事务
set age 10	--插入数据
discard		--取消事务
  1. 事务的流程[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Awekmnzk-1595382219771)(C:\Users\10139\AppData\Roaming\Typora\typora-user-images\1595378129694.png)]
  2. 注意事项
  1. 事务中,命令语法输入错误,则事务中所有的命令均不执行。
  2. 事务中,命令类型输入错误(如list命令用在set类型中),则事务中只执行正确命令。
  1. 因此需要程序员自己回滚数据重新输入正确命令。
  2. 单数据直接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