我和宇宙之间有必然的联系吗?宇宙是否有尽头?时间是否有长短?过去的时间在哪里消失?未来的时间又在何处停止?我在这一刻提出的问题还是你刚才提到的问题吗?
一、常见问题
- 什么是Redis?
- Redis相比memcached有哪些优势?
- Redis支持哪几种数据类型?
- Redis主要消耗什么物理资源?
- Redis的全称是什么?
- Redis有哪几种数据淘汰策略?
- Redis官方为什么不提供Windows版本?
- 一个字符串类型的值能存储最大容量是多少?
- 为什么Redis需要把所有数据放到内存中?
- Redis集群方案应该怎么做?都有哪些方案?
- Redis集群方案什么情况下会导致整个集群不可用?
- MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?
- Redis有哪些适合的场景?
- Redis支持的Java客户端都有哪些?官方推荐用哪个?
- Redis和Redisson有什么关系?
- Jedis与Redisson对比有什么优缺点?
- Redis如何设置密码及验证密码?
- 说说Redis哈希槽的概念?
- Redis集群的主从复制模型是怎样的?
- Redis集群会有写操作丢失吗?为什么?
- Redis集群之间是如何复制的?
- Redis集群最大节点个数是多少?
- Redis集群如何选择数据库?
- 怎么测试Redis的连通性?
- Redis中的管道有什么用?
- 怎么理解Redis事务?
- Redis事务相关的命令有哪几个?
- Redis key的过期时间和永久有效分别怎么设置?
- Redis如何做内存优化?
- Redis回收进程如何工作的?
- Redis回收使用的是什么算法?
- Redis如何做大量数据插入?
- 为什么要做Redis分区?
- 你知道有哪些Redis分区实现方案?
- Redis分区有什么缺点?
- Redis持久化数据和缓存怎么做扩容?
- 分布式Redis是前期做还是后期规模上来了再做好?为什么?
- Twemproxy是什么?
- 支持一致性哈希的客户端有哪些?
- Redis与其他key-value存储有什么不同?
- Redis的内存占用情况怎么样?
- 都有哪些办法可以降低Redis的内存使用情况呢?
- 查看Redis使用情况及状态信息用什么命令?
- Redis的内存用完了会发生什么?
- Redis是单线程的,如何提高多核CPU的利用率?
- 一个Redis实例最多能存放多少的keys?List、Set、Sorted Set他们最多能存放多少元素?
- Redis常见性能问题和解决方案?
- Redis提供了哪几种持久化方式?
- 如何选择合适的持久化方式?
- 修改配置不重启Redis会实时生效吗?
- Redis为什么快
- 线程切换为何费时
- 带宽是Redis的瓶颈点及网卡的瓶颈点
- 在网络传输时哪里耗时
- Redis集群不能使用的命令
- Redis管道实现原理,是原子性的吗
- Redis大key问题评估及处理
- Redis多路复用和单线程
- Redis原子命令
- Redis cluster哈希槽里面存的是啥
- Redis cluster集群运行lua脚本会有什么问题?
- Redis基础数据类型底层实现,为什么用跳表而不用树
- Redis响应变慢了
- Redis统计网站的uv和pv
- 微信运动每天晚上十点出的“占领了多少个朋友的榜首”功能实现,需要考虑微信的海量数据
- Redis集群使用的路由函数
二、延伸
三、各种问题
redis-server无法关闭
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不掉进程,一般是权限问题导致的
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
- 重启Mac,
- sudo make && make install,结果可能报错:
1
2
3Installing 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
源码安装
- 去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
5808: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版本列表:Redis官网有默认最新稳定版本,想要下载旧版本,传送门,每个版本更新了什么内容,即release notes,目前最早的只能查到2.2版本。
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。
RedLock和Redisson
key迁移
- migrate
- move
- dump
- restore
zset积分相同处理逻辑
- 从score入手,拼接时间戳或实际分数拼接小数
- 从member入手,保证业务靠前的member顺序
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扩展安装
解压 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
- configure: error: memcached support requires libmemcached. Use –with-libmemcached-dir=
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
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模块
- 参考
redis集群cluster不能使用的命令
- select命令
- Multi-Key多key操作
- SUNION
- mget
- 事务(key落在不同的槽情况)
- lua脚本
hash tag
bigkey问题评估
可重入锁、公平与非公平、读锁与写锁、自旋锁
zset value取值范围
hash扩容缩容
redis set原子性操作的底层实现、save实现
Redis::CommandError: CROSSSLOT Keys in request don’t hash to the same slot>
pipeline批量执行redis命令时候,访问redis cluster集群;包含100个key,里面有10个在节点1,90在节点2。命令被路由到节点1了,后续执行流程
redis:config get config_setting_name
redis工具
redis:config get config_setting_name
find ./ -name redis.conf