• Redis学习


      业精于勤,荒于嬉;行成于思,毁于随
                -- 韩愈·《进学解》
     
      因为工作中需要用到Redis,所以最近抽点时间看了一下,现在将学习的内容整理一下。
     
    一、简介
    1、Redis是什么?
      Redis是一个内存中的key-value型数据结构存储系统,可以用作数据库、缓存和消息中间件。官方网站:redis.io,中文网站:redis.cn
     
    2、为什么要使用Redis?
        - 多功能:可用作数据库、缓存和消息中间件(用于进程间通信);
        - 支持多种类型的数据结构,比如:strings、hashes、lists等;
        - 支持大多数的编程语言,比如:C/C++、Java、Python等;
        - 提供了不同级别的持久化(落地)方式来保证数据安全;
        - 通过redis哨兵和自动分区提供高可用性;
        - 原子操作,保证数据的正确性;
     
    3、下载和安装(debian)
    下载: $ sudo apt-get install redis-server 
    配置:redis的配置文件是 redis.conf ,文件中包含了所有可能用到的参数和详细的解释
    启动: $ redis-server 
    连接: $ redis-cli 
     
    二、支持的数据结构
      Redis是一种key-value存储系统,并且Redis的key是二进制安全的,可以使用任何的二进制序列作为key,普通字符串甚至JPEG文件。redis支持多种类型的数据结构:strings、lists、sets、sorted sets、hashes、bitmaps、hyperloglogs。
     
    1、strings - 字符串
    strings类型的value和key一样,可以是任何类型的字符串。
    1 示例:
    2 > SET name aut   #设置 name 的值为 aut
    3 > GET name       #获取 name 的值
    4 > SET age 20     #设值
    5 > INCR age       # num 自增 1
    6 > MSET name aut age 20     #同时对多个key设值
    用途举例:计数器,存储图片等二进制文件
     
    2、lists - 列表
    一个key-value列表,支持两端的添加和删除、范围内取值等操作
    1 示例:
    2 > RPUSH study redis     #右端插入
    3 > LPOP study            #左端删除
    4 > LRANGE study 1 5      #取出范围内的值,下标从0开始,-n表示倒数第n个位置
    5 > LTRIM study 1 2       #从左边截取指定长度
    用途举例:进程间通信的消息队列,博客引擎中存储评论
     
    3、hashes - 散列表
    hashes中的一个key可以对应一个包含多个“字段 - 值”对的结构,其包含的“字段 - 值”对数只受内存限制
    1 示例:
    2 > HMSET user:2547 name aut school xupt age 20     #设置字段的值
    3 > HGET user:2547 name          #获取单个字段的值
    4 > HMGET user:2547 name school  #获取多个字段的值
    5 > HGETALL user:2547            #获取所有字段的值
    6 > HINCRBY user:2547 age 10     #将指定字段递增某个数值
    用途举例:存储用户信息、物品信息
     
    4、sets - (无序)集合
    sets用于存储无序并且无重复的数据,提供了集合内的插入删除,集合间的交并等操作
    1 示例:
    2 > SADD score 98 95 64    #插入元素
    3 > SMEMBERS score         #获取所有元素
    4 > SISMEMBER score 80     #测试某个元素是否在集合中
    5 > SINTER score1 score2   #获取两个集合的交集
    6 > SRANDMEMBER score      #随机获取集合中的一个元素
    用途举例:存储具有某种共同属性的所有对象
     
    5、sorted sets - (有序)集合
    sorted sets使用一个浮点数score来对集合内的元素进行排序,当score相同时按字母序进行排序
    1 示例:
    2 > ZADD user 2547 aut     #插入元素,如果元素已经存在,则更新score
    3 > ZRANGE user 0 -1       #获取指定范围内的元素
    4 > ZRANK user aut         #获取指定元素的排名
    5 > ZRANGEBYSCORE user -inf 2000 withscores     #获取score大于等于2000的元素,并把score一并打印出来
    用途举例:存储排名信息
     
    6、bitmaps - 位图
    bitmaps以位为单位来实现某些标记功能,提供了设值/取值、统计等操作
    1 示例:
    2 > SETBIT key 10 1     #设置指定位为1
    3 > GETBIT key 10       #获取指定位的值
    4 > BITCOUNT key        #统计指定元素的位为1的位数
    用途举例:标记用户ID(是否已注册、在线还是离线)
     
    7、hyperloglogs - (不知道该怎么翻译~~)
    hyoerloglogs通过输入元素计算出输入元素的基数估算值,详情参考:redis数据结构HyperLogLog
    1 示例:
    2 > PFADD str1 "apple" "banana" "cherry"     #添加元素
    3 > PFCOUNT str1              #统计str1的近似基数
    4 > PFMERGE str1&2 str1 str2  #将str1和str2合并到str1&2中
    用途举例:统计访问网站的独立IP数量
     
    其他常用操作:
    1 > EXISTS key       #检查key是否存在
    2 > DEL key          #删除key
    3 > TYPE key         #检测key的类型
    4 > EXPIRE key 5     #设置key的有效时间为5秒
    5 > TTL key          #获取key的剩余有效时间
    更多的命令使用方法请参阅 命令
     
    三、磁盘持久化
      由于 Redis 是一个内存中的数据结构存储系统,所有数据都在内存中操作,当需要把数据永久保存下来的时候,就需要使用 Redis 持久化功能。持久化就是把数据从内存写入到磁盘,也被称为“落地”,Redis 提供了以下几种持久化方式:
        - RDB:在指定的时间间隔内对数据进行快照存储;
        - AOF:在每次对记录的写操作之后都将操作命令写入日志文件;
        - 不使用持久化:记录只在服务器运行时存在于内存;
     
    1、RDB
      RDB持久化在指定的时间间隔内(或者满足某个指定条件时)将数据保存到一个名为dump.rdb的二进制文件中。
    工作方式:
      ①Redis fork 一个子进程;
      ②子进程将数据集写入一个临时RDB文件中;
      ③Redis 用新的RDB文件替换原来的RDB文件,并删除旧文件。
    优点:
        - RDB文件紧凑且单一,可以方便地传送到其他备份中心,适用于灾难恢复;
        - 持久化工作由子进程完成,保证最大化Redis的性能;
        - 当恢复比较大的数据集的时候,由于RDB是直接恢复,速度会更快一些(较AOF);
    缺点:
        - 如果持久化间隔较大的话,容易丢失过多数据;
        - 而如果持久化太频繁,则不断的fork会严重降低Redis的性能;
    使用建议:每天保存过去一段时间的数据,每小时保存过去24个小时的数据,再搭配AOF一起使用。
     
    2、AOF
      AOF在每次执行完改变数据集的命令后(具体有不同的策略),都将该命令追加到AOF文件的末尾,也就是保存操作的命令,恢复时通过重新执行保存的命令来恢复文件。
    工作方式:
      ①Redis fork一个子进程,子进程创建新的AOF文件;
      ②子进程将原来的AOF文件内容写入新文件中;
      ③Redis将执行过的修改命令写入新文件中;
      ④Redis删除旧文件。
    优点:
        - 多种不同的fsync策略使得丢失的数据量降到最小;
        - AOF文件仅仅是追加命令,所以节省空间,并且容易被人读懂,方便恢复;
        - Redis可以在AOF文件体积变得过大时,自动在后台对AOF进行重写,重写后的AOF文件仅仅包含了恢复当前数据集的最小命令集合;
    缺点:
        - 由于保存的是命令,所以AOF文件比RDB文件要大;
        - 根据使用的fsync策略,AOF的速度可能会慢于RDB;
    使用建议:使用每秒fsync的策略。
     
    关于持久化的建议:
        - 如果数据只有在服务器运行时存在,那么不用选择持久化;
        - 如果可以承受数分钟内数据丢失,那么可以只使用RDB持久化;
        - 如果要求数据实时更新,那么可以使用每秒fsync策略的AOF持久化;
        - 具体可以根据应用场景将两种持久化方式配合使用。
     
    总结:根据网友资料得到下面的结论,参考地址:Redis与Memcached的区别
      ①Redis的最佳使用场景是全部数据in-memory;
      ②Redis的更多场景是作为Memcached的替代者来使用;
      ③当需要更多的数据类型支持时,Redis更合适;
      ④当存储的数据不能被剔除时,使用Redis更合适。
     
    (全文完)
  • 相关阅读:
    东驴西磨
    深入理解计算机系统 第二章信息的表示和处理(笔记小结)
    Amdahl 阿姆达尔定律(系统优化)
    想你的夜——葱油饼
    TypeScript and AWS Lambda practicing road map
    "Silicon Valley-like" companies think of engineers as value generators
    original intentions
    Canopy is hiring Postgres SQL Engineer
    在多线程中 feign 调用,服务提供方拿不到 request 的错误
    CF1542D
  • 原文地址:https://www.cnblogs.com/autyinjing/p/5355224.html
Copyright © 2020-2023  润新知