• Redis 的简单学习与整理


    Redis 的简单学习与整理


    背景

    最近一直进行Redis性能调优和高可用的课题
    但是不管什么课题,第一步应该是学习与使用redis
    之前总结过 rdb 与 rdr 分析 键值对等内容.
    但是发现想要深入进行分析时 掌握的知识是非常不足的
    今天计划进行一下简单学习.
    

    Redis服务与客户端

    Redis是世界上最流行的键值对数据库. 
    他的编译和使用也非常简单(开源版, 企业版我没搞定,比较麻烦)
    一般实际上只需要3个文件就足够了
    redis-cli 是客户端工具
    redis-server 是服务器端工具
    redis.conf 是配置工具
    

    Redis配置文件简介

    redis.conf 是redis的核心配置文件
    主要需要注意的配置项目是:
    bind 127.0.0.1 或者 0.0.0.0
    # 注意 127.0.0.1 仅允许本机访问. 0.0.0.0 可以外部访问
    requirepass password
    # 设置访问密码
    save aof dump 等参数 
    # 设置持久化
    protected-mode 
    # 建议关闭保护模式.
    connection 
    # 默认10000个连接,可以改大, 但是不建议太多.
    # redis 7 以后可以有 io多线程参数.
    daemonize yes
    #后台作为驻留服务运行.
    

    服务启动与关闭

    redis-server /path/to/redis.conf
    #启动服务就可以了.
    lsof -i:6379
    #查询进程相关的信息
    #注意监听如果是 localhost 的话 外部无法访问.
    kill -9 xxxx 
    #或者是执行shutdown 关闭服务也可以. 
    

    登录Redis服务器

    redis-cli 
    #就可以默认登录 本机 6379 端口的服务
    redis-cli -a Yourpassword -p Yourport 
    #可以明文指定密码 -p 可以单独指定端口号.
    redis-cli -c
    #集群模式登录的命令.
    #可以选择任意一个集群的端口进行登录与访问.
    进入机器后可以查询服务器的状态
    info
    # 可以查看redis服务器的信息.
    info keyspace ; info memory; info clients
    # 可以查看不同的服务器信息. 
    dbsize 
    #也可以查看当前数据库的键值对数量.
    

    Redis的键值对类型

    String: 字符串
    Hash: 散列
    List: 列表
    Set: 集合
    Sorted Set: 有序集合
    

    Ridis关于key的命令简介

    keys *查看当前库所有key    (匹配:keys *1) 
    # 注意这个命令不能常用,会导致严重的性能问题, 会hang住系统.
    exists key判断某个key是否存在
    type key 查看你的key是什么类型
    del key       删除指定的key数据
    unlink key   根据value选择非阻塞删除
    仅将keys从keyspace元数据中删除,真正的删除会在后续异步操作。
    expire key 10   10秒钟:为给定的key设置过期时间
    ttl key 查看还有多少秒过期,-1表示永不过期,-2表示已过期
    select命令切换数据库
    dbsize查看当前数据库的key的数量
    flushdb清空当前库
    flushall通杀全部库
    

    Redis String类型key说明

    set key value
    #设置键值对
    *NX:当数据库中key不存在时,可以将key-value添加数据库
    *XX:当数据库中key存在时,可以将key-value添加数据库,与NX参数互斥
    *EX:key的超时秒数
    *PX:key的超时毫秒数,与EX互斥
    get key
    # 获取键对应的键值.
    append key value 
    # 添加指定的值到末尾
    setnx key value
    # 只有键值对不存在时才会设置具体的值.
    

    Redis List类型的说明

    lpush/rpush    key  value1  value2  value3   .... 
    #从左边/右边插入一个或多个值。
    lpop/rpop    key  
    #从左边/右边吐出一个值。值在键在,值光键亡。
    rpoplpush    key1  key2  
    #从  key1  列表右边吐出一个值,插到  key2  列表左边。
    lrange   key  start  stop   
    #按照索引下标获得元素(从左到右)
    len   key  
    #获得列表长度 
    linsert   key    before   value  newvalue  
    #在  value  的后面插入  newvalue  插入值
    lrem   key  n  value  
    #从左边删除n个value(从左到右)
    lset  key  index  value  
    #将列表key下标为index的值替换成value
    

    Redis Set类型的说明

    Redis set对外提供的功能与list类似是一个列表的功能,
    特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,
    又不希望出现重复数据时,set是一个很好的选择,
    并且set提供了判断某个成员是否在一个set集合内的重要接口,
    这个也是list所不能提供的。
    Redis的Set是string类型的无序集合。
    它底层其实是一个value为null的hash表,
    所以添加,删除,查找的复杂度都是O(1)。
    

    Redis Set类型的说明

    sadd key value1 value2 
    # 添加 value1 value2 key中. 如果已经存在会就行插入,并且排重.
    smembers  key
    # 取出该集合的所有值.
    sismember key value
    # 检查key 是否存在于set中.
    scard key 
    # 检查key值的数量
    srem key value
    # 删除key中value的项目
    spop key
    # 随机吐出一个项目
    sinter / sunion / sdiff
    # 交集 并集 差集 
    

    Redis Hash类型的说明

    Redis hash是一个string类型的field和value的映射表,
    hash特别适合用于存储对象。
    
    hgetall key
    # 获取hash 所有的field 和value的映射表信息.
    hset   key  field  value 
    #给  key  集合中的    field  键赋值  value  
    hget   key1  field  
    #从  key1  集合  field  取出 value 
    hmset   key1  field1  value1  field2  value2  ... 
    #批量设置hash的值
    hexists  key1  field  
    #查看哈希表 key 中,给定域 field 是否存在。 
    hkeys   key  
    # 出该hash集合的所有field
    hvals   key  
    # 列出该hash集合的所有value
    hincrby   key  field  increment  
    #为哈希表 key 中的域 field 的值加上增量 1   -1
    hsetnx   key  field  value  
    #将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在 .
    

    Redis Zset类型的说明

    Redis有序集合zset与普通集合set非常相似,
    是一个没有重复元素的字符串集合。
    不同之处是有序集合的每个成员都关联了
    一个评分(score),这个评分(score)
    被用来按照从最低分到最高分的方式排序集合中的成员。
    集合的成员是唯一的,但是评分可以是重复了 。
    

    Redis Zset类型的说明

    zadd   key score1 value1 score2 value2 …
    # 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
    zrange  key start stop   [WITHSCORES]   
    #返回有序集 key 中,下标在 start stop 之间的元素
    #带WITHSCORES,可以让分数一起和值返回到结果集。
    zrangebyscore key minmax [withscores] [limit offset count]
    #返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。
    #有序集成员按 score 值递增(从小到大)次序排列。 
    zrevrangebyscore key maxmin [withscores] [limit offset count]               
    #同上,改为从大到小排列。 
    zincrby  key increment value       
    #为元素的score加上增量
    zrem   key value 
    #删除该集合下,指定值的元素 
    zcount  key min max 
    #统计该集合,分数区间内的元素个数 
    zrank  key value 
    #返回该值在集合中的排名,从0开始。
    

    Redis 持久化相关

    RDB(Redis DataBase)
    AOF(Append Of File)
    

    RDB

    Redis会单独创建(fork)一个子进程来进行持久化,
    会先将数据写入到 一个临时文件中,待持久化过程都结束了,
    再用这个临时文件替换上次持久化好的文件。 
    整个过程中,主进程是不进行任何IO操作的,
    这就确保了极高的性能 如果需要进行大规模数据的恢复,
    且对于数据恢复的完整性不是非常敏感,
    那RDB方式要比AOF方式更加的高效。
    RDB的缺点是最后一次持久化后的数据可能丢失。
    
    save : save时只管保存,其它不管,全部阻塞。
             手动保存。不建议。
    bgsave:Redis会在后台异步进行快照操作, 
             快照同时还可以响应客户端请求。
    
    save 900 1
    表示 15分钟内有一次变化就落盘
    

    RDB的优缺点

    优点: 
    1. 适合大规模的数据恢复
    2. 对数据完整性和一致性要求不高更适合使用
    3. 节省磁盘空间
    4. 恢复速度快
    缺点:
    1. Fork的时候,内存中的数据被克隆了一份,
       大致2倍的膨胀性需要考虑
    2. 虽然Redis在fork时使用了写时拷贝技术,
       但是如果数据庞大时还是比较消耗性能。
    3. 在备份周期在一定间隔时间做一次备份,所以如果Redis意外down掉的话,
       就会丢失最后一次快照后的所有修改。
    

    AOF

    以日志的形式来记录每个写操作(增量保存),
    将Redis执行过的所有写指令记录下来(读操作不记录), 
    只许追加文件但不可以改写文件,
    redis启动之初会读取该文件重新构建数据,
    换言之,redis 重启的话就根据日志文件的内容将
    写指令从前到后执行一次以完成数据的恢复工作
    
    启动方式: 修改默认的appendonly no,改为yes
    appendfsync always|everysec|no
    

    优缺点

    优点: 
    1. 备份机制更稳健,丢失数据概率更低。
    2. 可读的日志文本,通过操作AOF稳健,可以处理误操作。
    缺点: 
    1. 比起RDB占用更多的磁盘空间。
    2. 恢复备份速度要慢。
    3. 每次读写都同步的话,有一定的性能压力。
    4. 存在个别Bug,造成恢复不成功.
    

    未完待续

  • 相关阅读:
    利用DllPlugin性能优化
    Shimming 的作用
    用webpackPrefetch:true提升性能
    webpack打包分析学习笔记
    分块打包学习笔记
    tree shaking学习笔记
    Map与实体类相互转换
    项目可以run但不能debug
    jeecg-boot框架默认create_time Desc去掉
    List<实体类>根据多个字段去重
  • 原文地址:https://www.cnblogs.com/jinanxiaolaohu/p/16794016.html
Copyright © 2020-2023  润新知