redis数据库
1.初始认识redis
数据库两种:关系型和非关系型,他们的区别:非关系型数据库的数据结构很随意,比如
这种数据库表之间没有什么关联关系,要维护关系要么靠代码中的业务逻辑,要么靠数据之间的耦合。
查询数据的方式也不同:
非关系型数据库往往不支持事务,或者不能严格保证ACID的特性,只能实现基本的一致性。
非关系型数据库,他们的操作更多的是依赖于内存来操作,内存的读写速度会非常快,性能会好一些。
非关系型数据库可以将数据拆分,存储在不同机器上,可以保存海量数据,解决内存大小有限的问题。称为水平扩展。
他们之间的比较:
Redis是给予内存的键值型非关系型的数据库,Redis中存储的数据都是以key、value对的形式存储,而value的形式多种多样,可以是字符串、数值、甚至json。
总结:本小节知道关系型数据库和关系型数据库的差别,以及redis的基本概念,个人理解就是她的数据是以key-value型的方式存储,只是value的类型是多样的。
2.redis的安装
首先去下载安装包,在资源库里,我在最后一章放有。
1.解压缩安装包在d盘的指定的文件夹中:
2.配置环境变量:
点击属性,点击高级系统设置,点击环境变量,
然后在系统变量的path处添加你redis的安装包的目录:
然后在redis的目录下打开命令窗口:
输入redis-server.exe
这样代表redis启动成功。
3.redis客户段的使用
要访问redis的服务器,就要使用redis的客户端来访问redis的服务。
在redis的安装目录下开启cmd窗口,输入:redis-cli.exe
注意:你在使用这个窗口的时候不要关闭下面的窗口,不然后报错:
Could not connect to Redis at 127.0.0.1:6379
2.使用ping命令检测redis服务端和客户端之间的连通性:
出现pong代表检测成功。
接下来就是使用一些命令:
1.redis默认有16个数据库,初始默认使用0号,使用select命令来切换数据库:
我切换到8号数据库:
通过set命令设置键值,通过get命令取键值:
set 键名 键值
get 键名
这样的方式设置键值和取出建值。
关闭redis服务:shutdown
关闭成功的话,另外一个窗口就会显示:
本小结学会如何开启redis的服务器,以及检查服务器和客户端的连通性。还学会啦如何开启redis的客户端,并且在客户端设置键值,以及关闭redis服务。
4.关于key的相关命令
redis是key-value存储系统,所以key的操作非常重要。
下面直接跟着案例做熟练对key的操作。
开启redis的客户端和服务端之后,
1添加三个键值对然后使用keys * 来查询库中所有键:
2使用exists命令判断键key1和键key5是否存在:
这里的结果1为存在,0表示不存在。
3.使用del 命令删除键key1 查看当前库中所有键:
4.使用expire 命令设置键key2的过期时间为15秒,使用ttl 命令查看键key2的过期时间:
结果为-2表示已经过期。
5.查看当前库中key的数量:
使用 命令dbsize命令:
5.string类型的命令操作
String类型是redis数据库的最基本的数据类型,在一个redis中,字符串value最多可以是512m。
下面通过案例来实现:
在redis的1号数据库中添加3组键值对,通过对3组键值对进行不同的操作来熟练String类型的常用操作:
1.切换到1号数据库,然后使用mset命令添加3组键值对:
mget:获取多个键值对得值
mset:设置多个键值对
2.使用strlen命令获取键key2的值的长度:
3.使用incrby 命令为键key3 的值加5,然后使用decr 命令将键key3的值减1:
不加数字表示加减1.
4.使用setnx命令添加1组键值对,值为:i_love_beijing,然后使用getrange命令获取值中的biejing字符:
setnx 添加值之后每个字符的索引从零开始。获取值,7是第七个开始拿到第14个字符。
总结:本小节学会:
mget:获取多个键值对得值
mset:设置多个键值对,strlen命令获取键长度,incrby 命令为键值为数字的键增加长度,decr 命令则减少,setnx命令添加1组键值对,getrange命令获取值中的部分字符。
学生实践练习:
1.在8号数据库中批量添加4组键值对,4组键值对分别:key1:java,key2:python ,key3:20,key4:spring。
2.将键key3的值增加50,然后在减去20.
3.获取键key2中值的thon。
4.添加1组键值对并设置过期时间为10秒
5.完成上面的需求之后清空当前数据库并关闭reids服务
总结:在这里都是使用啦前面的操作命令,其中我不怎么熟悉的就是设置指令的过期时长expire,查看过期时长ttl,以及清楚当前数据库:flushdb,清空全部库:flushall。
6.redis的五大数据类型
五大类型为:String ,List,Set,Zset,Hash,String我们上面介绍过啦,只需要介绍剩下4中。
1.List类型的命令操作
通过下面的练习来熟悉对List的命令的掌握。
1.切换到2号数据库,使用Lpush和rpush命令添加List列表:
lpush:从列表左边插入值。rpush则相反。
所以key1列表数据:v6-v1。
2.将key1列表从左边吐出一个值,将key2列表从右边吐出一个值:
lpop从左边吐值,rpop从右边吐值,就是把值取出来(这时候里面没吐出来的值)
3.获取key1中获取下标为2的元素,获取key2列表下标为1——4的元素:
lindex是一个一个获取值,lrange是一个范围的获取值;从左到右获取。
4.在key2中将值35插入到值40前面:
linsert 列表名 before 哪个值之前 要插入的值
5.从列表key1的右边吐出一个值插入到key2 列表的左边:
rpoplpush key1 key2:从key1吐出一个值插入到key2列表中。
总结:本节学会list的几个命令:Lpush和rpush命令添加List列表(添加的顺序不同而已)添加值
2.lpop从左边吐值,rpop从右边吐值,就是把值取出来(这时候里面没吐出来的值)吐出值
3.lindex是一个一个获取值,lrange是一个范围的获取值;从左到右获取。(获取值)
4.在列表特定位置插入值:linsert 列表名 before 哪个值之前 要插入的值
5.两个表进行联动: rpoplpush key1 key2:从key1吐出一个值插入到key2列表中。
2.Set操作
对于添加查找删除操作比较方便。
通过下面的练习来熟悉set命令的操作
1.切换到3号数据库,使用sadd命令添加set列表:
sadd用来添加set类型的列表,通过smemeber取出set里面所有的值。
2.判断set1列表中是否存在值v10 :
sismember:用来判断列表中是否有对应的值
3.随机获取set1中的3个值:
srandmemer 随机获取值,然后后面是获取的值的个数。
4.随机从set1中吐出一个值:
scard是查看列表中元素个数,spop随机从集合中吐出一个值(吐出是把值拿出来,也就是列表里没有这个值啦)
5.获取set1,set2的交集和并集:
sinter是查看两个列表中的交集,sunion查看并集。
总结:本节知道set的操作:
sadd用来添加set类型的列表,通过smemeber取出set里面所有的值。
sismember:用来判断列表中是否有对应的值
srandmemer 随机获取值,然后后面是获取的值的个数。
scard是查看列表中元素个数,spop随机从集合中吐出一个值(吐出是把值拿出来,也就是列表里没有这个值啦)
sinter是查看两个列表中的交集,sunion查看并集。
3.hash类型
它适合用于存对象,类似java里面的map<String,Object>
接下来就是熟练它的操作:
1.切换到4号数据库,添加以恶搞hash集合:
hmset:批量设置集合中的键值对:格式在上面有。
2.获取集合中的name值:
使用hget获取people中名字为name的值
3.获取集合中所有建和值:
hkeys获取集合名pepole的所有键名
4.判断集合中hobby键是否存在:
使用hexists判断键是否存在
5.将集合中age键对应的值加2:
总结:这里知道hash是什么样子的,然后就是创建和获取键值,获取所有键和值(独立的操作),判断键是否存在,给键值为数字的键值加3.
4.Zset类型
这个类型与set类型非常相似,不同的就是zset 集合的所有成员都关联啦一个评分,这个评分用来给成员排序,集合成员是唯一的,不过评分是可以重复的。就比如你考试分数是一样的,可是人是不一样的。
开发者可以根据评分获取一个范围内的元素,可以用zset做一个 没有重复成员的智能列表。
接下来通过实验来增加对这个类型的操作的掌握:
1.切换到5数据库,添加1个zset集合:
90表示评分,v1表示键值。排序方式低到高。
2.获取分数在50-80 之间的结果集:
zrangebyscore zset1 50 80 withscores
withscores可以让分数和值一起返回到结果集。
3.值为v3的评分加5:
4.获取值为v3的排名:
总结:zset类似set集合,不过他一个对元素进行排序。操作学会创建zset集合,获取特定分数范围之间的结果,给特定值的评分增加,以及查看特定值在集合中的排名。
总练习
1.
2。
3.
4.
总结:本练习就是对zset类型的操作进行熟练,一开始我把符号看错啦,创建成set类型的,后面发现要求无序才改正过来,以后要阅读题目认真一点。
7.jedis客户端的操作
官方推荐的客户端:jedis,在使用jedis工具类之前,先导入对应的jar包:我放在啦资源文件里面啦。
首先需要导入对应的jar包:
eclips导包方式比较麻烦大家可以去网上收缩。
然后在创建的java项目创建一个类检测链接redis的服务是否成功。
想redis中添加string类型的数据,然后从redis中获取数据并打印到控制台中:
同理:添加list类型,以及set类型的数据也类似。
7.redis事务和持久化
redis的事务:
它的作用就是串联多个命令防止别的命令插队。
1.单独的隔离操作:也就是将多条命令加入队列,一次批量执行多条命令,每条命令会按顺序执行,事务执行过程中不会受客户端传入的命令请求影响。
2.没有隔离级别的概念:批量操作在发送 执行 命令前被放入队列缓存,并不会被实际执行。
3.没有原子性。redis的事务分为:组队和执行阶段。它们其中涉及到三个命令:multi,exec,disscard。输入multi开始,命令会进入命令队列,但是不执行。输入exec指令它们才依次执行。可以通过disscard来放弃组队。也就是同一个事务中有一条指令发生错误,只有这个指令停止,其他的继续。
接下来通过例子演示来理解:
1.执行multi命令,然后设置3组键值对(组队阶段,这时候命令是设置键值对)。然后执行exec命令(这时候组队阶段的命令才被执行)
2.执行multi命令,设置3组键值对,其中一组为错误的。然后执行exec命令(组队阶段出现错误):
3.执行multi命令,设置3组键值对,给其中一组键值对设置自增1,然后执行exec(组队阶段不出现错误,执行的时候才出现错误):
总结:通过本练习了解到:事务的特性,特别是它的原子性。如果在multi(组队阶段的时候出现啦错误,你exec的时候就不会进入执行阶段。如果是在执行阶段有错误,就继续执行下去,只有错误的那个不被执行)。
redis的持久化
redis的数据存在内存中,需要配置持久化把数据保存在磁盘上,当redis重启后就可以从磁盘中回复数据。
redis提供两种持久化方式:1.RDB和2.AOF
1.RDB持久化:在指定的时间间隔内将内存中的数据集 快照写入磁盘,它恢复时是将快照文件直接读到内存里。这个持久化方式是redis默认的,文件的保持路径默认在redis启动命令时命令行的目录下。
redis持久化时会单独创建一个子进程来进行持久化,redis把数据写入一个临时文件,持久化过程结束,再用临时文件替换上次持久化好的文件。主进程不进行任何io(读写)操作。如果需要大规模的恢复数据,对数据恢复的完整性要求不高,就使用这个方式。
优点:节省磁盘空间,恢复速度快。缺点:消耗性能,有数据丢失的风险。
通过下面的案例来理解rdb持久化机制:
1.将安装目录下的dump.rdb文件删除
2.在e盘下创建redisBAK文件夹
3.打开redis安装目录下的redis.windows-server.conf文件。在文件里面收缩:dir ./ ,然后修改为:dir D:\redisBAK
4.启动redis服务,同时加载上面的配置文件:
redis-server.exe redis.windows-service.conf
5.启动客户端,设置3组键值对,接着执行bgsave命令:
6.查看D:\redisBAK有
就代表RDB手动持久化成功。
7.查看dump.rdb文件的大小:
进行啦一次持久化。
8.设置六组组件,然后执行shutdown命令关闭服务:
此时关闭服务后:
文件大小变成184啦。由这里知道服务关闭前会进行一次RDB持久化。
9.打开前面的配置文件,收缩save,找到rdb默认保存策略位置, 修改保存策略位置:
执行操作4然后再一分钟内添加6组键值对,然后等一分钟之后再去查看dunmp.rdb的大小:
这样表示之定义保存策略完成。
2.AOF持久化
它的原理是以日志的形式来记录每个写操作。redis重启就会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。在redis中,aof默认不开启,需要手动开启。aof文件保存路径文件跟rdb的路径同。
优点:备份机制稳健,有可读的日志文件,通过操作aof文件可以处理误操作。
缺点:有性能压力,占用更多的磁盘,备份速度慢,有bug就会导致数据恢复不全。
aof备份和恢复操作同rdb。
如果aof和rdb两种方式同时开启,redis默认取aof的数据。
总结:通过本节我更深层次的理解啦redis的指令执行过程,以及它不保证原子性,在组队阶段出错就不执行下去啦,在执行阶段出错就继续执行正确的指令,以及它的持久化,也就是把内存的数据放到磁盘上以便保存。后面的操作就是对它持久化方式的更改之类的。