Redis心得-01

  1. redis是单线程的,内部是有队列来顺序执行命令的。qps 大约是10w/s.
    速度快的原因:基于内存,所有数据都在内存中运算;避免了多线程之前切换的性能消耗。
  2. 对象存储。我们可以通过
    set key value 将对象序列化成json对象【注意:s t r对象不能太大;如果频繁获取以及修改对象值,则效率降低】
    mset  key value:如学生id=1,则 mset stu:1:name niuyp  stu:1:age 28;
    hmset key 则可以维护整个表:如 hmset stu stu:1:name niuyp  stu:1:age 28;
  3. 分布式锁:setnx 不存在则返回成功=1;存在返回失败=0
  4. 计数器 :incr key  返回计算的最终结果。
  5. websession 共享
  6. 分布式系统全局序列号:数据库的主键可以通过incrby以及雪花算法来实现。之所以不使用incr 是因为一次一次的获取,效率过滤地下,所以我么提倡批量生成id,供某一模块缓存并使用。如果重启,则重新获取即可。
  7. Hash使用场景:如购物车
    7.1 :添加商品:hset cart:用户id 商品id 1
    7.2:   增加商品:hincrby cart:用户id 商品id 1
    7.3:   商品总数:hlen cart:用户id
    7.4:   删除商品:hdel cart:用户id  商品id
    7.4:   获取所有:hgetall cart:用户id
  8. List 结构:blpop key timeout:从集合表头弹出一个元素,如果列表为空,则阻塞等待 timeout 秒,如果timeout=0,则无限等待。
    应用场景:微博消息和微信公众号的消息列表:lpush + lrange 组合展示消息列表
  9. set使用场景:
    1、微信抽奖小程序【1、点击参与 sadd goods userid. 2、查看参与者 smembers goods.
                                         3、抽取5名。srandmember goods 5 (从集合key中获取n个元素,但是元素不会从集合中删除。)】
    2、点赞、标签功能
    3、关注模型,比如你关注的人还关注了谁谁谁 (sinter,sunion,sdiff) sdiff key1 key2 key3 [key1减去key2和key3的集合,key1所留下的结果]
    4、电商商品筛选
  10. zset 使用场景:
    排行榜:
    1、点击新闻预览 则+1,zincrby 1 new:20200913
    2、列出前10:    zrevrange new:20200913 0 9 withscores. (根据分值倒序列出,并展示分值)
    3、7日搜素:zunionstore new20200907-20200913 7 new:20200907...new:20200913

    并集计算:zunionstore destkey numberkeys key[key...]
    交集计算:zinterstore destkey numberkeys key[key...]
  11. redis既然是单线程的,为什么连接多个客户端,也没觉得慢?
    答:采用epoll模型的io多路复用
  12. keys命令如果键值很多时效率很低,代替方案使用 scan 0 match key99* count 1000(从下表0开始,扫描以key99开头的所有键值,扫描1000个键值)--》返回匹配的个数 以及 具体的key值
  13. redis持久化分为两种
    rdf快照模式:dump.rdb ,该文件内容是被压缩过的二进制文件,通过配置 save 60 1000 方式启动,即:如果60秒内有1000个键值发生变化,则生成一次快照。该动作等价于手动执行bgsave (redis 会fork一个子进程) 缺点:如果60秒只修改999个键,那么这999个键会丢失。
    aof文件追加方式:该方式存储的是 操作指令,配以配置为 always(执行一次命令存一次),everysec(每秒存一次),no(永远不存储)。为了防止有大量这种自增操作,redis提供了 aof重写功能。 ,即重复命令只取最后的结果,多条记录合成一条(该动作会影响性能,而且需要配置文件大小达到多少M时触发。等价于bgrewriteaof,此时fork一个子进程)
  14. redis是c语言实现的,通过sds数据结构(simple dynamic string,有len标记要读取的长度,是二进制安全的数据结构;提供了内存预分配,避免了频繁的内容分配;兼容c语言的函数库,末尾默认添加了\0),而非原始的字符数组来实现(原始的以"\0" 来作为结尾)
    redis所有的键都是string类型的,即使设置的是int或者double
    redis 存储数据方式 数组+链表, 数组通过对key进行hash获取数组下标。扩容时,采用渐进式rehash ,当在扩容 且有访问某个key时,则进行迁移一部分(包含访问的key);如果长时间没有访问,内部线程定时也会进行搬移的

      
    sds扩容机制:如果扩容到1M,则不再成倍扩容,每次加1M
    数据结构:redis3.2以前 
     sds
        1.free=0
        2.len =3
        char buf[]="aaa" --> aaabbbccc
        扩容(len+addlen)*2 = (3+6)*2=18
        则:
        1.free=9
        2.len=9
        
        int类型几乎代表42亿,但是结构中字符长度用不到这么大空间,浪费,所以3.2版本以后,通过长度,自定义类型 5中(5,8,16,32,64)
        buf,len,alloc,flags(前3个bit位代表类型,后5个bit位代表长度),alloc-len=free
        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值