简介


Redis是个非常不错的开源软件,key-value存储,数据完全内存中,虽是单进程,由于其采用异步非阻塞IO操作,性能表现非凡。
虽然Redis的使用已经很广泛了,但考虑到可能有一些朋友没有使用过,还是写一些基础的,安装过程,应用场景类的文章。

特性


数据结构丰富: string, hash, list, set, sortedSst, bitmap
持久化:有2种持久方式 RDB,AOF
速度快:数据存于内存中
主从复制:异步复制,支持部署方式 M ->S, M ->S ->S
发布/订阅:轻量级MQ
支持key过期自动失效
支持简单的事务
单进程,原子性操作,setnx expire 可作为分布式锁

Reis安装


Redis安装是在 CentOS release 6.4 64bit 安装的,过程非常简单。

下载安装文件


1
2
3
cd /data/apps

wget http://download.redis.io/releases/redis-3.0.7.tar.gz

解压安装


1
2
3
4
5
tar xzf redis-3.0.7.tar.gz 

cd redis-3.0.7

make

copy安装后生成的bin‘文件


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mkdir -p  /data/apps/redis-3.0.7_6379/bin
mkdir -p /data/apps/redis-3.0.7_6379/data


cd /data/apps/redis-3.0.7/src

cp -rfp redis-benchmark /data/apps/redis-3.0.7_6379/bin/redis-benchmark
cp -rfp redis-check-aof /data/apps/redis-3.0.7_6379/bin/redis-check-aof
cp -rfp redis-check-dump /data/apps/redis-3.0.7_6379/bin/redis-check-dump
cp -rfp redis-cli /data/apps/redis-3.0.7_6379/bin/redis-cli
cp -rfp redis-sentinel /data/apps/redis-3.0.7_6379/bin/redis-sentinel
cp -rfp redis-server /data/apps/redis-3.0.7_6379/bin/redis-server

cd /data/apps/redis-3.0.7
cp -rfp redis.conf /data/apps/redis-3.0.7_6379/redis.conf
cp -rfp sentinel.conf /data/apps/redis-3.0.7_6379/sentinel.conf

启动服务


1
2
3
cd /data/apps/redis-3.0.7_6379/bin

./redis-server /data/apps/redis-3.0.7_6379/redis.conf

如果看到这个图,说明启动成功

查看大图
由于redis默认不是以后台模式启动的,需要修改配置下。
找到这一行 daemonize no

修改为 daemonize yes

然后重新启动就可以了。

客户端连接使用. redis 默认使用 6379端口,不设置密码,客户端使用比较简单


1
2
3
4
5
6
7
8
cd /data/apps/redis-3.0.7_6379/bin

[root@localhost bin]# ./redis-cli
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379>

其他的命令可以参考 http://redis.io/commands 使用。更复杂的操作,需要自己去查阅官方文档了。

Redis所在OS的内核优化


在Redis启动的时候,打印出来一句话“WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add ‘vm.overcommit_memory = 1’ to /etc/sysctl.conf and then reboot or run the command ‘sysctl vm.overcommit_memory=1’ for this to take effect.”

也就是说当Redis执行BGSAVE时可能由于内存不够用导致失败,需要调整 vm.overcommit_memory = 1 。 需要做如下操作:

1
2
3
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
sysctl -p

redis运用场景


其实这里有好多要说,就我们自己的业务来说使用非常广泛,我先简单列一下:

过期key会自动删除,命令expire


这个是比较常用的,比如每日任务,key存储用户完成的任务ID,今日完成后,就标示已完成,key的失效时间设置成明日凌晨失效。

计数器使用


统计访问次数,限制用户访问次数等都可以利用此特性

实时排行榜


以前未使用redis之前,排行榜根本无法做到实时,基本是5分钟扫描统计。
直接使用SortedSet,就可以轻松来做排行榜数据

最新文章


这个是使用list类型,lpush和ltrim结合,可以保存最新的某个区间的数据。
LTRIM 命令通常和 LPUSH 命令或 RPUSH 命令配合使用,举个例子:
1
2
LPUSH log newest_log
LTRIM log 0 99

这个例子模拟了一个日志程序,每次将最新日志 newest_log 放到 log 列表中,并且只保留最新的 100 项。注意当这样使用 LTRIM 命令时,时间复杂度是O(1),因为平均情况下,每次只有一个元素被移除。

pub/sub


Redis可以作为MQ来使用,消息的发布和订阅。
注意:此特性是“forget”模式,Redis不存储消息,当Consumer端出问题时,消息就会丢失

作为MySQL的一个补充


可以存储业务数据,作为关系型数据库的一个补充,但前提要开启持久化,不然重启后数据就丢掉了。

分布式锁


主要是 setnx 和 expire 相结合使用。

配置服务


可以作为一个配置中心来使用,存储配置信息。

Lua


Redis支持Lua脚本,编写若干命令组合为一个小型的非阻塞事务或者更新逻辑。
当然其应用远不止上面这些点,等待着我们去挖掘。