Redis

2020-03-06 16:11:29来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

Redis

Redis

Redis官网:https://redis.io

为什么需要引入redis?

redis的主要作用,就是用来降低数据库的压力,将系统常用到的数据缓存到redis,那么下次用户再次进行访问的时候
就可以直接从redis中获得数据并返回回去,就不用去请求数据库了

redis命令行客户端的基本操作:

redis-cli -a password shutdown:                关闭redis
./redis_init_script stop:                      关闭redis
redis-cli:                                     进入到redis客户端
auth pwd:                                      输入密码
set key value:                                 设置缓存
get key:                                       获得缓存
del key:                                       删除缓存
redis-cli -a password ping:                    查看是否存活
set key value ex 20:                           设置缓存过期时间为20秒
keys *                                          查看所有键

redis的数据类型 - string:

append key 123                 追加字符串,假设key为name,它的值是imooc,追加过后就为imooc123

strlen key                     查看字符串的长度

incr key                       累加,假设有个key是age,值是18,这时操作incr age之后,age的值就会是19

decr key                       累减  

incrby key num                 为某个键增加num,假设key是age,值是18,incrby age 10之后,age的值就是28

decrby key num                 累减num

mset key value key value       mset可以同时设置多个键值对

mget key1 key2                 mget可以同时获取多个键的值

flushdb                        清除当前库的所有缓存

flushall                       清除所有库的所有缓存

Redis默认有16个库,每个库都是独立存在的,下标从0开始,可以通过select 1 or 2 or 3 ....来进行切换

Redis数据类型之 - hash:对象

hash可以保存对象,比方说有个user对象,这个对象包含姓名、年龄、性别等属性,同样可以保存到redis中去的

hset 对象名 属性 值                 设置对象的某个属性的值:hset user name imooc 
hget 对象名 属性                    获取对象的某个属性的值:hget user name
hmset 对象名 属性1 值 属性2 值        同时设置对象的多个属性的值:hmset user age 19 sex man
hmget 对象名 属性1 属性2             获取对象的多个属性的值:hmget user name age
hgetall 对象名                 获取对象的所有属性名和值:hgetall user  返回:name imooc age 18 sex man
hkeys 对象名                   获取对象的所有属性名:hkeys user  返回:name age sex
hvals 对象名                   获取对象的所有属性的值:hvals user 返回:imooc 18 man
hincrby 对象名 属性名 值         累加对象的某个属性值:hincrby user age 3,为age这个属性+3
hincrbyfloat 对象名 属性名 值    这个值可以是小数:hincrby user age 2.2
hexists 对象名 属性名           判断这个对象中的某个属性是否存在,存在返回1,不存在返回0
hdel 对象名 属性名              删除对象的某个属性

Redis数据类型之 - list:列表、数组

lpush 列表名 值1 值2 值3 值4        存入一个list:lpush list1 1 2 3 4
lrange 列表名 start stop           获取列表中start到stop的数据:lrange list1 0 -1,-1代表最后一位

lpush和rpush            都是添加一个列表,有所不同的是,lpush存入数据的顺序相当于是一个栈的形势排列,而
                        rpush是一个队列的形势所排列

lpop 列表名              从列表的第一个元素开始取出数据,取出后,缓存中也没有这个数据了
rpop 列表名              和lpop正好相反的,从后往前取出一个数据,取出后缓存中也没有这个数据了

llen 列表名              获取列表的元素个数

lindex 列表名 下标        获取列表中指定下标的元素

lset 列表名 index value  设置列表中指定下标的元素的值     

linset 列表名 BEFORE|AFTER 元素名 value   BEFORE是前,AFTER是后,代表在这个列表中的某个元素的前面或者是
                                        后面插入一个新的元素value

lrem 列表名 删除的数量 要删除的元素     lrem list1 2 aaa:表示要从这个列表中删除2个aaa的元素

del 列表名                删除整个列表

Redis数据类型之 - set:去重的set,不可存放相同的数据,会自动去重

sadd  set               往set中添加数据
smembers set            查看set中的所有数据
scard ser               查看set中的数据个数
sismember set 元素名     判断set中是否存在这个数据  
srem set 元素名          删除set中指定的元素
spop set 元素个数        取出set中指定数量的元素,set中将不再存在这些数据
smove set1 set2 10      从set1中移除10,存放到set2中
sdiff set1 set2         找出set1中存在,而set2中不存在的数据
sinter set1 set2        找出set1和set2中都存在的数据
sunion set1 set2        将两个set进行合并  

Redis数据类型之 - zset:有序的set,同样可以自动去重

zadd zset(自定义) 分数 元素      zset中,每个元素都绑定了一个分数,根据分数进行排序的
zrange zset 0 -1               查看zset中的所有元素
zrank zset 元素名               获取这个元素在zset中的下标
zscore zset 元素名              获取这个元素的分数
zcard zset                     获取zset中的元素个数
zcount zset 20 40              获取zset中20-40分的数据个数,包含20和40

Redis命令参考网址:redisdoc.com

Redis持久化机制:RDS、AOF

RDS:每隔一段时间进行一次全量备份,在发生故障时,可能会丢失最后一次备份的数据
AOF:近乎实时的进行数据备份,每秒一次。发生故障时,也只会丢失最后一秒的数据
     性能相比RDS慢一些,曾经发生过bug,数据恢复的时候数据不完整

Redis主从架构(读写分离):

一台主节点,两台从节点,读的操作都交给从节点,写的操作都是主节点
如果master节点挂掉的话,那些从节点并不会自动成为一个master,也不会有新的缓存写入到这些从节点

从节点启动后,会发一个ping包给主节点,告诉它我已经启动了,然后主节点就将它的数据复制给从节点

最常见的模式:1主2从

想要开启主从模式,那么在主节点的那个Redis必须开启持久化
如何配置主从模式,Redis默认的是master,输入info replication可以查看当前节点的状态
在作为从节点的服务器的Redis中修改它的核心配置文件,搜索Rep,输入主节点的IP和端口号,如果redis暴露在公网的话,还需要设置它的一个密码



### Redis无磁盘化复制:
开启无磁盘化复制之后,redis的数据将不再是从rdb文件中通过磁盘传输,而是通过socket将内存中的数据同步到从节点中,
可以在Redis的核心配置文件中去设置是否开启无磁盘复制,还有一个等待时间,以秒为单位,多久之后开始数据的同步


### Redis缓存过期机制:
    这个机制是针对那些设置了过期时间的key,key可以设置过期时间,但是过期之后虽然访问不到了,但依然还是占用着内存

    1.主动,定期删除
        可以通过设置,定期的去删除掉缓存中已经过期的key,这样,就可以将这些已经过期的key所占用的内存释放掉。
        redis核心配置文件中搜索hz,会有一个参数,代表着每秒扫描多少次,默认是10,次数越大,占用的CPU资源就越多


    2.被动,惰性删除    
        客户端如果请求了一个过期的key,这个时候,redis才会将这个过期的key清除掉,释放它所占用的内存



### 内存淘汰管理机制:
    在redis核心配置文件中有maxmemory这么一个参数,设置redis所占用最大的内存值,一旦达到这个值,讲会采用设置的算法
    对redis的key进行一个清除

    volatile-lfu:针对那些没有设置过期时间的key执行的一个最少使用算法,哪些key使用的少,就清除掉哪些key
    allkeys-lfu:针对所有的key执行一个最少使用算法的清除
    volatile-random:针对那些没有设置过期时间的key执行的一个随机算法,随机删除一些key
    allkeys-random:针对所有的key执行一个随机算法,随机删除一些key
    volatile-ttl:针对那些设置了过期时间,即将过期还未过期的key,进行一个删除
    noeviction:旧缓存永不过期,新缓存设置不了,返回错误

Redis的哨兵模式:Sentinel

为什么需要哨兵,因为在常见的一主二从的redis架构中,如果master节点挂掉的话,那些从节点并不会自动成为一个master,也不会有新的缓存写入到这些从节点,在从节点中进行写入数据的话也会报一个error,所以引入哨兵模式。

哨兵监控所有的Redis的master服务及其下的从服务,如果master服务挂掉的话,会自动将一台从节点升级为master节点

哨兵部署约定:

哨兵节点最少需要3个或者奇数个数节点(为了客观下线的准确度)
哨兵需要部署在不同的服务器
一组哨兵只监听一组主从

Redis缓存穿透:

什么是缓存穿透,举个例子,用户请求某个数据,这个数据在数据库中不存在,在redis中也不存在,那么当用户大量发起这种
数据不存在的请求时,可能造成数据库的宕机,这就是缓存穿透

解决方案:当用户请求某个空的数据的时候,我们也将这个空的数据保存到redis中,这样下次用户再次请求,会直接通过redis
        进行一个返回,而不会到达数据库,同时我们可以给这个空的key设置一个过期时间,到时间后会自动过期

        布隆过滤器

Redis缓存雪崩:

什么是缓存雪崩:举个例子,在同一时间,redis中大量的key都过期了,同时又有大量的流量涌入进来,这个时候,所有的请求都会
             直接打到数据库中,可能会造成数据库的一个宕机,这就是缓存雪崩

解决方案:
    1.key永不过期
    2.过期时间进行一个错开
    3.多缓存结合
    4.购买第三方redis产品,如阿里云的,腾讯云的

多路IO复用模型??


原文链接:https://www.cnblogs.com/islcz/p/Redis.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:spring——AOP原理及源码(三)

下一篇:【java框架】Spring(1) -- Spring入门