个人博客http://www.lampnick.com/php/874
Redis介绍
- 基于key-value的NoSQL数据库
- 数据结构
- string字符串
- hash哈希
- list列表
- set集合
- zset有序集合
- Bitmaps位图
- HyperLogLog
- GEO地理信息定位
- …
特性
- 速度快,官方给出的数字是读写性能可以达到10万/秒,那为什么有这么快的速度呢?
- Redis的所有数据都是存放在内存中的,这是Redis速度快的最主要原因
- Redis是用C写的,一般来说C实现的程序“距离”操作系统更近,执行速度相对会更快
- Redis使用了单线程架构,预防了多线程可能产生的竞争问题
- Redis源代码是一个集性能和优雅于一体的优秀的开源代码。
- 基于键值对的数据结构服务器
- Redis的值不仅可以是字符串,还可以是具体的数据结构
- 全称:REmote Dictionary(字典) Server
- 主要提供了5种数据结构:字符串、哈希、列表、集合、有序集合,同时在字符串的基础之上演变出了位图(Bitmaps)和HyperLogLog两种神奇的“数据结构”,并随着LBS(Location Based Service,基于位置服务)的不断发展,于Redis3.2版本中加入了有关GEO(地理信息定位)的功能。
- 丰富的功能,除了5种数据结构,还提供了许多额外的功能
- 提供了键过期功能,可以用来实现缓存
- 发布订阅功能,可以用来实现消息系统
- 支持Lua脚本功能,可以利用Lua创造出新的Redis命令
- 简单的事务功能,能在一定程度上保证事务特性。
- 流水线(Pipeline)功能,这样客户端能将一批命令一次性传到Redis,减少网络开锁。
- 简单稳定,主要表现在三个方面
- Redis源码少,早期只有2万行左右,3.0版本后添加了集群特性,增至5万行左右,相对于很多NoSQL数据库来说代码量相对要少很多,也就意味着普通的开发和运维人员完全可以吃透它
- Redis使用单线程模型,不仅使得Redis服务端处理模型变得简单,也使得客户端开发变得简单
- Redis不需要依赖于操作系统的类库(如Memcache需要依赖libevent这样的系统类库),Redis自己实现了事件处理的相关功能。
- 客户端语言多
- Redis提供了简单的TCP通信协议,编程语言可以方便的接入到Redis
- 持久化
- 通常看,将数据放在内存中是不安全的,一旦发生断电或机器故障,重要的数据库可能会丢失,因此Redis提供了两种持久化方式:RDB和AOF,可以用两种策略将内存的数据保存到硬盘,这样就保证了数据的可持久性
- 主从复制
- 提供复制功能,实现了多个相同数据的Redis副本,复制功能是分布式Redis的基础
- 高可用和分布式
- 从2.8版本正式提供了高可用实现Redis Sentinel,它能保证Redis节点的故障发现和故障自动转移。3.0版本正式提供了分布式实现Redis Cluster,它是Redis真正的分布式实现,提供了高可用、读写和容量的扩展性
Redis的使用场景
Redis可以做什么
- 缓存
- Redis提供了键值过期时间设置,并且也提供了灵活控制最大内存和内存溢出后的淘汰策略。
- 排行榜系统
- Redis提供了列表和有序集合数据结构,合理地使用这些数据结构可以很方便地构建各种排行榜系统。
- 计数器应用
- 社交网络
- 消息队列系统
- Redis提供了发布订阅功能和阻塞队列的功能,虽然和专业的消息队列比还不够足够强大,但是对于一般的消息队列功能基本可以满足。
Redis不可以做什么
- 从数据规模和数据冷热来说
- 数据规模
- 大规模数据
- 小规模数据
- 数据冷热
- 热数据
- 冷数据
- 数据规模
使用Redis的建议
- 切勿当作黑盒使用,开发与运维同样重要,很多线上的故障和问题都是由于完全把Redis当做黑盒造成的,如果不了解Redis的单线程模型,有些开发者会在有上千万个键的Redis上执行keys*操作,如果不了解持久化的相关原理,会在一个写操作量很大的Redis上配置自动保存RDB。
- 阅读源码
Redis的安装
-
安装
# wget http://download.redis.io/releases/redis-3.0.7.tar.gz # tar -zxvf redis-3.0.7.tar.gz # ln -s redis-3.0.7 redis # cd redis # make && make install 安装完成后,在src和/usr/local/bin目录下多了几个redis开关的可执行文件,称之为Redis shell
-
安装之后生成的可执行文件如下
- redis-server 启动停止redis
- redis-cli Redis命令行客户端
- redis-benchmark Redis基准测试工具
- redis-check-aof Redis AOF持久化文件检测和修复工具
- redis-check-dump Redis RDB持久化文件检测和修复工具
- redis-sentinel 启动Redis Sentinel
-
启动Redis
- 默认配置
这种方法会使用Redis的默认配置来启动,下面就是redis-server执行后输出的相关日志 [root@worker1 redis]# redis-server 48923:C 13 Nov 15:44:54.871 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf 48923:M 13 Nov 15:44:54.872 * Increased maximum number of open files to 10032 (it was originally set to 1024). _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 3.0.7 (00000000/0) 64 bit .-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in standalone mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379 | `-._ `._ / _.-' | PID: 48923 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-' 48923:M 13 Nov 15:44:54.872 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 48923:M 13 Nov 15:44:54.872 # Server started, Redis version 3.0.7 48923:M 13 Nov 15:44:54.872 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled. 48923:M 13 Nov 15:44:54.872 * The server is now ready to accept connections on port 6379 直接使用redis-server启动Redis后,会打印出一些日志,通过日志可以得知 - 当前的Redis版本为3.0.7 - Redis默认端口是6379 - Redis建议使用配置文件来启动
- 运行启动
redis-server加上要修改的配置名和值(可以多对),没设置的配置将使用默认配置 # redis-server --configKey1 configValue1 --configKey2 configValue2 如要用6380作为端口启动Redis,那么执行
- 配置文件启动
例如将配置写到/opt/redis/redis.conf,只需要执行如下命令就可以启动Redis # redis-server /opt/redis/redis.conf
- 默认配置
-
Redis命令行客户端
- redis-cli可以使用两种方式连接Redis服务器
- 第一种是交互式方式
[root@worker1 redis]# redis-cli -h 127.0.0.1 -p 6379 127.0.0.1:6379> set hello world OK 127.0.0.1:6379> get hello "world"
- 第二种是命令方式
[root@worker1 redis]# redis-cli -h 127.0.0.1 -p 6379 get hello "world"
- 第一种是交互式方式
- Redis提供了shutdown命令来停止Redis服务,如要停掉127.0.0.1上的6379端口上的服务
[root@worker1 redis]# redis-cli shutdown 在服务端能看到输出如下日志 77022:M 13 Nov 16:18:52.551 # User requested shutdown... 77022:M 13 Nov 16:18:52.551 * Saving the final RDB snapshot before exiting. 77022:M 13 Nov 16:18:52.569 * DB saved on disk 77022:M 13 Nov 16:18:52.569 # Redis is now ready to exit, bye bye... 当再次连接时,连接拒绝 [root@worker1 redis]# redis-cli -h 127.0.0.1 -p 6379 get hello Could not connect to Redis at 127.0.0.1:6379: Connection refused
- 三点需要注意
- Redis关闭的过程:断开与客户端的连接、持久化文件生成,是一种 相对优雅的关闭方式。
- 除了可以通过shutdown命令关闭Redis服务以外,还可以通过kill进程号的方式关闭掉Redis,但是不要粗暴地使用kill -9强制杀死Redis服务,不但不会做持久化操作,还会造成缓冲区等资源不能被优雅关闭,极端情况会造成AOF和复制丢失数据的情况。
- shutdown还有一个参数,代表是否在关闭Redis前,生成持久化文件:redis-cli shutdown nosave|save
- 三点需要注意
- redis-cli可以使用两种方式连接Redis服务器
-
Redis版本
- 规则
Redis借鉴了Linux操作系统对于版本号的命名规则:版本号第二位如果是奇数,则为非稳定版本(例如2.7、2.9、3.1),如果是偶数,则为稳定版本(例如2.6、2.8、3.0、3.2)。当前奇数版本就是下一个稳定版本的开发版 本,例如2.9版本是3.0版本的开发版本。所以我们在生产环境通常选取偶数版本的Redis,如果对于某些新的特性想提前了解和使用,可以选择最新的 奇数版本。
- 规则
总结
- Redis的8个特性:速度快、基于键值对的数据结构服务器、功能丰富、简单稳定、客户端语言多、持久化、主从复制、支持高可用和分布式。
- Redis并不是万金油,有些场景不适合使用Redis进行开发。
- 开发运维结合以及阅读源码是用好Redis的重要方法。
- 生产环境中使用配置文件启动Redis。
- 生产环境选取稳定版本的Redis。(偶数)
- Redis3.0是重要的里程碑,发布了Redis官方的分布式实现Redis Cluster。