1.初识redis
redis是一个使用C语言编写开源的Key-Value数据库,它存储的数据可基于内存也可持久化到磁盘。数据居于内存可以快速访问,减轻数据库的压力。数据持久化到磁盘,便于redis内存数据的恢复,还有主从复制等,以此保证程序的高可用。
2.为什么访问内存的数据会快
中央处理器(CPU)直接与内存打交道,即CPU可以直接访问内存。而外存储器只能先将数据指令先调入内存然后再由内存调入CPU,CPU不能直接访问外存储器。
3.redis数据类型
ps:key都是string,数据类型指的是value
1.字符串(strings)
使用方式:设置、获取值、判断是否存在、追加长度、获取长度、删除、自增1、自减1、设置过期时间
set name "zhangsan" #设值
get name #获取name的值
exists mykey #判断该键是否存在,存在返回1,否则返回0。 (integer) 0
append mykey " world" #该键已经存在,因此返回追加后Value的总长度。
set mykey "this is a test" #通过set命令为键设置新值,并覆盖原有值。
strlen mykey #获取指定Key的字符长度。 (integer) 14
set mykey 20 #设置Key的值为20
ncr mykey #该Key的值递增1
decr mykey #该Key的值递减1
del mykey #删除已有键
setex mykey 15 "hello" #设置过期时间
业务使用场景:
ncr mykey #该Key的值递增1:自增可以用做mysql数据库的自增id
2.字符串列表(lists)
使用方式:类似java里面的linkList,注重的是数据的顺序问题,可以从头节点开始处理数据,也可以从尾节点开始处理。
lpush mykey a b c d #创建key为mykey的list,从左到右a b c d
lrange mykey 0 2 #取从位置0开始到位置2结束的3个元素。
1) "d" 2) "c" 3) "b"
lrange mykey 0 -1 #取链表中的全部元素,其中0表示第一个元素,-1表示最后一一个元素。 1) "d" 2) "c" 3) "b" 4) "a"
3.字符串集合(sets)
使用方式:类似java里面的HashSet, 不允许存在重复的成员。多个集合类型之间可以进行并集、交集和差集运算。
sadd myset a b c #插入测试数据,由于该键myset之前并不存在,三个成员都被正常插入。 sadd myset a d e #由于参数中的a在myset中已经存在,因此本次操作仅仅插入了d和e两个 sismember myset a #判断a是否已经存在,返回值为1表示存在
smembers myset #通过smembers命令查看插入的结果,从结果可以看出,输出的顺序和插入顺序无关。
spop myset #随机的移除并返回Set中的某一成员。 "a"
业务场景
1.可以使用Redis的Set数据类型跟踪一些唯一性数据,比如访问某一博客的唯一IP地址信息。对于此场景,我们仅需在每次访问该博客时将访问者的IP存入Redis中,Set数据类型会自动保证IP地址的唯一性
2.利用集合类型之间可以进行并集、交集和差集运算算出共有的好友之类
4.有序字符串集合(sorted sets)
使用方式:类似Java中的TreeSet,主要是用来排序。每个元素都会关联–个double类型的分数score(表示权重),可以通过权重的大小排序,元素的score可以相同
zadd myzset 1 "one" #添加一个分数为1的成员。
zadd myzset 2 "two" 3 "three" #添加两个分数分别是2和3的两个成员。
zrange myzset 0 -1 WITHSCORES #0表示第一个成员,-1表示最后一个成员。
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
zrangebyscore myzset 1 2 #zrangebyscore key min max,获取分数满足表达式1 <= score <= 2的成员。
1) "one"
2) "two"
zrangebyscore myzset (1 2 #获取分数满足表达式1 < score <= 2的成员。
1) "two"
5.哈希(hashes)
使用方式:hash用于存储对象
hset myhash field1 "zhang" #给键值为myhash的键设置字段为field1,值为zhang。 ( hget myhash field1 #获取键值为myhash,字段为field1的值。
hget myhash field2 #myhash键中不存在field2字段,因此返回nil.
hset myhash field2 "san" #给myhash添加一个新的字段field2,其值为san。
hlen myhash #hlen命令获取myhash键的字段数量。
hexists myhash field1 #判断myhash键中是否存在字段名为field1的字段,由于存在,返回值为1。
hdel myhash field1 #删除myhash键中字段名为field1的字段,删除成功返回1
4.一些通用命令
删除指定key: del key
获取key是否存在:exists key
获取key的类型:type key
设置有效时间(秒):expire key seconds
设置有效时间(分钟):pexpire key milliseconds
获取key的有效时间(秒):ttl key
获取key的有效时间(分钟):pttl key
把key的过期时间设置为永久的,也就是没有过期时间:persist key
为key 改名:rename key newkey
对所有key排序:sort
切换数据库(默认是16个库,选第一个):select index
5.数据删除策略
redis的数据删除,是指删除那些设置了过期时间并且已经过期了的数据
1.定时删除:创建一个定时器,一段时间就检查一下又哪些key过期的就删
优点:节约内存
缺点:消耗cpu,无论这时cpu是否繁忙都占用
2.惰性删除:key过期后不会马上删,而是等到下次查询时再删
类似java中的惰性加载,等到要用到才去初始化。
优点:节约cpu性能
缺点:消耗内存
3.定期删除:周期性轮询redis库中的时效性数据,采用随机抽取策略,利用过期数据占比的方式控制删除的频度。
1、CPU性能占用设置了峰值,检测频度可以自己配置。
2、内存压力不是很大,长期占用内存的冷数据会被持续清理。
6.初识redis事务
事务:为了避免多条连续的redis指令在执行时被干扰,打断等,就需要开启事务。
Redis同一事务中如果有一条命令执行失败,其它的命令仍然会被执行,没有回滚.
watch key1 key2:监视一个或多个key,如果监视的key被其它命令所修改,则事务被打断
multi:标记Redis事务的开始
discard:放弃事务
exec:执行事务
unwatch:取消watch对所有key的监视
7.redis持久化
1.rdb:是保存每次快照的结果,可能会丢失数据
优点:
rdb是一个压缩的二进制文件,存储效率高
rdb存储的是数据快照,适合用于数据的备份,恢复数据比较快
缺点:
备份不是持续性的,可能丢数据
bgsave会新起一个线程来备份,会消耗一部分的性能
可能出现版本之间数据不兼容情况
2.aof:是保存每一次操作的结果
aof是记录每一次操作的,有三种写入数据策略
always:每次写入操作都同步到aof文件,数据零误差,性能低
everysec:每秒同步一次,性能较高,默认配置
no:由操作系统控制什么时候写入
aof重写:随着命令不断写入,aof文件会非常大,为了优化这种情况,提供了重写机制。简单来说就是将同一个数据的若干条命令执行结果化成最终结果数据对应的指令记录。
比如 set a "a1",set a "a2" ,set a "a3" 那就等于 set a "a3"
rdb和aof的对比
8.jedis和springbootdata封装的区别
9.配置文件redis.conf一些常用配置参考
10.主从复制
大体实现:主节点负责写入数据,然后通过rdb方式保存数据,再把数据发送给从节点,从节点负责对外提供数据读取。
主从复制过程(三步)
master的操作
slave的操作
主从复制中的问题:
频繁网络中断
数据不一致
11.哨兵模式
哨兵模式的作用就是监控redis服务是否存活。模式是单独起一个进程,通过发送命令等待redis服务器响应来判断redis是否已经挂了,如果挂了会选举新的leader。