Redis学习笔记

中文官网地址:http://www.redis.cn
中文API文档地址:http://redisdoc.com

一、部署Redis

1.安装

[root@localhost ~]# yum -y install wget 
[root@localhost ~]# wget http://download.redis.io/releases/redis-6.0.6.tar.gz
[root@localhost ~]# tar xzf redis-6.0.6.tar.gz
[root@localhost ~]# cd redis-6.0.6
[root@localhost ~]# make   #提示报错选装GCC:yum install gcc-c++

2.开启进程守护

[root@localhost redis-6.0.6]# vi  redis.conf

# Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
daemonize yes

3.开启服务

[root@localhost ~]# cd /usr/local/bin/
[root@localhost bin]# redis-server  /redis-6.0.6/redis.conf
[root@localhost bin]# redis-cli  -p 6379
127.0.0.1:6379> ping
PONG

注:如果在/usr/local/bin/中没有命令那就到安装目录/redis-6.0.6/src下查看命令

[root@localhost ~]# cd /redis-6.0.6/src

4.关闭服务

127.0.0.1:6379> shutdown
not connected> exit

5.安装目录文件声明
redis-benchmark:性能测试工具,测试性能
redis-check-aof:修复有问题的AOF文件,
redis-check-dump:修复有问题的dump.rdb文件
redis-cli:客户端,操作入口
redis-sentinel:redis集群使用
redis-server:Redis服务器启动命令

参考于:https://blog.csdn.net/yangliuhbhd/article/details/81317689

二、Redis常用命令

Redis五大数据类型String(字符串)、Hash(哈希类似Java的Map)、List(列表)、Set(集合)、Zset(有序集合)

①String
1.添加:set [key] [value]。带生命周期添加:setex [key] [秒数] [value]。带判断存在添加:setnx [key] [value]。
2.查询:keys [*]
3.删除:DEL [key]。使用FLUSHDB:清除当前数据库,FLUSHALL:清除所有数据库
4.移动:MOVE [key] [所移数据库名]
5.设置过期时间:EXPIRE [key名] [秒数],查看过期时间ttl [key名],如果为-1表示永不过期,-2表示已过期。其它时间为倒数秒数,已经过期的数据就被删除了,不会再keys *中查询到。
6.只增加数字不增字符串:INCR/DECR [key名],增/减一。同理INCRBY/DECRBY [key名] [数字]。
7.定点查看字符串:GETRANGE [key名] [前下标] [后下标] ,截取下标添加字符串命令:SETRANGE [key名] [始标] [内容]。
8.追加:APPEND [key名] [追加数据],查询长度:STRLEN [key名]
9.批量新增:mset [key] [value] [key] [value]……。批量获取:mget [key] [key] [key]。带判断的新增有序集合(如果数据库已存在都不会成功):msetnx [key] [value] [key] [value]……。

②List
1.列表LIST相关添加:分为LPUSH和RPUSH,LPUSH [key] [v1] [v2] [v3]……,分为左右进入,如果你是使用左边进的话LPUSH就是逆着出LRANGE,如果你是RPUSH就是顺着出来LRANGE。可以这样理解,当使用LRANGE时是从左到右进行输出,使用LPUSH是从中间往左边插入,使用RPUSH是从中间往右边输入。只有RPUSH是怎么进怎么出。
2.创建LIST列表,命令:lpush [key名] [数组],查看:LRANGE [LISTkey名] 0 -1,查看类型type [key名]。
3.列表出栈命令:lpop [key]和rpop [key],一个是从左边出栈,一个是从右边出栈。
4.通过下标获取list中的值,LINDEX [list] [下标值],是从左到右数的。下标从0开始。获取长度:LLEN [list]。
5.删除N个value:LREM [list] [所删除的个数] [所删除的数字],如果删除的个数大于本身存在的个数,他就会把存在的全部删了,不会报错。
6.截取出其中一段赋值给本身:LTRIM [list] [始标] [末标]。
7.右出栈左进栈:RPOPLPUSH [list01] [list02] 。就是把后面的list01的右边最后一个添加到list02的左边第一个。
8.通过下标更改某一个值:lset [key] [index] [value]。在某个地方前/后插值:LINSERT [key] [before/after] [本身存在value1] [新值value2]。

③Set
1.添加:sadd [set名] [value] [value] ……。如果有重复的,集合默认把重复的忽略进行添加不重复的值。
2.查询:SMEMBERS [set名]。查看一个值是否在集合中:SMEMBERS [set名] [value]。查看元素个数SCARD [set名]。
3.删除集合中的值:SREM [set] [value]。
4.随机出值个数:SRANDMEMBER [set] [个数]。可用来抽奖。随机出栈:spop [set]。
5.移动一个值到另外的集合中:SMOVE [set源] [set目标] [所移动值]。
6.差集:SDIFF [set1集合] [set2集合] ……。所得出的数字是以set1集合为目标,不在后面任何一个集合中的数字出现。
7.交集:SINTER [set1集合] [set2集合] ……。所得出的数字是在这些集合中都有的数字。
8.并集:SUNION [set1集合] [set2集合] ……。所得出的数字是在这些全部数字但是不重复。

④Hash(KV模式不变,但是V又是一个键值对)
1.添加hash:hset [hash-key] [value-key] [value]。表示前面是添加符号,value-key表示的是value的key名字,最后面才是真正的value。
2.批量添加hash:hmset [hash-key] [value-key1][value1] [value-key2][value2] ……。所添加的就是一key为名的hash。批量获得hash:hmget [hash-key] [value-key1] [value-key2] 就可获得他们的value。第二种批量获得是:HGETALL [hash-key] 。会批量的得到前面是key后面的value的hash。
3.删除hash中某个value-key的value:hdel [hash-key] [value-key]。
4.获得hash的长度:hlen [hash-key]。
5.检测value-key是否存在hash中:HEXITS [hash-key] [value-key]。返回1为存在,返回0位不存在。
6.获取hash中每个keys的值:HKEYS [hash-key]。获取hash中每个value的值:HVALUES [hash-key]
7.使hash中数字key的value增减:HINCRBY [hash-key] [value-key] [所增长数字]。如果是浮点就是:HINCRBYFLOAT [hash-key] [value-key] [所增长数字]。
8.带判断存在的填充进入hash:HSETNX [hash-key] [value-key] [value]。

⑤Zset有序集合(相当于在set集合基础之上加一个score值)
1.添加有序集合:zadd [zset-key] [score1] [value1] [score2] [value2] ……。意思为后面的每个score和value是绑定到一起的是一个value。
2.序列输出:ZRANGE [zset-key] [0始标] [-1终标]。带有分数的序列输出:ZRANGE [zset-key] [始标] [终标] withscores。
3.输出范围的序列:ZRANGEBYSCORE [zset-key] [始分] [终分]。不包含命令:ZRANGEBYSCORE [zset-key] ([始分] ([终分]。在范围前加一个“(”表示不包含这个数。从范围序列中再进行筛选:ZRANGEBYSCORE [zset-key] [始分] [终分] limit [始标] [所取个数]。
4.删除某个值:ZREM [zset-key] [value]。把分数和value是一起删除的。
5.统计个数:ZCARD [zset-key]:分数和value是一体的,所以只有value的个数。
6.统计范围scores的个数:ZCOUNT [zset-key] [始分] [终分]。
7.顺序统计排名(以0开始):ZRANK [zset-key] [value]。根据值输出对应分数:ZSCORE [zset-key] [value]。
8.逆序统计排名:ZREVRANK [zset-key] [value]。逆序获得名次。逆序统计名次输出:ZREVRANGE [zset-key] [0始标] [-1终标]。

三、Redis如何持久化

1.RDB、AOF。
2.RDB、AOF在指定的时间间隔内将内存中的数据集快照写入磁盘,
也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。Redis会单独创建( fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。Fork的作用是赋值一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等)数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程。在这里插入图片描述
3.在redis.conf配置文件中,系统会默默的给您生成三个策略,把dump.rdb保存到你的磁盘当中,这就是实现的持久化。
4.redis数据库中,运维会帮您把dump.rdb进行远程备份。当您使用FLUSHALL的时候清空了数据库在使用SHUTDOWN的时候他就将已经清空了的数据库保存下来了。所以这样下次就不能自动加载dump.rdb进行自动回复,需要下载dump.rdb进行恢复。简单来说:每次使用SHUTDOWN也会保存一次dump.rdb但是没有意义。如果有一个重要的数据需要保存,所以马上备份就是直接使用save命令,全部阻塞只管保存。bgsave是异步请求,一边保存一边接受新的增删。
5.RDB是非常紧凑文件,在保存文件父进程fork出子进程工作全由子进程做,所以RDB持久化方式可以最大化redis的性能。与AOF相比,恢复大的数据集时,RDB更快。缺点:丢失数据风险大,fork过程耗时间不能及时响应。
6.AOF:Append Only File:是在redis.conf配置文件append中默认关闭,我们将它开启之后它就会每次记录写入的操作。
7.AOF和RDB能够同时存在的,Redis启动时先读取AOF,如果AOF出现问题那么Redis启动被拒绝。如何解决?使用redis-check-aof自动帮你删除掉不符合它语法逻辑的,截断后面的。
8.重写原理,Redis会记录上次重写时的AOF大小,默认配置是当AOF大小是上次rewrite后大小的已被且文件大于64M时触发。但是现在至少的3GB起步了。
9.AOF文件是一个只进行追加的日志文件,Redis可以在AOF文件体积变得过大时,自动后台进行重写。AOF文件有序保存了对数据库写入操作,以Redis协议的格式保存,因此AOF文件的内容非常让人容易读懂。缺点:对于RDB来说AOF文件要大很多,根据fsync策略,AOF速度慢于RDB。
10.最终的性能建议:RDB作为后备策略,主要使用AOF来进行数据持久化。

四、事务

1.开启事务:MULTI。通常返回OK,之后进行的每个命令返回的都是QUEUED,最后使用EXEC就会返回一个队列为前面所执行的每一个结果输出。放弃事务不提交:DISCARD。
2.全体连坐:中间有一个出错了的话(注意是在加入队列的时候就报错(error),相当于Java的编译时报错,这样的出错叫做全体连坐),事务提交不上去,所以就没有这一条事务,对应原子性。
3.冤头债主:中间有一个是出错了(但是他出错在加入队列的时候是能够加进去的,返回QUEUED而不是报错信息)这样最后提交事务EXEC那么错误的那条报错,其它的是能够提交上去的。
4.表锁:使用的时候整表锁住,一致性最高,并发性极差。行锁:加锁力度小一点,一致性一般,并发性较好。
5.悲观锁:相当于表锁,把整张表都锁住,每次使用都上锁,知道下一个拿到锁之后才能进行修改。乐观锁:相当于GitHub的Push推送,需要将最新版本号Pull下来之后在进行修改后在Push,这样在保证并发性的同时并保持一致性,策略:提交的版本必须大于记录当前版本才能执行更新。
6.Watch监控(类似于乐观锁):假设一个信用卡时间,我这次使用了几块钱,下次就要换几块钱。使用balance和debt进行验证,初始为100和0。我们开始使用watch监控到balance之后,如果balance没有在其他线程进行修改那么它开启事务MULTI之后再进行decrby balance 20,incrby debt 20。最终提交exec那么它会出结果为80和20。 但是,如果在watch监控balance之后,另外一个线程去改变了balance的量之后,我们再进行之前的事务操作,事务就会失败。
7.UNwatch取消监控:第六条Watch监控失效之后,你所监控的key被修改了,那么需要使用UNwatch取消监控。之后在使用watch监控最新的版本,来进行开启事务MULTI,进行提交EXEC事务。这样就会成功。
8.一旦执行了EXEC或UNwatch之前被监控的所有key都被结算了。所以要重新监控。
9.了解redis有消息发布订阅。订阅:SUBSCRIBE [key1] [key2] [key3]……。另一个线程发布:PUBLISH [key名] [消息]。模糊订阅:PSUBSCRIBE [key]*,另一个线程发布:PUBLISH [key只要包含前一个key中的] [消息]。都会被接收到。

五、主从复制

1.Master用来写,Slave用来读。复制三个redis.conf,分别在redis后面加上端口号6379/80/81,之后进行配置他们的pidfile以及端口号和日志文件输出和dump+端口号。
2.分别使用三个配置文件开启端口号79 80 81的数据库,之后在使用info replication可以查看当前端口数据库是主还是从。之后从数据库使用SLAVEOF [ip地址] [端口号]来进行跟随主。并且在跟随主之前的数据都会被拷贝过来。
3.只有主机才能写,从机器只能读权限,所以他们写不了东西上去。
4.如果主机倒了,那么从机还是从机,不能变为主机,使用info replication还是从机。主机修复了之后从机依然跟随主机,不会发生任何改变,依然能够查询到主机添加的数据。
5.如果从机倒了,再进行端口打开连接,info replication那么他就从从机身份变成了主机身份,但是他是另外的一个主机身份,并不能查到之前主机数据库中的数据。除非写进了配置文件,不然都要重新连接主机。
6.一个主机可以有多个从机,但是一个从机只能有一个主机,从机可以跟随另外的一个从机,那么另外的中间从机它又是主机又是从机,但是它本身是不能写的所以这就形成了一个类似的链表结构。
7.中途变更转向:会清除之前的数据,重新读取新的主机的数据。
8.反客为主:SLAVEOF on noe。可以将主机已经下线的从机又变为新的主机。
9.哨兵模式:反客为主自动版。配置哨兵:sentinel monitor host6379 127.0.0.1 6379 1意思是代表监视6379的主机,如果SHUTDOWN了就后面跟随的从机器,谁的票数大于1就是谁是新主机。开启哨兵:redis-sentinel [sentinel.conf路径]。现在主机倒了,另外的从机会进行投票选出新的主机,而且不影响运行。但是如果倒掉的主机又重新连接上了,哨兵会将主机安排跟随新上位的从机。

六、IDEA中如何使用Jedis

1.在IDEA中常用命令使用方法,先New一个Jedis(“ip地址”,“端口号”);之后方法基本上都是与命令行是差不多的。
2.IDEA中开启事务:jedis.multi();提交事务:jedis.exec();开始监控:jedis.watch(‘keys名’);
3.模拟网络阻塞时被监控目标被修改情况:在watch之后使用一个线程睡眠,与此同时在linux界面上去修改这个被监控的值,这样事务不会被提交。
4.测试主从复制,new Jedis两个不同的端口号。之后从机.slaveof(“IP地址”,端口号),主机set值之后从机可以get到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值