美文网首页
Redis深入应用-数据类型,分布式锁,位图,HyperLogL

Redis深入应用-数据类型,分布式锁,位图,HyperLogL

作者: 美雨知春 | 来源:发表于2020-09-10 18:20 被阅读0次

Redis比memcache的应用场景广泛,比RabbitMQ和kafka使用简单,可以作为消息队列使用但又不是专业的消息队列,不适合处理高可靠性的的消息队列

  1. 数据类型
    sting:可以存储json串,操作:rpush,lpush,rpop,lpop
    list:列表,队列
    hash:字典,操作hset,hget
    set:集合,有去重功能,用来存储在某活动中中奖用户的ID,操作:sadd,spop,scard
    zset:有序列表,跳跃列表,最下面一层的所有元素都串起来
  2. 分布式锁
    首先介绍原子操作:原子操作是指不会被现成调度机制打断的操作。这种操作一旦开始,就会一直运行到结束,中间不会有任何现成切换。这个时候就要使用分布式锁来限制程序的并发执行。
    死锁:
    set-------setnx------过期(死锁)-------expire
    解决办法:
    set------setnx && expire-----do something
    这样即使中间卡住了,到期时间到了,锁也会打开
    可重入性:
    可重入性就是在线程持有锁的情况下再次请求加锁。同一个线程可以再次加锁,不建议用可重入性锁,增加了客户端的复杂性
  3. 延时队列
    问题,队列空了还去读,消耗CPU,可以用sleep解决,最好办法用blpop,brpop代替lpop/rpop
    Redisde zrem方法是多线程多进程争抢任务的关键,它的返回值决定了当前实例有没有抢到任务,因为loop方法可能会被多个线程多个进程调用。
  4. 位图
    位图的最小单位是bit,可以用get和set设置整个位图的内容,最多只能处理64个连续的位,如果超过64位,就要使用多个子指令。
    指令:bitfield w set u4 0 #从第一个位开始取 4个位,结果时无符号数(u)
    bitfield w get u4 0 #从第一位开始取4个位,结果是无符号数
  5. HyperLogLog
    用最少的存储空间解决Uv问题,如果按照正常来算,统计Uv需要记录每个进入的用户uid,如果uid每个uid都记录下来,存储量是巨大的,数据插入时检索uid也是耗时的,那么引用了HyperLogLog,其原理采用了稀疏矩阵和稠密矩阵,以及概率论,但是有一定概率的偏差。
    指令:pfadd,pfcount,pfmerge
  6. 布隆过滤器Bloom Filter
    HyperLogLog能够统计Uv,但是针对某个uid是查找不到的
    布隆过滤器不仅能够去重,还能记录下uid,形成一个用户印象,对于给用户推送新闻方面有很大帮助
    指令:
    bf.add codehole user1
    bf.add codehole user2
    bf.add codehole user3
    bf.exists codehole user1
    bf.exists codehole user2
    已经存在的用户不会造成误判,不存在的用户会造成误判
  7. 地理位置索引--GeoHash
    GeoHash可以为每个GPS信息进行位置编码,编码到一维空间,采用切蛋糕方法进行编码,过程很简单,大家有时间可以找找看,
    通过这个编码找到附近的位置很容易
    指令:
    geoadd company 116.48105 39.996794 juejin
    geoadd company 116.58105 39.996778 ireader
    geoadd company 116.48133 39.996780 baidu
    geoadd company 116.48122 39.996788 xiaomi
    测量距离:
    geodist company juejin iReader km
    "10.42"

附近的公司
georadiusbymember company ireader 20 km count 3 asc

以上指令作为参考,输出数字只作为例子。

相关文章

网友评论

      本文标题:Redis深入应用-数据类型,分布式锁,位图,HyperLogL

      本文链接:https://www.haomeiwen.com/subject/ykipektx.html