Redis是一个key-value存储系统,官网:http://redis.io
Redis和memcached类似,但是支持数据持久化
Redis支持更多value类型,除了string外,还支持hash、lists(链表)、sets(集合)和sorted setd(有序集合)这几种类型
Redis使用了两种文件格式:全量数据(RDB)和增量请求(AOF)。全量数据格式是把内存中的数据写入磁盘,便于 下次读取文件进行加载。增量请求文件格式则是把内存中的数据序列化为操作请求,用于读取文件进行replay得到数据
Redis的存储分为内存存储、磁盘存储和log文件三部分
AOF: 类似于mysql的二进制日志文件,当服务器重启或服务重启时,会依据这些AOF重新写磁盘,以此来达到数持久化
1. 使用Redis有哪些好处? (1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1) (2) 支持丰富数据类型,支持string,list,set,sorted set,hash (3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行 (4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除 2. redis相比memcached有哪些优势? (1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型 (2) redis的速度比memcached快很多 (3) redis可以持久化其数据 3. redis常见性能问题和解决方案: (1) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件 (2) 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次 (3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内 (4) 尽量避免在压力很大的主库上增加从库 (5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3... 这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。 4. MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据 相关知识:redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。redis 提供 6种数据淘汰策略: voltile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰 volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰 volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰 allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰 allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰 no-enviction(驱逐):禁止驱逐数据 5. Memcache与Redis的区别都有哪些? 1)、存储方式 Memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。 Redis有部份存在硬盘上,这样能保证数据的持久性。 2)、数据支持类型 Memcache对数据类型支持相对简单。 Redis有复杂的数据类型。 3),value大小 redis最大可以达到1GB,而memcache只有1MB 6. Redis 常见的性能问题都有哪些?如何解决? 1).Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照。 2).Master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF文件过大会影响Master重启的恢复速度。Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化,如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。 3).Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象。 4). Redis主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内 7, redis 最适合的场景 Redis最适合所有数据in-momory的场景,虽然Redis也提供持久化功能,但实际更多的是一个disk-backed的功能,跟传统意义上的持久化有比较大的差别,那么可能大家就会有疑问,似乎Redis更像一个加强版的Memcached,那么何时使用Memcached,何时使用Redis呢? 如果简单地比较Redis与Memcached的区别,大多数都会得到以下观点: 1 、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。 2 、Redis支持数据的备份,即master-slave模式的数据备份。 3 、Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。 (1)、会话缓存(Session Cache) 最常用的一种使用Redis的情景是会话缓存(session cache)。用Redis缓存会话比其他存储(如Memcached)的优势在于:Redis提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失,大部分人都会不高兴的,现在,他们还会这样吗? 幸运的是,随着 Redis 这些年的改进,很容易找到怎么恰当的使用Redis来缓存会话的文档。甚至广为人知的商业平台Magento也提供Redis的插件。 (2)、全页缓存(FPC) 除基本的会话token之外,Redis还提供很简便的FPC平台。回到一致性问题,即使重启了Redis实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似PHP本地FPC。 再次以Magento为例,Magento提供一个插件来使用Redis作为全页缓存后端。 此外,对WordPress的用户来说,Pantheon有一个非常好的插件 wp-redis,这个插件能帮助你以最快速度加载你曾浏览过的页面。 (3)、队列 Reids在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消息队列平台来使用。Redis作为队列使用的操作,就类似于本地程序语言(如Python)对 list 的 push/pop 操作。 如果你快速的在Google中搜索“Redis queues”,你马上就能找到大量的开源项目,这些项目的目的就是利用Redis创建非常好的后端工具,以满足各种队列需求。例如,Celery有一个后台就是使用Redis作为broker,你可以从这里去查看。 (4),排行榜/计数器 Redis在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合(Sorted Set)也使得我们在执行这些操作的时候变的非常简单,Redis只是正好提供了这两种数据结构。所以,我们要从排序集合中获取到排名最靠前的10个用户–我们称之为“user_scores”,我们只需要像下面一样执行即可: 当然,这是假定你是根据你用户的分数做递增的排序。如果你想返回用户及用户的分数,你需要这样执行: ZRANGE user_scores 0 10 WITHSCORES Agora Games就是一个很好的例子,用Ruby实现的,它的排行榜就是使用Redis来存储数据的,你可以在这里看到。 (5)、发布/订阅 最后(但肯定不是最不重要的)是Redis的发布/订阅功能。发布/订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用Redis的发布/订阅功能来建立聊天系统!(不,这是真的,你可以去核实)。
一、Redis安装
1.下载并解压包
wget https://codeload.github.com/antirez/redis/tar.gz/2.8.21 -O redis-2.8.21.tar.gz
tar zxvf redis-2.8.21.tar.gz
2. make ------注意:redis的编译安装没有像其他源码编译安装的第一步./configure
cd redis-2.8.21
make
make报错缺少文件的解决:
yum install -y gcc -----注意:在编译安装任何一款源码包时,都需要gcc包
yum install -y epel-release
yum install -y jemalloc-devel
cd /usr/local/redis-2.8.21/deps
make hiredis lua jemalloc
make linenoise
make -----最后出现提示信息:'make test'即说明make ok
3.make install
make PREFIX=/usr/local/redis install
4.拷贝配置文件:
mkdir /usr/local/redis/etc ---创建该目录用来存放配置文件
cp /usr/local/src/redis-2.8.21/redis.conf /usr/local/redis/etc/ 拷贝配置文件
Redis通用配置 daemonize no # 默认情况下,redis并不是以daemon形式来运行的。通过daemonize配置项可以控制redis的运行形式 pidfile /path/to/redis.pid #当以daemon形式运行时,redis会生成一个pid文件,默认会生成在/var/run/redis.pid bind 192.168.1.2 10.8.4.2 # 指定绑定的ip,可以有多个 port 6379 #指定监听端口 unixsocket /tmp/redis.sock #也可以监听socket unixsocketperm 755 #当监听socket时可以指定权限为755 timeout 0 #当一个redis-client一直没有请求发向server端,那么server端有权主动关闭这个连接,可以通过timeout来设置“空闲超时时限”,0表示永不关闭。 tcp-keepalive 0 #TCP连接保活策略,可以通过tcp-keepalive配置项来进行设置,单位为秒,假如设置为60秒,则server端会每60秒向连接空闲的客户端发起一次ACK请求,以检查客户端是否已经挂掉,对于无响应的客户端则会关闭其连接。如果设置为0,则不会进行保活检测。 loglevel notice # 日志级别,有四种debug, verbose, notice, warning logfile “” #定义日志路径 syslog-ident redis #如果希望日志打印到syslog中,通过syslog-enabled来控制。另外,syslog-ident还可以让你指定syslog里的日志标志。 syslog-facility local0 # 指定syslog的设备,可以是USER或者local0-local7 databases 16 #设置数据库的总数量 Redis快照配置(rdb持久化) save 900 1 #表示每15分钟且至少有1个key改变,就触发一次持久化 save 300 10 #表示每5分钟且至少有10个key改变,就触发一次持久化 save 60 10000 #表示每60秒至少有10000个key改变,就触发一次持久 save “” #这样可以禁用rdb持久化 stop-writes-on-bgsave-error yes #rdb持久化写入磁盘避免不了会出现失败的情况,默认一旦出现失败,redis会马上停止写操作。如果你觉得无所谓,那就可以使用该选项关闭这个功能。 rdbcompression yes #是否要压缩 rdbchecksum yes #是否进行数据校验 dbfilename dump.rdb #定义快照文件的名字 dir ./ #定义快照文件储存路劲 Redis安全相关配置 requirepass aminglinux #设置redis-server的密码 rename-command CONFIG aminglinux.config #将CONFIG命令更名为aminglinux.config,这样可以避免误操作,但如果使用了AOF持久化,建议不要启用该功能 rename-command CONFIG “” #也可以后面定义为空,这样就禁掉了该CONFIG命令 Redis限制相关配置 maxclients 10000 #限制最大客户端连接数 maxmemory <bytes> #设定最大内存使用数,单位是byte maxmmory-policy volatile-lru #指定内存移除规则 maxmemory-samples 3 #LRU算法和最小TTL算法都并非是精确的算法,而是估算值。所以你可以设置样本的大小。假如redis默认会检查三个key并选择其中LRU的那个,那么你可以改变这个key样本的数量。 Redis AOF持久化相关配置 appendonly no #如果是no,则开启aof持久化 appendfilename “appendonly.aof” # 指定aof文件名字 appendfsync everysec #指定fsync()调用模式,有三种no(不调用fsync),always(每次写都会调用fsync),everysec(每秒钟调用一次fsync)。第一种最快,第二种数据最安全,但性能会差一些,第三种为这种方案,默认为第三种。 no-appendfsync-on-rewrite no # 设置yes,可避免当写入量非常大时的磁盘io阻塞 auto-aof-rewrite-percentage 10 #规定什么情况下会触发aof重写。该值为一个比例,10表示当aof文件增幅达到10%时则会触发重写机制。 uto-aof-rewrite-min-size 64mb #重写会有一个条件,就是不能低于64Mb Redis慢日志相关配置 针对慢日志,你可以设置两个参数,一个是执行时长,单位是微秒,另一个是慢日志的长度。当一个新的命令被写入日志时,最老的一条会从命令日志队列中被移除。 slowlog-log-slower-than 10000 #慢于10000ms则记录日志 slowlog-max-len 128 #日志长度
5.制作启动脚本,并设置为开机启动
cp /usr/local/src/redis-2.8.21/utils/redis_init_script /etc/init.d/redis
REDISPORT=6379
EXEC=/usr/local/redis/bin/redis-server
CLIEXEC=/usr/local/redis/bin/redis-cli
PIDFILE=/usr/local/redis/var/run/redis_${REDISPORT}.pid
CONF="/usr/local/redis/etc/redis.conf"
chmod 755 /etc/init.d/redis
chkconfig --add redis
chkconfig redis on
6.创建redis用户
useradd -s /sibn/nologin redis
7.创建其他需要的目录
/etc/init.d/redis start -----启动redis服务
两台服务器: master (192.168.31.105) 和 slave (192.168.31.112) 分别按照之前介绍的步骤安装好redis并启动 master 配置文件不用动 slave 配置文件上加一行 slaveof 192.168.31.105 6379 masterauth passwd //如果主上设置了密码,要加这行 分别启动master和slave 测试redis主从 master上: redis-cli >set k1 v1 >get k1 "v1" slave上: redis-cli >get k1 "v1" Redis主从其他相关配置 slave-read-only yes //让从只读 repl-ping-slave-period 10 //设置slave向master发起ping的频率,每10s发起一次repl-timeout 60 //设置slave ping不通master多少s后就超时 repl-disable-tcp-nodelay no //是否开启tcp_nodelay,开启后将会使用更少的带宽,但会有延迟,所以建议关闭 repl-backlog-size 1mb //同步队列的长度,backuplog是master的一个缓冲区,主从断开后,master会先把数据写到缓冲区,slave再次连接会从缓冲区中同步数据 repl-backlog-ttl 3600 //主从断开后,缓冲区的有效期,默认1小时 slave-priority 100 //多个slave是可以设置优先级的,数值越小优先级越高,应用于集群中,支持slave切换为master,优先级最高的才会切换 min-slaves-to-write 3 //和下面的一起使用,它的意思是master发现有超过3个slave的延迟高于10s,那么master就会暂时停止写操作。这两个数值任何一个为0,则关闭该功能,默认第一数值是0。 min-slaves-max-lag 10