美文网首页
Redis 知识概览

Redis 知识概览

作者: 升空的焰火 | 来源:发表于2018-09-27 14:47 被阅读0次

    Redis笔记

    一.8种数据类型

        1.String        (SDS)动态字符串实现  解决的扩容和缩减每次的内容空间分配,预防了C语言数组的因未重新分配内存空间导致的内存溢出问题

        2.Hash          (ziplist,字典),用的链接法解决hash冲突问题,与java里hashmap相似。扩容和缩减是根据前一个hash表的容量取最接近的2^n的整数。

      3.List            (quicklist,链表)quicklist是表头加压缩链表实现的,表头加双向链表实现的。表头里有头尾节点的指针,表的长度等。

        4.Set            (intset,字典)intset节约内存资源,字典,hash表保证不重复。

        5.SortedSet  (ziplist,skiplist)skiplist实现了跳跃查数据,有点像二分查找,利用层级基于概率一层一层遍历查找,时间复杂度未O(logn)

        6.Hyperloglog  基数统计,内存大小并不随数据增大而线性增大,2^64数据,维持12kb大小,可去重,不能获取元素信息,常做uv统计。

        7.bitmap          位图统计,通过bit位记录信息,利于统计,同时减少内存使用。

      8.geo                地理位置记录,可记录地点经纬度位置,计算两点距离等。

    二.Redis数据持久化

    1.RDB      (快照,存数据文件,性能好,存在数据丢失)

    2.AOF      (写指令文件,可每秒记一次,数据完整性高,性能较差)

    三.Redis事务

    1.不支持回滚

    2.五大命令


    四.Redis数据淘汰机制

    1.淘汰时机:1)请求时,过期key,删除

                        2  ) CPU空闲时,定时任务,serverCron,定期删除部分

                        3 )每次循环事件(即等待用户期间)执行时,会删除部分

    2.6个策略

                    volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用 的数据淘汰

                    volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数 据淘汰

                    volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据 淘汰

                    allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰

                    allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

                    no-enviction(驱逐):禁止驱逐数据

    五.Redis消息队列

    生产者消费者模式(Blpop):生产者生产消息放到队列里,多个消费者同时监听队列,谁先抢到消息谁就会从队列中取走消息;即对于每个消息只能被最多一个消费者拥有;

    发布者订阅者模式(Pub/Sub):发布者生产消息放到队列里,多个监听队列的消费者都会收到同一份消息;即正常情况下每个消费者收到的消息应该都是一样的;

    六.主从复制

    读写分离,主master负责写,从salve负责读。主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave在任何时候都可以发起全量同步。redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。

    七.哨兵

    实现监控主节点是否怠机,然后自动选举从节点顶替主节点。如果被标识的是主节点,他还会选择和其他Sentinel节点进行“协商”,当大多数的Sentinel节点都认为主节点不可达时,他们会选举出一个Sentinel节点来完成自动故障转移工作,同时将这个变化通知给Redis应用方。如果之前主节点重新连上会被当做从节点。


    八.集群

    1.集群原理:数据分片,虚拟槽技术,redis分成了16384个虚拟槽,每个节点平均分配负责管理一部分虚拟槽,数据利于CRC(16)%16384算法均匀分布到各个slot上。

    2.主从复制,异步复制。可设置多个从节点,但不能读写分离。

    3.选举,容错:通过节点之间的通信,如果半数以上master认为这个master挂了,那么就认定它挂了。这时候从节点就顶替上来。

    4.不可用:1)当没有从节点时,任一主节点挂了。2)半数以上主节点挂了。


    九.分布式锁

    1. jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);获取锁,同时设置过期时间。

    2.Lua脚本:

    String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";

    Object result = jedis.eval(script, Collections.singletonList(lockKey),Collections.singletonList(requestId));


    这是目前所了解的redis的技术,自己所作的初步的总结,很多的地方还不够完善,也行需要理论加事件才能更好的运用redis,希望以后多多加油。

    相关文章

      网友评论

          本文标题:Redis 知识概览

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