简单的redis

redis

      安装

            1、下载 redis.tar.gz

            2、make

            3、make install

            4、换端口启动:redis server --port 6380  使用:./redis-cli -p 6380

            5、指定配置文件可以多开redis启动:

                  1、 复制一个新的redis.conf并更名为redis端口号.conf

                  2、在redis根目录下新增data目录,存放日志

                  3、port改为6380,logfile改为6380.log,dir改为data目录

                          

                  4、启动:./redis-server ../redis端口号.conf;     使用:./redis-cli -p 端口号

      1、介绍

                  1、数据之间没有关系

扫描二维码关注公众号,回复: 12719498 查看本文章

                  2、单线程工作

                  3、高性能

                  4、多数据类型

                  5、持久化存储,用于备份

      2、string 

                  类型:一个key存储一个value

                  1、增加/获取/删除:set    name  del

                  2、添加多个数据:mset key1 value1 key2 value2 

                  3、获取多个数据: mget key1 key 2

                  4、获取长度:strlen

                  5、拼接:append key value

                  6、自增 :incr key; 自增几个:incrby key  数字

                  7、自减:decr key; 自减几个:decr key  数字

                  8、设置过期时间:setex key 秒 value;  psetex key 毫秒 value

                  9、key的数据分类可以用冒号(:)拼接:user:001:001

     3、hash

                 类型:一个key对应key value,类似于一个key对应一个map

                 1、添加:hset key field value

                 2、删除:hdel key field 

                 3、获取:hget key field ;获取全部:hgetall

                 4、添加,获取多个:hmset hmget

                 5、获取字段数量:hlen key

                 6、判断是否有指定字段:hexists key field

                 7、获取所有的key和value:hkeys  hvals

                 8、自增:hincrby key field  数值

      4、list

                 类型:存多个数据,有序

                 原理:使用的是双向链表的方式进行存储

                 注意:由于是链表格式,是右边入,左边查,才会是先进先出。右边入,右边出就会是先进后出

                 1、添加:lpush key value ;  rpush key value

                 2、查询:从第几个到第几个:lrange key start stop;   查角标:lindex key index; 查长度:llen key

                 3、获取并移除:lpop key; rpop key

                 4、规定时间内获取并且移除数据:blpop key 时间  ;brpop key 时间  ;

                 5、删除list中几个数据:lrem key  count  value

      5、set

                 1、介绍

                      数据不能重复,可以存储大量数据,查询效率更高。list内部是双向链表,所以存储大量数据会很慢

                2、存储结构

                      hash的结构,一个key对应多个field,field的key为值,value为null,就是set的结构

                3、添加:sadd key value

                4、查询所有数据:smembers key

                5、删除数据:srem key

                6、获取数据总量:scard key

                7、查询是否存在该值:sismmeber key

                8、随机获取一个数据:srandmember key

                9、随机取出一个数据:spop key

               10、取交、并、差集:sinter key1 key2, sunion key1 key2,sdiff key1 key2

               11、将两个的交、并、差集放到一个集合中:sinterstore 新集合名称 key1 key2

               12、将set中的数据放到新set中:smove 原set  原set中数据  新set

     6、sorted_set

                 1、介绍

                        保存可排序的set数据,也可以存储大量数据

                2、原理

                      在set的基础上加了一列排序

                3、添加:zadd key score value 

                4、获取数据:zrange key start stop ;反向获取数据:zrevrange key start stop

                5、删除数据:zrem key

                6、条件获取数据:zrangebyscore key start stop ;反向:zrevrangebyscore key start stop 

                7、条件删除数据:zrembyscore key start stop

   7、通用操作

                1、删除:del key

                2、是否存在:exists key

               3、key类型:type key

               4、设置有效时间:expire key  秒 ;pexpire key  毫秒

               5、获取有效期:ttl key ; pttl key   ;转换为永久:persist key

               6、查询key:keys * 

               

   8、可视化工具下载

              redis可视化工具:跳转

   9、持久化

       1、介绍

                储存在本地,启动后读到内存中。防止redis数据丢失

       2、RDB

          1、执行save就可以存储到本地的redis根目录下

          2、rdb相关配置配置

                   1、设置文件名称,默认是dump.rdb

                        dbfilename dump.rdb

                   2、文件储存路径

                        dir  文件路径

                   3、是否压缩数据,可以节省cpu时间,默认开启

                        rdbcompression  yes

                   4、是否校验文件

                       rdbchecksum yes

                   5、原理

                        单线程存储到本地,如果文件大,会拖慢进程,因为是单线程

           3、bgsave

                   1、介绍

                      后台执行存储到本地,子进程执行,推荐使用

                  2、如果出现错误,是否要继续执行:

                      stop-writes-bgsave-error yes

           4、配置自动保存

                       save  秒 key执行次数

                      满足时间范围内 key 的执行次数 达到设置的执行次数就进行持久化储存

           5、优点

                    1、存储的是二进制文件,效率高

                    2、存储的是某个时间段的数据快照,适合数据备份,全量赋值

                    3、数据恢复速度比AOF快

           6、缺点

                    1、不能做实时持久化

                    2、运行子线程,会牺牲性能

                    3、各个版本之间的数据可能不能兼容

                    4、数据量大,全量赋值慢

   

       3、AOF

            1、介绍

                     存储的是操作记录,降低丢失数据的可能性,也不会有那么大的数据量

            2、策略

                     1、每次都存储:always

                         性能差

                     2、每秒存储一次:evelysec

                         相对性能好,建议使用

                     3、系统决定:no

            3、使用

                      1、开启:appendOnly yes

                      2、设置策略:appendfsync always|evelysec|no

            4、问题

                     1、aof重写

                           连续使用三个set name 不同值  ,备份没有意义,解决方案

                          1、规则:

                               超时数据不再写入

                               对数据无效指令不再写入

                               对同一数据的多条指令合并为一条写指令

                          2、配置:

                               命令行执行该操作,aof文件重写:bgrewriteaof

                               自动条件重写:

                                      aof缓冲区大小到达该文件大小自动重写:aoto-aof-rewrite-min-size 文件大小

                                      当前缓冲期百分比到达设定值后自动重写:aoto-aof-rewrite-percentage 百分比

    10、事务

             1、使用

                       1、开始结束事务:multi   exec

                        2、回滚事务:discard

             2、问题

                        1、如果事务中输入了错误指令,会造成所有指令都不能执行

                        2、如果是指令正确,但是执行后却发生了错误,会正常执行,只能是程序员自己进行回滚

    11、锁

           1、对值加锁

                      事务前增加对key 的监控,如果结束事务之前key被修改了,则事务执行失败

                      1、加监控:watch key1 key2  

                      2、取消所有值的监控: unwatch

             2、分布式锁

                       如果已经有值了返回失败,没有纸,返回成功,解锁时删除锁即可,适合使用商品秒杀

                       1、加锁:setnx  key value

                       2、删除锁:del key

                       3、问题:只加了锁,系统坏了,怎么办

                                加锁后增加失效:expire  key  秒,该时间尽量短

    12、删除策略

            1、过期数据

                        已经过期的数据,其实并没有直接被删除,而是还存在cpu中

                        我们要做的是让cpu闲着的时候再去处理过期数据

                        1、定时删除

                              当数据过期时,定时器来删除内存中的数据

                              好处:节约内存 

                              坏处:影响cpu效率

                        2、惰性删除

                             下次访问数据的时候,如果查看到该数据已过期,删除数据

                              坏处:内存占用量大

                        3、定期删除

                              1、每秒执行几次:server.hz

                              2、每次检查几个:ACTIVE_EXPIRE_CYCLE_LOOKUPS_PRE_LOOP

                              3、记录已经到哪一个数据库了:current_db

                              每秒钟执行server.hz次检测redis中的数据,随机检测key,如果第一次删除的key大于百分之W*25,再次执行该过程

             2、逐出算法

                 1、介绍

                            在每次调用命令时,都会查询一次内存是否充足,如果内存不足了,会临时删除一些数据,判断删除哪些数据就是逐出算法

                 2、相关参数

                            1、最大内存(默认全用):maxmemory

                            2、每次获取的数据个数(每次查询不是全表查,而是随机查几个):maxmemory-samples

                            3、内存不足时策略:maxmemory-policy

                            4、策略:

                                  1、检测易失数据

                                     1、volatile-lru:最长时间没有用的数据淘汰

                                     2、volatile-lfu:挑选数据使用次数最少的淘汰

                                     3、volatile-ttl:挑选快过期的数据淘汰

                                     4、volatile-random:随机淘汰

                                  2、检测所有数据

                                     1、allkeys-lru:最长时间没有用的数据淘汰

                                     2、allkeys-lfu:挑选数据使用次数最少的淘汰

                                     3、allkeys-random:随机淘汰

                                  3、不淘汰:no-enviction

     13、主从复制

             1、什么是主从复制

                         保证高可用,防止机器故障。解决方案就是创建多个服务器,一个服务挂了,其他服务也能直接用,每个服务器之间的数据都是同步的。

                        分为主服务器(master)和从服务器(slave),主服务器只操作写,从服务器只执行读

              2、链接过程

                        1、从服务器发送向主服务器链接的指令:saveof ip port

                        2、主服务器响应成功

                        3、从服务器保存主服务器的所有信息,并创建一个与主服务器的socket,保证数据的一致性

                        4、定时向主服务器ping一下保证正在运行

                        5、主服务器回应从服务器

                        6、主服务器保存从服务器的端口

                        

          3、开始连接

                    1、将配置文件中daemonize守护线程关闭,logfile日志文件注释

                    2、配置文件连接主服务器:slaveof ip port

                    3、查询到当前的链接信息:info

                            

                   4、关闭链接:slaveof no one

          4、同步过程

                   全量复制开始

                  1、从服务器发送同步请求

                  2、主服务器使用rdb方式bgsave存储到本地

                  3、当有从服务器链接时,创建命令缓冲区缓存用户执行的命令,是为了全量复制完后,将这些用户命令发给从服务器,保证数据不丢失

                  4、主服务器生成rdb文件,soket方式发送给从服务器

                  5、从服务器清空key,执行rdb文件

                  全量复制结束

                   部分复制开始

                 6、从服务器告知主服务器已经全量复制完成

                 7、主服务器将命令缓存中的命令aof方式发给从服务器

                 8、从服务器执行aof恢复数据

                  部分复制完成

                   

          5、需要注意

                  1、数据量过大时,避免高峰期同步,尽量关闭服务器进行同步

                  2、当命令缓冲区满了后,最开始的命令就会被挤出,此时如果发现部分恢复时出现数据丢失的情况,则会第二次全量复制,也就进入了死循环,也就需要给主服务器设置合理的命令缓冲区大小

                          repl-backlog-size 1mb

   14、哨兵

         1、哨兵简介

                 当master宕机时,哨兵可以通过投票的方式推选出一个新的master作为主服务器,并将slave都连到新的master  

                 由于是投票,尽量配置单数,方式投票打平 

         2、配置

                1、创建sentinel-26379.conf

port 26379

dir /tmp

# master的ip端口  1:1个哨兵同意即可算投票通过
sentinel monitor mymaster 192.168.149.131 6379 1

#master 多长时间没响应就算宕机  毫秒
sentinel down-after-milliseconds mymaster 30000

#master宕机,新的slave一次几个同步
sentinel parallel-syncs mymaster 1

#多长时间同步完成算有效
sentinel failover-timeout mymaster 180000

             2、启动: ./redis-sentinel ../sentinel-26379.conf

  15、缓存预热

                1、服务器启动直接宕机

                     原因:请求量大,同步数量大

                2、解决

                   系统启动之前,先将数据加载到缓存系统

  16、缓存雪崩

                1、访问数剧增,导致崩溃

                解决:

                     1、业务优化,限制请求

                     2、加分布式锁,拿到锁的运行,没拿到锁的等待

   17、缓存击穿

               1、redis数据平稳,但是数据库蹦了,原因是大量流量访问同一个已经过期的数据,访问不到,就去查询了数据库,数据库崩溃了

               解决:

                    1、可以设置永久key

                    2、快到高峰值前更新过期时间

                    3、加分布式锁

   18、缓存穿透

              1、黑客攻击,访问一个redis不存在的id,直接查询数据库,给数据库造成压力

               解决:布隆过滤器

 根据key获取多个hash,存入bit数组中,bit数组初始化都是0,存入到bit数组中的改为1,。获取时,只要判断bit数组位置上都是1,也就是存在,可能会出现误判,因为可能会出现算出的hash值和别的值重叠,如果想要出现重叠次数少,就增大数组长度,减少hash次数。
1 系统启动需要先将数据给布隆过滤器初始化值
2 用户访问数据,先查询下布隆过滤器中是否可能存在,如果不存在,则直接返回空,如果可能存在,则去查询缓存,如果缓存也没有,再去查询数据库

猜你喜欢

转载自blog.csdn.net/qq_38384460/article/details/113989647
今日推荐