License: Attribution-NonCommercial-ShareAlike 4.0 International
本文出自 Suzf Blog。 如未注明,均为 SUZF.NET 原创。
转载请注明:http://suzf.net/post/616
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][root@master01 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