zoukankan      html  css  js  c++  java
  • Redis学习笔记

     
    存储系统,按存储模型可分为:关系型数据库,KV存储,文档存储(如MongoDB),列式存储(HBASE)
    国内常见KV系统有:Redis, tair, memcache
     

    优缺点

    redis优势
    1、速度快(读写快,还可以快速处理排序等)
    2、单个指令为原子操作(如rpush等操作,在传统系统中需要程序员自己实现原子性)
    3、支持丰富的数据类型
    4、持久化,主从备份,分区,事务,管道,pub/sub等特性
     
    redis局限性:
    1、不支持多指令事务
    2、 可能丢数据(详见“Redis数据丢失分析”)

    Redis数据结构

    string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
    String(字符串)
    二进制安全
    可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512M
    普通kv存储
    Hash(字典)
    键值对集合。Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的value redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。
    适合存储对象,并且可以只读取或修改某一项属性值。
    但hgetall涉及到遍历整个内部Map的操作,由于Redis单线程模型的缘故,这个遍历操作可能会比较耗时,而另其它客户端的请求完全不响应
     
     
    对象
    List(列表)
    链表(双向链表)
    增删快,提供了操作某一段元素的API
    1,最新消息排行等功能(比如朋友圈的时间线) 2,消息队列
    Set(集合)
    哈希表实现,元素不重复。
    set 的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的
    1、添加、删除,查找的复杂度都是O(1) 2、为集合提供了求交集、并集、差集等操作。
     
    1、共同好友 2、利用唯一性,统计访问网站的所有独立ip 3、好友推荐时,根据tag求交集,大于某个阈值就可以推荐
    Sorted Set(有序集合)
    将Set中的元素增加一个权重参数score,元素按score有序排列
    数据插入集合时,已经进行天然排序
    以某个条件为权重,比如按点赞的次数排序.
     
     

    Redis持久化

    摘自:https://blog.csdn.net/weiwenjuan0923/article/details/52886931 

    redis是持久化的内存数据库。把内存中的数据保存到磁盘来保证持久化。持久化的目的是重启后恢复数据。
    RDB是Snapshot快照存储,半持久化模式
    按周期策将数据保持在磁盘(save来定义周期),借助fork命令的copy on write机制。
    生成快照时,当前进程会fork一个子进程,然后再子进程中循环所有数据,当数据携程rdb文件
    RDB没有刷写模式,rdb文件中保存的不是最新的,从上次rdb文件生成到redis停机的时间的数据丢失
    AOF是完全持久化存储 append only file
    压缩持久化文件,bgwriteaof命令重新生成aof文件。
    恢复数据时,会重新执行文件中的命令在内存中重建整个数据内容

    Redis事务

    redis的事务可以理解为一种同步锁机制。事务内的命令集执行时互斥的,但不是院子的,个别命令失败不会影响其他命令执行,也不会导致整个事务回滚。
    所以可以说redis不支持真正的事务。
     

    Redis 管道技术

    Redis 管道技术可以在服务端未响应时,客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响

    redis应用场景

    1、会话缓存(最常用)
     
    2、消息队列,比如支付
     
    3、活动排行榜或计数
     
    4、发布、订阅消息(消息通知)
     
    5、最新商品列表、评论列表等 
     

    Redis存储优化

     大key多key:

    1: 单个简单的key存储的value很大

    2: hash, set,zset,list 中存储过多的元素(以万为单位)

    3:一个集群存储了上亿的key

    Redis是单线程模式,大key导致单个操作阻塞时间长;多key导致过多内存空间占用。

    大value拆分

    可以尝试将对象分拆成多个key-value,也可以将这个存储在一个hash中,每个field代表一个具体的属性。

    对于只需读写部分数据的情况,减少操作数据量;对于用mget全量读取的情况,将操作压力平摊到多个redis实例中,降低对单个redis的IO影响。

    大集合拆分

    类似于大value的拆分。对集合中元素进行分桶,拆分到多个key(类似关系数据库的横向分表)

    key过多

    减少key的个数可以减少内存消耗,可以参考的方案是转Hash结构存储,即原先是直接使用Redis String 的结构存储,现在将多个key存储在一个Hash结构中。

    如果key之间有相关性,可以多个key整合成一个对象,把key映射为对象属性,用hash存储;

    如果key之间是平行的,可以对key进行分桶,一个桶是一个hash

  • 相关阅读:
    NodeJs 的Module.export 和 export
    Angular 调试
    设计模式 -- 访问者
    typescript 枚举
    Swagger 实践 <二>
    eventFlow 系列 <三> 查询所有
    成员变量的隐藏和方法的重写
    Facetoprocess_program_design
    ATM_tests
    transmission protocol
  • 原文地址:https://www.cnblogs.com/night1989/p/10114207.html
Copyright © 2011-2022 走看看