0%

Redis收集

我和宇宙之间有必然的联系吗?宇宙是否有尽头?时间是否有长短?过去的时间在哪里消失?未来的时间又在何处停止?我在这一刻提出的问题还是你刚才提到的问题吗?

一、常见问题

  1. 什么是Redis?
  2. Redis相比memcached有哪些优势?
  3. Redis支持哪几种数据类型?
  4. Redis主要消耗什么物理资源?
  5. Redis的全称是什么?
  6. Redis有哪几种数据淘汰策略?
  7. Redis官方为什么不提供Windows版本?
  8. 一个字符串类型的值能存储最大容量是多少?
  9. 为什么Redis需要把所有数据放到内存中?
  10. Redis集群方案应该怎么做?都有哪些方案?
  11. Redis集群方案什么情况下会导致整个集群不可用?
  12. MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?
  13. Redis有哪些适合的场景?
  14. Redis支持的Java客户端都有哪些?官方推荐用哪个?
  15. Redis和Redisson有什么关系?
  16. Jedis与Redisson对比有什么优缺点?
  17. Redis如何设置密码及验证密码?
  18. 说说Redis哈希槽的概念?
  19. Redis集群的主从复制模型是怎样的?
  20. Redis集群会有写操作丢失吗?为什么?
  21. Redis集群之间是如何复制的?
  22. Redis集群最大节点个数是多少?
  23. Redis集群如何选择数据库?
  24. 怎么测试Redis的连通性?
  25. Redis中的管道有什么用?
  26. 怎么理解Redis事务?
  27. Redis事务相关的命令有哪几个?
  28. Redis key的过期时间和永久有效分别怎么设置?
  29. Redis如何做内存优化?
  30. Redis回收进程如何工作的?
  31. Redis回收使用的是什么算法?
  32. Redis如何做大量数据插入?
  33. 为什么要做Redis分区?
  34. 你知道有哪些Redis分区实现方案?
  35. Redis分区有什么缺点?
  36. Redis持久化数据和缓存怎么做扩容?
  37. 分布式Redis是前期做还是后期规模上来了再做好?为什么?
  38. Twemproxy是什么?
  39. 支持一致性哈希的客户端有哪些?
  40. Redis与其他key-value存储有什么不同?
  41. Redis的内存占用情况怎么样?
  42. 都有哪些办法可以降低Redis的内存使用情况呢?
  43. 查看Redis使用情况及状态信息用什么命令?
  44. Redis的内存用完了会发生什么?
  45. Redis是单线程的,如何提高多核CPU的利用率?
  46. 一个Redis实例最多能存放多少的keys?List、Set、Sorted Set他们最多能存放多少元素?
  47. Redis常见性能问题和解决方案?
  48. Redis提供了哪几种持久化方式?
  49. 如何选择合适的持久化方式?
  50. 修改配置不重启Redis会实时生效吗?
  51. Redis为什么快
    • 线程切换为何费时
    • 带宽是Redis的瓶颈点及网卡的瓶颈点
    • 在网络传输时哪里耗时
  52. Redis集群不能使用的命令
  53. Redis管道实现原理,是原子性的吗
  54. Redis大key问题评估及处理
  55. Redis多路复用和单线程
  56. Redis原子命令
  57. Redis cluster哈希槽里面存的是啥
  58. Redis cluster集群运行lua脚本会有什么问题?
  59. Redis基础数据类型底层实现,为什么用跳表而不用树
  60. Redis响应变慢了
  61. Redis统计网站的uv和pv
  62. 微信运动每天晚上十点出的“占领了多少个朋友的榜首”功能实现,需要考虑微信的海量数据
  63. Redis集群使用的路由函数

二、延伸

  1. Redis常见问题答疑
  2. 高并发架构系列
  3. 集群一致性问题
  4. Redis缓存兜底方案设计
  5. rosedb
  6. Redis面试题
  7. Redis性能监控
  8. Redis必会
  9. Redis高级笔记
  10. 各个版本

三、各种问题

  1. redis-server无法关闭

    • 安装
    • 启动/停止
      • cd /redis_path/src
      • ./redis-server
      • control+c,关闭不了服务
      • ps aux|grep redis
      • sudo kill -9 pid
  2. Mac下安装

    • 官网下载
    • 解压文件sudo tar -zxvf redis-5.0.7.tar.gz -C /usr/local
    • 切换目录cd /usr/local/redis-5.0.7
    • 安装sudo make
    • 复制可执行文件 cd src && cp {redis-server,redis-cli,redis-sentinel} ../
    • 修改配置文件daemonize yes
    • 启动redis服务 ./redis-server redis.conf
      • kill不掉进程,一般是权限问题导致的
  3. php扩展安装

    • PECL
    • 搜索redis
    • 下载源码 wget http://pecl.php.net/get/redis-4.3.0.tgz
    • sudo tar -zxvf redis-4.3.0.tgz
    • cd redis-4.3.0
    • sudo /usr/bin/phpize
    • sudo ./configure –with-php-config=/usr/bin/php-config
      • grep: /usr/include/php/main/php.h: No such file or directory
      • grep: /usr/include/php/Zend/zend_modules.h: No such file or directory
      • grep: /usr/include/php/Zend/zend_extensions.h: No such file or directory
    • 苹果从 OS X El Capitan 10.11 系统开始使用了 Rootless 机制,可以将该机制理解为一个更高等级的系统的内核保护措施,系统默认将会锁定 /system、/sbin、/usr 这三个目录。
      • 重启Mac,按下 Command+R进入恢复模式,打开Terminal,输入csrutil disable以关闭Rootless,重启mac
      • ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/include /usr/include
    • sudo make && make install,结果可能报错:
    1
    2
    3
    Installing shared extensions:     /usr/lib/php/extensions/no-debug-non-zts-20160303/
    cp: /usr/lib/php/extensions/no-debug-non-zts-20160303/#INST@2076#: Operation not permitted
    make: *** [install-modules] Error 1
    • 手动复制 sudo cp redis.so /usr/lib/php/extensions/no-debug-non-zts-20160303/redis.so
    • 待安装完成后再次开启Rootless csrutil enable,重启mac
  4. 源码安装

    • redis官网下载源码
    • 解压 tar -zxvf redis-5.0.4.tar.gz -C /usr/local
    • 切换目录 cd /usr/local/redis-5.0.4
    • 安装 make
    • 切换目录 cd src
    • 复制相关文件以全局运行 cp {redis-cli,redis-server,redis-sentinel} /usr/local/bin/
    • 修改redsi.conf,以后台进程方式运行 daemonize yes
    • 启动服务 redis-server redis.conf
    • 查看redis进程 ps -ef|grep redis
    • 测试
    1
    2
    3
    4
    5
    6
    >redis-cli

    >set name "张三"

    >get name
    "\xe5\xbc\xa0\xe4\xb8\x89" //中文乱码
    • redis-cli --raw // 解决中文乱码
    • 进程kill不掉,一般是目录权限问题,对redis目录加一下权限
    1
    2
    3
    4
    5
    808:M 18 Dec 2019 14:29:48.639 # User requested shutdown...
    808:M 18 Dec 2019 14:29:48.639 * Saving the final RDB snapshot before exiting.
    808:M 18 Dec 2019 14:29:48.639 # Failed opening the RDB file dump.rdb (in server root dir /usr/local/redis-5.0.7) for saving: Permission denied
    808:M 18 Dec 2019 14:29:48.639 # Error trying to save the DB, can't exit.
    808:M 18 Dec 2019 14:29:48.639 # SIGTERM received but errors trying to shut down the server, check the logs for more information
  5. 版本列表:Redis官网有默认最新稳定版本,想要下载旧版本,传送门,每个版本更新了什么内容,即release notes,目前最早的只能查到2.2版本。

    • 进入redis官网
    • 点击进入下载页
    • 点击下载默认会下载最新稳定版本,历史版本
    • 点击release notes查看每个版本更新的内容,如3.0版本
    • 进入Redis官网GitHub
    • 克隆代码到本地,git clone https://github.com/redis/redis.git
    • 进入代码仓库,cd redis
    • 查看所有分支,git branch -a
    • 可以看到最早的版本只到2.2,查看2.2版本更新内容
    • 重大版本更新内容列表,参考
  6. Redis-Memcached-MongoDB

    • Redis

      • 优点
        • 支持多种数据结构,如string/list/hashes/set/zset/hyperloglog/simply bitmaps/streams
        • 支持持久化操作
        • 支持通过Replication进行数据复制,通过master-slave机制,可以实时进行数据的同步复制,支持多级复制和增量复制,master-slave机制是Redis进行HA的重要手段。
        • 单线程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题。
        • 支持pub/sub消息订阅机制,可以用来进行消息订阅与通知。
        • 支持简单的事务
      • 缺点
        • Redis只能使用单线程,性能受限于CPU性能,故单实例CPU最高才可能达到5-6wQPS每秒(取决于数据结构,数据大小以及服务器硬件性能,日常环境中QPS高峰大约在1-2w左右)。
        • 支持简单的事务需求,但业界使用场景很少,并不成熟,既是优点也是缺点。
        • Redis在string类型上会消耗较多内存,可以使用dict(hash表)压缩存储以降低内存耗用。
        • Mc和Redis都是Key-Value类型,不适合在不同数据集之间建立关系,也不适合进行查询搜索。比如redis的keys pattern这种匹配操作,对redis的性能是灾难。
    • Memcached

      • 优点
        • Memcached可以利用多核优势,单实例吞吐量极高,可以达到几十万QPS(取决于key、value的字节大小以及服务器硬件性能,日常环境中QPS高峰大约在4-6w左右),适用于最大程度扛量。
        • 支持直接配置为session handle。
      • 缺点
        • 只支持简单的key/value数据结构,不像Redis可以支持丰富的数据类型。
        • 无法进行持久化,数据不能备份,只能用于缓存使用,且重启后数据全部丢失。
        • 无法进行数据同步,不能将Memcached中的数据迁移到其他MC实例中。
        • Memcached内存分配采用Slab Allocation机制管理内存,value大小分布差异较大时会造成内存利用率降低,并引发低利用率时依然出现踢出等问题,故需要用户注重value设计。
    • mongoDB

      • 优点
        • 更高的写负载,MongoDB拥有更高的插入速度。
        • 处理很大的规模的单表,当数据表太大的时候可以很容易的分割表。
        • 高可用性,设置M-S不仅方便而且很快,MongoDB还可以快速、安全及自动化的实现节点(数据中心)故障转移。
        • 快速的查询,MongoDB支持二维空间索引,比如管道,因此可以快速及精确的从指定位置获取数据。MongoDB在启动后会将数据库中的数据以文件映射的方式加载到内存中。如果内存资源相当丰富的话,这将极大地提高数据库的查询速度。
        • 非结构化数据的爆发增长,增加列在有些情况下可能锁定整个数据库,或者增加负载从而导致性能下降,由于MongoDB的弱数据结构模式,添加1个新字段不会对旧表格有任何影响,整个过程会非常快速。
        • 适合场景:事件记录、内容管理或博客平台
      • 缺点
        • 不支持事务
        • MongoDB占用空间过大
        • MongoDB没有成熟的维护工具
      • mongodb持久化原理
        • ysql的每一次更新操作都会直接写入硬盘
        • mongodb启动时会专门初始化一个线程不断循环,用于在一定时间周期内来从defer队列中获取要持久化的数据并写入到磁盘的journal(日志)和mongofile(数据)处。因为它不是在用户添加记录时就写到磁盘上,所以mongodb开发者说它不会造成性能上的损耗。
        • 当进行CUD操作时,记录(Record类型)都被放入到defer队列中以供延时批量提交写入,其中时间周期参数是个要认真考量的参数,系统默认为90毫秒,如果该值更低的话可能会造成频繁磁盘操作,过高又会造成系统宕机时数据丢失过。
    • Redis VS Memcached

      • Redis只使用单核,而Memcached可以使用多核,在大量数据处理性能上比Memcached稍差。
      • MemCached可以修改最大内存,采用LRU算法;Redis增加了VM的特性,突破了物理内存的限制。
      • MemCached数据结构单一,仅用来缓存数据;而Redis支持更加丰富的数据类型,也可以在服务器端直接对数据进行丰富的操作从而减少网络IO次数和数据体积。
      • MemCached不支持数据持久化,断电或重启后数据消失,但其稳定性是有保证的;Redis支持数据持久化和数据恢复,允许单点故障,但是同时也会付出性能的代价。
      • Memcached适用于动态系统中减轻数据库负载,提升性能;做缓存,适合多读少写,大数据量的情况(如人人网大量查询用户信息、好友信息、文章信息等); Redis适用于对读写效率要求都很高,数据处理业务复杂和对安全性要求较高的系统(如新浪微博的计数和微博发布部分系统,对数据安全性、读写要求都很高)。
      • Memcached单个key-value大小有限,一个value最大只支持1MB;而Redis最大支持512MB。
  7. RedLock和Redisson

    • RedLock是Redis官方提出的一种分布式锁的算法
    • Redisson是Java的Redis客户端之一,提供了一些api方便操作redis,并实现了RedLock算法
    • 参考
  8. key迁移

    • migrate
    • move
    • dump
    • restore
  9. zset积分相同处理逻辑

    • 从score入手,拼接时间戳或实际分数拼接小数
    • 从member入手,保证业务靠前的member顺序
  10. memcached各种安装

    • 安装Memcached

    • 通过brew安装

      • 查看可安装包 brew search memcache
        • libmemcached:客户端
        • memcached:服务器
      • 查看依赖包 brew info memcached,缺少则对应安装即可
      • 开始安装 brew install memcached,安装完一般在/usr/local/Cellar/memcached/对应的版本
      • 启动服务 memcached -d -p 11211 -m 64m
        • -d: 以守护进程方式运行;
        • -l: IP地址 location
        • -p: 端口号
        • -m: 占用内存大小,以m为单位
        • -u: 以什么用户打开
    • 源码安装

    • 参考

    • php扩展安装

    • 下载 wget http://pecl.php.net/get/memcached-2.2.0.tgz

    • 解压 tar -zxvf memcached-2.2.0.tgz

    • /path/phpize

    • ./configure –with-php-config=/path/php-config

      • configure: error: memcached support requires libmemcached. Use –with-libmemcached-dir= to specify the prefix where libmemcached headers and library are located
    • brew install libmemcached,macOS 10.14.4安装完一般都在/usr/local/Cellar目录下对应的扩展下面

    • ./configure –with-php-config=/path/php-config –with-libmemcached-dir=/path/libmemecached

    • make && make install

  11. redis.conf配置文件说明(5.0)

    • INCLUDES模块
    • MODULES模块
    • NETWORK模块
    • GENERAL模块
    • SNAPSHOTTING模块
    • REPLICATION模块
    • SECURITY模块
    • CLIENTS模块
    • MEMORY MANAGEMENT模块
    • LAZY FREEING模块
    • APPEND ONLY MODE模块
    • LUA SCRIPTING模块
    • REDIS CLUSTER模块
    • CLUSTER DOCKER/NAT support模块
    • SLOW LOG模块
    • LATENCY MONITOR模块
    • EVENT NOTIFICATION模块
    • ADVANCED CONFIG模块
    • ACTIVE DEFRAGMENTATION模块
    • 参考
  1. redis集群cluster不能使用的命令

    • select命令
    • Multi-Key多key操作
    • SUNION
    • mget
    • 事务(key落在不同的槽情况)
    • lua脚本
  2. hash tag

  3. bigkey问题评估

  4. 可重入锁、公平与非公平、读锁与写锁、自旋锁

  5. zset value取值范围

  6. hash扩容缩容

  7. redis set原子性操作的底层实现、save实现

  8. Redis::CommandError: CROSSSLOT Keys in request don’t hash to the same slot>

  9. pipeline批量执行redis命令时候,访问redis cluster集群;包含100个key,里面有10个在节点1,90在节点2。命令被路由到节点1了,后续执行流程

  10. redis:config get config_setting_name

  11. redis工具

  12. redis:config get config_setting_name

  13. find ./ -name redis.conf