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特性

一、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.创建其他需要的目录

 

mkdir /usr/local/redis/var

 

chmod 777 /usr/local/redis/var

 

/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
redis主从配置