面霸之路--Redis

redis
  • 数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
  • 数据类型
    • string:最基本的数据类型,二进制安全的字符串,最大512M。
    • list:按照添加顺序保持顺序的字符串列表。
    • set:无序的字符串集合,不存在重复的元素。
    • sorted set:已排序的字符串集合。
    • hash:key-value对的一种集合。
    • bitmap:更细化的一种操作,以bit为单位。
    • hyperloglog:基于概率的数据结构
  • Redis与Memcached的区别与比较
    • 1. Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。memcache支持简单的数据类型,String。
    • 2 、Redis支持数据的备份,即master-slave模式的数据备份。
    • 3 、Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用,而Memecache把数据全部存在内存之中
    • 4、 redis的速度比memcached快很多
    • 5、Memcached是多线程,非阻塞IO复用的网络模型;Redis使用单线程的IO复用模型。
    • Memcached追求的高性能的内存服务;而Redis追求的不仅仅是内存运行,还有数据持久化的需
    • Memcached与Redis都是C语言实现,但是不约而同的都抛弃了传统C语言中的malloc/free函数,而选择了自主实现内存模型。
    • Memcached使用预分配的内存池的方式,使用slab和大小不同的chunk来管理内存,Redis使用现场申请内存的方式来存储数据,会在一定程度上存在内存碎片。
  • Redis优点
    • (1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
    • (2)支持丰富数据类型,支持string,list,set,sorted set,hash
    • (3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
    • (4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除
  • Redis list的实现为一个双向链表
  • string类型是Redis最基本的数据类型,一个键最大能存储512MB。
  • sorted set增加了一个权重参数score,使得集合中的元素能够按score进行有序排列。
  • redis有哪些数据淘汰策略
    • 1. volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
    • 2. volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
    • 3. volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
    • 4. allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
    • 5. allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
    • 6. no-enviction(驱逐):禁止驱逐数据
  • Redis为单进程单线程模式,采用队列模式将并发访问变为串行访问。Redis本身没有锁的概念。
  • Redis 大量数据插入
    • 从Redis 2.6开始redis-cli支持一种新的被称之为pipe mode的新模式用于执行大量数据插入工作。
      • cat data.txt | redis-cli --pipe
        • 读取数据的同时,解析它。在分析回复的时候,我们会采用计数器的方法计数.
  • 持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。
  • RESP 是redis客户端和服务端之前使用的一种通讯协议
  • Redis 提供了两种持久化方式:RDB(默认) 和AOF 
    • AOF(append-only file)
      • 以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。
      • 3种同步策略
        • 每秒同步
        • 每修改同步
        • 不同步
      • 如果日志过大,Redis可以自动启用rewrite机制。即Redis以append模式不断的将修改数据写入到老的磁盘文件中,同时Redis还会创建一个新的文件用于记录此期间有哪些修改命令被执行。
    • RDB(Redis DataBase)
      • 将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化
      • 实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。
      • 数据高可用性存在问题,因为系统一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将丢失。
      • (fork 子进程)当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟。
    • 二者选择的标准,就是看系统是愿意牺牲一些性能,换取更高的缓存一致性(aof),还是愿意写操作频繁的时候,不启用备份来换取更高的性能,待手动运行save的时候,再做备份(rdb)
  • 集群解决
    • 1. 增加中间层,隔离具体依赖
      • 缺点:需要维护proxy的高可用,twermproxy会成为一个单点
    • 2. 让redis服务器知道彼此的存在
      • 通过重定向的机制来引导客户端来完成自己所需要的操作,比如客户端链接到了某一个redis服务器,说我要执行这个操作,redis服务器发现自己无法完成这个操作,那么就把能完成这个操作的服务器的信息给到客户端,让客户端去请求另外的一个服务器,这时候你就会发现每一个redis服务器都需要保持一份完整的分布式服务器信息的一份资料,不然它怎么知道让客户端去找其他的哪个服务器来执行客户端想要的操作呢。
  • 而redis官方给出的cluster方案则是把分布式的这部分事情做到了每一个redis服务器中,使其不再需要其他的组件就可以独立的完成分布式的要求。
  • redis的持久化指的是redis会把内存的中的数据写入到硬盘中,在redis重新启动的时候加载这些数据,从而最大限度的降低缓存丢失带来的影响,解决缓存雪崩。
  • Redis Cluster的具体实现细节则是采用了Hash槽的概念,即预先分配出来16384个槽:在客户端通过对Key进行CRC16(key)% 16384运算得到对应的槽是哪一个;在redis服务端则是每个服务器负责一部分槽 https://mp.weixin.qq.com/s/HUmByMp__slWxoOFdbQCOg
  • redis保证lua脚本的原子性,一定的场景下,是可以代替redis提供的事务相关的命令的。 https://segmentfault.com/a/1190000012919740?utm_source=tag-newest
  • 管道
    • 因为redis的客户端和服务器的连接时基于TCP的, 默认每次连接都时只能执行一个命令。管道则是允许利用一次连接来处理多条命令,从而可以节省一些tcp连接的开销。管道和事务的差异在于管道是为了节省通信的开销,但是并不会保证原子性。
  • 分布式锁 https://mp.weixin.qq.com/s/ZmMx6qICoquvuxw1LKNz3w
    • value中存入过期时间,重设过期时间,使用getSet()。释放锁时,还需判断key是否过期,不能直接删除。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值