Redis 知识概览

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 知识概览)