Fork me on GitHub
Suzf  Blog

Redis 安装与特性简述

Redis< Remote Dictionary Server  >作为NoSQL数据库的一种应用,响应速度和命中率上还是比较高效的。
项目中需要用集中式可横向扩展的缓存框架,做了一点调研,即便redis、memcached存在效率上的差异(具体比较参考http://timyang.net/data/mcdb-tt-redis/),但其实都能满足目前项目的需求;但是redis还是比较风骚的,支持链表和集合操作,支持正则表达式查找key,目前项目缓存的结果大多是链表,如果链表新增或者修改数据的话,redis就体现出了极大的优势(memcached只能重新加载链表,redis可以对链表新增或者修改)

到目前为止Redis 支持的数据类型如下:

-- 字符串类型
-- 散列类型
-- 列表类型
-- 集合类型
-- 有序集合类型

1. Redis 安装
== Redis 源码安装
-- 参照源码 README
-- 默认端口 6379

*** 安装redis之前先要确认系统已经安装了GCC和libc库 ***

wget http://download.redis.io/releases/redis-3.0.7.tar.gz
tar xf redis-3.0.7.tar.gz
cd redis-3.0.7
make
# make test
make PREFIX=/usr/local/redis install

== 可执行命令
redis-server    Redis服务系统
redis-cli       Redis一个客户端管理工具
redis-benchmark 用来检测redis性能
redis-check-aof & redis-check-dump 用来处理损坏的数据文件
redis-sentinel -> redis-server   < soft link >

cd utils
./install_server.sh

^_^[15:50:34][[email protected] utils]#bash install_server.sh
Welcome to the redis service installer
This script will help you easily set up a running redis server

Please select the redis port for this instance: [6379] 1111
Please select the redis config file name [/etc/redis/1111.conf]
Selected default - /etc/redis/1111.conf
Please select the redis log file name [/var/log/redis_1111.log]
Selected default - /var/log/redis_1111.log
Please select the data directory for this instance [/var/lib/redis/1111]
Selected default - /var/lib/redis/1111
Please select the redis executable path [/usr/sbin/redis-server] /usr/local/redis/bin/redis-server
Selected config:
Port           : 1111
Config file    : /etc/redis/1111.conf
Log file       : /var/log/redis_1111.log
Data dir       : /var/lib/redis/1111
Executable     : /usr/local/redis/bin/redis-server
Cli Executable : /usr/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/1111.conf => /etc/init.d/redis_1111
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!

2. 系统配置
设置内存分配策略(可选,根据服务器的实际情况进行设置)
/proc/sys/vm/overcommit_memory
可选值:0、1、2。
0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2, 表示内核允许分配超过所有物理内存和交换空间总和的内存

值得注意的一点是,redis在dump数据的时候,会fork出一个子进程,理论上child进程所占用的内存和parent是一样的,比如parent占用的内存为8G,这个时候也要同样分配8G的内存给child,如果内存无法负担,往往会造成redis服务器的down机或者IO负载过高,效率下降。所以这里比较优化的内存分配策略应该设置为 1(表示内核允许分配所有的物理内存,而不管当前的内存状态如何)

防火墙开启redis端口

加入端口配置
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 1111 -j ACCEPT  # < redis instance port >

写入配置文件
iptables-save > /etc/sysconfig/iptables

3. 启动redis服务
/etc/init.d/redis_1111  start

4. 测试redis
#redis-cli  -p 1111
redis 127.0.0.1:1111> set name suzf.net
OK
redis 127.0.0.1:1111> get name
"suzf.net"

客户端连接验证
#redis-cli -p 1111 ping
PONG

5. 关闭redis服务
停止Redis
/etc/init.d/redis_1111  stop

关闭指定端口的redis-server
redis-cli -p 1111 shutdown

redis服务关闭后,缓存数据会自动dump到硬盘上,硬盘地址为redis.conf中的配置项dbfilename dump.rdb所设定
强制备份数据到磁盘,使用如下命令

redis-cli save
redis-cli -p 111 save(指定端口)

6. Redis 常用命令
info #查看server版本内存使用连接等信息

client list #获取客户连接列表

client kill 127.0.0.1:33441 #终止某个客户端连接

dbsize #当前保存key的数量

save #立即保存数据到硬盘

bgsave #异步保存数据到硬盘

flushdb #当前库中移除所有key

flushall #移除所有key从所有库中

lastsave #获取上次成功保存到硬盘的unix时间戳

monitor #实时监测服务器接收到的请求

slowlog len #查询慢查询日志条数

slowlog get #返回所有的慢查询日志,最大值取决于slowlog-max-len配置

slowlog get 2 #打印两条慢查询日志

slowlog reset #清空慢查询日志信息

7. Redis与Mongodb 多数据库 区别

redis数据库

redis的数据库个数,在配置文件中设定死了,并且名称是不允许改的。
databases 16     //默认16个数据库

这16个数据库编号是0-15,如果没有切换数据库的话,默认是0号数据库.

    #redis-cli 
    redis 127.0.0.1:6379> set test 111
    OK
    redis 127.0.0.1:6379> select 1
    OK
    redis 127.0.0.1:6379[1]> set test 222
    OK
    redis 127.0.0.1:6379[1]> get test
    "222"
    redis 127.0.0.1:6379[1]> select 0
    OK
    redis 127.0.0.1:6379> get test
    "111"
    redis 127.0.0.1:6379>

数据库间相同的key,相互不受影响。

mongodb数据库
mongodb非常像关系型数据库,与redis不同的是,mongodb不用事先定义多少个数据库,数据库名也是自定义的。限制比redis少。

    #mongo
    MongoDB shell version: 2.4.14
    connecting to: test
    > use Fern     // 如果数据库不存在会自动创建
    switched to db Fern