Redis支持五中常用数据类型,string hash list set zset
Redis提供两种持久化机制,RDB和AOF机制
RDB持久化机制,是指数据集快照的方式半持久化模式记录Redis数据库的所有键值对,在某个时间点将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次的持久化文件,达到数据恢复.
优点:
缺点:数据安全性较低,RDB是间隔一段时间进行持久化,如果持久化之间Redis发生故障,会发生数据丢失.所以这种方式更适合数据要求不严谨的时候.
AOF持久化机制:是指所有的命令行记录以Redis命令请求协议的格式完全持久化存储保存为aof文件.
优点:
缺点:
1.定时删除,当对一个key设置了过期时间,当该时间到期之后,立即执行对该key的删除,优点是对内存友好,保证key一旦过期就能立即从内存中删除.缺点:对CPU不友好,在过期的键数量较多的时候,删除过期的键需要占用一定的CPU时间,对服务器的响应时间和吞吐量造成影响.
2.惰性删除,当一个key过期之后,并不会立即从内存中删除,而是在调用key的时候去检查其是否过期,如果过期,将其从内存中删除.优点是对CPU友好,只有在使用的时候才会检查.对于没有用到的key不会浪费时间进行过期检查.缺点:对内存不友好,key过期之后如果一直没有使用,就会一直占用这部分内存.如果Redis中存在很多过期键没有被使用,就永远不会删除,内存不会被释放,从而造成内存泄漏.
3.定期删除,每隔一段时间,就随机抽取一些设置了过期时间的key进行检查,将其中过期的键删除掉,默认是1s执行10次定期删除,每次抽取5个.优点可以通过限制删除操作执行的时长和频率来减少删除的操作对CPU的影响.另外定期删除,也能有效释放过期键占用的内存.缺点:单一确定删除操作执行的时长和频率,如果执行的太频繁,定期删除策略变得和定时删除一样,对CPU不友好.如果执行频率太低,就和惰性删除一样,过期键占用的内存不会及时得到释放.而且,如果在获取某个键时,如果某个键的过期时间到了,但是还没执行定期删除,那么就会返回这个键的值,这是业务不能忍受的错误.
Redis的事务不保证原子性,在Redis中,单条命令是原子性执行的,但事务不保证原子性,且没有回滚.事务中任意命令执行失败,其余的命令仍会被执行.
Redis没有隔离级别的概念,批量操作在发送exec命令前被放入队列缓存,并不会被实际执行,也就不存在事务内的查询要看到的事务里的更新,所以事务外的查询是查不到的.
优点:一次性按照顺序执行多个Redis命令,不受其他客户端命令请求影响,事务中的命令要么都执行,要么都不执行.
缺点:事务执行时,不能保证原子性,命令入队每次都需要和服务器进行交互,增加带宽.
注意:当事务中命令的语法使用错误时,最终会导致事务执行不成功,即事务中所有命令都不执行.当时事务中命令知识逻辑错误,就比如给字符串做加减乘除操作,只能在执行过程中发现错误,这种事务执行中失败的命令不影响其他命令的执行.
主从复制,是只将一台Redis服务器的数据复制到其他Redis服务器,前者成为主节点,master,后者成为从节点slave,数据的复制只能是从主节点到从节点.master节点可以增删改查数据,slave只能查询数据
主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式.当主节点出现问题之后,可以有从节点提供服务,实现快速的故障恢复.在主从复制的基础上,配合读写分离,可以右主节点提供写服务,由从节点提供读服务,尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量.除此之外,主从模式还是集群和哨兵能够实施的基础.
哨兵是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的Master并将所有的Slave连接到新的Master.所以整个运行哨兵集群的数量不能少于3个节点.
哨兵会不断检查主节点和从节点是否运作正常.当主节点不能正常工作时,哨兵会开始自动故障转移操作.它会将失效主节点的其中一个从节点升级为新的主节点.并让其他从节点改为复制新的主节点.
哨兵结构由哨兵节点和数据节点组成,在整个哨兵系统中,会同时存在一个或多个哨兵节点组成,哨兵节点的特殊的Redis节点,不存储数据.主节点和从节点都是数据节点.
数据分区是集群最核心的功能.集群将数据分散到多个节点,一方面突破了Redis单机内存大小的限制,存储容量大大增加,另一方面,每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力.
集群支持主从复制模式和主节点的自动故障转移,当任意节点发送故障时,集群仍然可以对外提供服务.
当一个新的键值对要添加到字典中时,程序需要现根据键值对的键算出哈希值和索引值,然后再根据索引值,将包含新键值对的哈希表节点放到哈希表数组对应的指定索引上面.
Redis中的hash冲突是指,两个key的哈希值和哈希桶计算对应关系时,正好落在了一个哈希桶中.
Redis的哈希表是采用链地址法解决键冲突的,每个哈希表节点上都有一个next指针,多个哈希表节点可以用next指针构成一个单向链表,被分配到同一个索引上的多个节点可以用这个单向链表连接起来,这样就解决了键冲突的问题.