Redis

Redis安装流程:

        先安装gcc

                使用yum install gcc

        解压Redis压缩包,tar -zxvf '压缩包名'

        进入到解压过后的Redis中,输入'make'编译成c编译环境

        使用'make install',进行最终安装

        最终Redis相关文件安装到  /usr/local/bin

Redis相关配置文件的说明:

        

将Redis改为后台模式:

        进入到redis.conf,将no改为yes

        

 使用后台模式启动Redis

        

  连接Redis

               

 关闭Redis:

        1.终端中关闭  shutdown

        2.单列关闭  redis-cli shutdown

        exit  退出Redis

Redis配置文件详解:

        redis只支持byte,并且其中的大小如下

        

         只能通过本地进行访问,注释了所有人就都可以访问

        

        开启保护模式,不支持远程访问,改为no支持远程访问 

        

         相当于屏幕保护,一段时间不使用,如果再想使用就不行了,单位秒

        

         把Redis的进程号存放在这个文件中

        

         Redis的日志级别

        

        设置日志输出的文件路径

         

  基本知识说明

     Redis中 有16个数据库,默认使用的第0个,使用select切换数据库。      

     dbsize:获取到当前数据库的空间大小     

     keys * :查看所有的key

    flushdb:清空当前数据库

    flushall:清空所有数据库

    exists 'key': 判断key是否存在

    type 'key':查看key的类型

    del 'key': 删除指定的key

    unlink 'key':根据value选择非阻塞删除,不会立马删除,会异步删除

    expire 'key' m:为key设置过期时间,以毫秒为单位,ttl 'key'查看还有多久过期,-1表示永不过期,-2表示已过期

    Reids是单线程的

    Redis是基于内存操作的,cpu不是Redis的瓶颈,Redis的瓶颈是根据机器的内存和网络的带宽

Redis有两种启动方式:

    1.前台启动

    2.后台启动

          进入redis.conf文件,将daemonize no改为yes

          redis-server /redis.conf     启动redis服务

          redis-cli       通过客户端链接redis

关闭Redis

     1.单例关闭

           redis-cli shutdown

     2.进入终端关闭(在客户端关闭)

          shutdown

redis是  单线程+多路IO复用

常用数据类型    

    sring:

    是以键值对方式存储。                                                                                                      

    string是二进制安全的。意味着可以包含任何数据

    一个redis中字符串value最多可以是512M。

    apend 'kay': 追加字符    

    strlen 'key':获取到key的长度

    setnx 'key':只有当key不存在是,才能设置成功

    incr 'key':将key中存储的数字值加1。只能对数字值成功,如果为空,新增值为1

    decr 'key':将key中存储的数字值减1。

    incrby/decrby 'key':将key中存储的数组值加多少和减多少。

    mset 'key' ....:同时设置多个键值对

    mget 'key'.....:同时获取多个键值对

    msetnx 'key' ....:同时设置多个键值对,其中有一个存在,就都不成功

    getrange 'key' x x:获取某个key的value索引之间的值,前包,后包

   setrange 'key' x x:修改某个key的value索引开始的值

   setex 'key' 'time' 'value':设置键值对,并且设置过期时间

   getset 'key' 'value':设置新值同时获取旧值

 string中value的底层结构,类似于arrayList

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBtZeWPquS8mmN2,size_20,color_FFFFFF,t_70,g_se,x_16

 列表(List) 

     单键多值,按照插入顺序排序,你可以添加一个元素到列表的头部或尾部,底层实际是双向链表。

     lpush/rpush 'key' 'value' ...:从左边或右边插入一个或多个值

     lpop/rpop key:从左边或右边吐出一个值

     lrange key x x:按照索引获取到值

     rpoplpush k1 k2:从k1列表右边吐出一个值,插到列表k2的左边

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBtZeWPquS8mmN2,size_20,color_FFFFFF,t_70,g_se,x_16

set

  是string类型的无序集合,底层是一个value为null的hash表。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBtZeWPquS8mmN2,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBtZeWPquS8mmN2,size_20,color_FFFFFF,t_70,g_se,x_16

hash 

  是一个键值对集合

  是一个string类型的field和value的映射表。特别适合存储对象,类似于Map<string,object>,object中存field属性。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBtZeWPquS8mmN2,size_20,color_FFFFFF,t_70,g_se,x_16

      hash类型对应的数据结构是两种,ziplist(压缩列表) 、hashtable(哈希表),当field-value长度较短且数量较少时,使用ziplist,否则使用hashtable。

zset

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBtZeWPquS8mmN2,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBtZeWPquS8mmN2,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBtZeWPquS8mmN2,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBtZeWPquS8mmN2,size_20,color_FFFFFF,t_70,g_se,x_16

Redis的发布和订阅

    是一种消息通信模式。

    subscribe 频道:   订阅一个频道

    publish 频道 内容:向频道中发送内容

Redis6的新数据类型

    bitmaps:

         本身不是一种数据类型,实际上就是字符串

          它可以对字符串的位进行操作

     hyperloglog:

         计数操作,重复的数据不会添加成功

     Geospatial:

          里面存储城市的经度纬度

          提供了经度纬度的设置,查询,范围查询,距离查询,等常规操作。

Jedis

      使用java对Redis进行一系列操作,类似于JDBC

      需要使用Jedis得jar包

      使用前的条件:

           1.将 /etc/reids.conf文件中的bind注释掉

           2.protected保护后面的值改为no

           3.将防火墙关闭systemctl stop firewalld

事务和锁机制

       Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化,按顺序执行。事务在执行的过程中,不会被其他客户端发送来的命令请求打断。

      主要作用是串联多个命令防止别的命令插队。

      使用multi过后,使用的所有命令都会被添加到一个队列中,不会被执行,这个过程是组队阶段。

      直到输入exec过后,才开始执行之前输入到队列中的命令,这个过程叫执行阶段。

      组队阶段,不想这个事务执行的时候使用discard。

      组队阶段当有命令发生异常,执行时所有队列都会被取消。

      执行阶段某个命令发生错误,那么那个发送错误的命令不会执行,而其他命令正常执行。

悲观锁:

        顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿着数据就会block直到它拿到锁。

乐观锁:

        增加一个字段version,每次更新数据的时候,判断这个版本是否和数据库中的版本一样,一样才可以进行更新,version会和数据同步更新。

        在执行multi之前,先执行watch 'key',可以监视一个或多个key,如果在事物执行之前这个key被其他命令所改动,那么事物就会被打断。watch是乐观锁机制。

        unwatch:取消watch命令对所有可以的监视。如果在执行watch命令之后,exec命令或discard命令先被执行了的话,那么就不需要再执行unwatch了。

Redis事物的三大特性

        单独的隔离操作:

                事物中的所有命令都会被序列化、按顺序地执行。事物在执行过程中,不会被其他客户端发送来的命令请求所打断。

         没有隔离级别的概念:

                 队列中的命令没有提交之前都不会实际被执行,因为事物提交前任何指令都不会被实际执行。

         不保证原子性:

                 事物中如果有一条命令执行失败,其后的命令依然会被执行,没有回滚。

持久化操作:

        RDB:

                在指定的时间间隔内将内存中的数据集快照写入磁盘。

                Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。

                缺点:最后一次持久化后的数据可能丢失。

                RDB的备份:

        AOF(Append Only File):

                默认不开启。

                以日志的形式来记录每个写操作,将Redis执行过的所有指令记录下来,只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构造数据。

                开启AOF需要的操作:

                        进入redis.conf文件,将no修改为yes。

                        appendonly.aof表示创建的日志的名字。生成的地方为启动redis的路径下。

        

                 AOF和RDB同时开启,系统默认取AOF的数据。

                redis-check --fix “文件名”       修复文件

                AOF同步频率的设置:

                        appendfsync always

                              始终同步,每次Redis的写入都会立刻记入日志;性能较差但数据完整性比较好

                        appendfsync everysec

                              每秒同步,每秒记入日志一次,如果宕机,本秒的数据可能丢失。

                        appendfsync no

                                redis不主动进行同步,把同步时机交给操作系统。

主从复制:

        主机进行写操作,从机进行读操作。

        实现主从的操作步骤:  需要关闭AOF

        info replication         查看当前主机运行状态

        slaveof  主服务器ip:     设置谁是本机的主服务器 

        主从复制原理:

                从机只会在第一次连接的时候向主机发送请求,其他时候都是主机向从机发送数据。

        一主二仆:

                当从机重启过后,需要重新设置关系,重新设置关系过后他会把主机上的数据拷贝到从机上。

                主机宕机过后,从机还是会显示与主机之间的关系。主机重新启动过后还会有原来的从机。

        薪火相传:

                类似于链表,不能跨级联系。主机管理从机,从机管理从机下的从机。

        反客为主:

                slaveof no one    将从机变为主机

                当一个主机(master)宕机后,后面的从机(slave)可以立刻升为master,其后面的slve不用做任何修改。

        哨兵模式:

                会检测主机是否宕机,如果主机宕机会自动让某个从机变为主机。

                启动哨兵模式, sentinel.conf为哨兵模式的配置文件

                 reids.conf文件中这个代表优先级,越小优先级越高。代表主服务器宕机时优先选择谁   

                

 

集群

        搭建步骤:

               1. 创建6个redis.conf文件

               2.其中分别添加内容(改include地址,改端口号)

                        

        3.进入到安装Redis目录,/opt/redis/src/

                并在控制台输入命令

        

         4.这样就可以依次启动Redis了

                redis-server  redis6379.conf

         5.登录集群

                redis-cli -c -p 端口号 

缓存穿透:

        

缓存击穿:

        

缓存雪崩:

        

分布式:

        解决分布式问题的方法:

                1.使用setnx上锁,通过del释放锁;

                         防止锁一直没有被释放,设置一个过期时间,自动释放。

                        防止上锁过后突然发生异常,没有设置上过期时间,可以同时设置过期时间:

                        set 'key' 'value' nx ex '过期时间'

                        为防止释放错锁,可以把vluer值设置为一个UUID,每次释放锁前会先进行判断,U会判断当前线程的UUID和取出来的UUID是否相同,相同就释放锁,不相同就不释放。

                        通过lua脚本释放锁,保证原子性。

        确保分布式锁可用,至少满足四个条件:

                1.互斥性:在任意时刻,只有一个客户端能持有锁。

                2.不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他用户能加锁。

                3.加锁和解锁必须保证是同一个客户端,客户端自己不能把别人加的锁给解了。

                4.加锁和解锁必须具有原子性。

Redis6的新特性:

        ACl:

                可以给用户设置一些权限,把用户的权限更加细腻化。

        IO多线程:

                Redis多线程部分只是用来处理网络数据的读写和协议的解析,执行命令依然是单线程。

                IO 多线程其实指客户端交互部分的网络IO交互处理模块多线程,而非执行命令多线程。

                默认是没有开启的,需要进配置文件设置:

                        io-threads-do-reads yes

                        io-thrreaads 4

笔记来自于尚硅谷视频所得

                        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值