一、Redis简介
Redis 是一个高性能的key-value数据库。redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富。有字符串,链表,集合和有序集合。支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能。所以Redis也可以被看成是一个数据结构服务器。
Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”);也可以把每一次数据变化都写入到一个append only file(aof)里面(这称为“全持久化模式”)。它提供Python,Ruby,Erlang,PHP客户端,使用很方便。问题是这个项目还很新,可能还不足够稳定,而且没有在实际的一些大型系统应用的实例。此外,缺乏mc中批量get也是比较大的问题,始终批量获取跟多次获取的网络开销是不一样的。
二、Redis的安装
1、编译安装
1
2
3
4
5
6
<code># wget http://download.redis.io/releases/redis-2.8.17.tar.gz</code>
<code># tar xf redis-2.8.17.tar.gz </code>
<code># cd redis-2.8.17</code>
<code># make</code>
<code># make test </code>
<code># make install</code>
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<code>[root@Redis redis-2.8.17]# make test</code>
<code>cd src && make test</code>
<code>make[1]: Entering directory `/root/redis/redis-2.8.17/src'</code>
<code>You need tcl 8.5 or newer in order to run the Redis test</code>
<code>make[1]: *** [test] 错误 1</code>
<code>make[1]: Leaving directory `/root/redis/redis-2.8.17/src'</code>
<code>make: *** [test] 错误 2</code>
<code>解决方法:</code>
<code>http:</code><code>//www.linuxfromscratch.org/blfs/view/cvs/general/tcl.html</code>
<code>////////////////////////没有明白这个包为什么会这么安装,那么麻烦///////////////////////</code>
<code># tar xf tcl8.6.2-src.tar.gz </code>
<code># cd tcl8.6.2</code>
<code># export SRCDIR=`pwd` &&</code>
<code>cd unix &&</code>
<code>./configure --prefix=/usr \</code>
<code> </code><code>--without-tzdata \</code>
<code> </code><code>--mandir=/usr/share/man \</code>
<code> </code><code>$([ $(uname -m) = x86_64 ] && echo --enable-64bit) &&</code>
<code>make &&</code>
<code>sed -e </code><code>"s#$SRCDIR/unix#/usr/lib#"</code> <code>\</code>
<code> </code><code>-e </code><code>"s#$SRCDIR#/usr/include#"</code> <code>\</code>
<code> </code><code>-i tclConfig.sh &&</code>
<code>sed -e </code><code>"s#$SRCDIR/unix/pkgs/tdbc1.0.1#/usr/lib/tdbc1.0.0#"</code> <code>\</code>
<code> </code><code>-e </code><code>"s#$SRCDIR/pkgs/tdbc1.0.1/generic#/usr/include#"</code> <code>\</code>
<code> </code><code>-e </code><code>"s#$SRCDIR/pkgs/tdbc1.0.1/library#/usr/lib/tcl8.6#"</code> <code>\</code>
<code> </code><code>-e </code><code>"s#$SRCDIR/pkgs/tdbc1.0.1#/usr/include#"</code> <code>\</code>
<code> </code><code>-i pkgs/tdbc1.0.1/tdbcConfig.sh &&</code>
<code>sed -e </code><code>"s#$SRCDIR/unix/pkgs/itcl4.0.1#/usr/lib/itcl4.0.0#"</code> <code>\</code>
<code> </code><code>-e </code><code>"s#$SRCDIR/pkgs/itcl4.0.1/generic#/usr/include#"</code> <code>\</code>
<code> </code><code>-e </code><code>"s#$SRCDIR/pkgs/itcl4.0.1#/usr/include#"</code> <code>\</code>
<code> </code><code>-i pkgs/itcl4.0.1/itclConfig.sh &&</code>
<code>unset SRCDIR</code>
<code># make install &&</code>
<code>make install-</code><code>private</code><code>-headers &&</code>
<code>ln -v -sf tclsh8.6 /usr/bin/tclsh &&</code>
<code>chmod -v 755 /usr/lib/libtcl8.6.so</code>
<code># mkdir -v -p /usr/share/doc/tcl-8.6.2 &&</code>
<code>cp -v -r ../html/* /usr/share/doc/tcl-8.6.2</code>
<code>////////////////////////////////////////////////////////////////////////////////////////////////</code>
2、拷贝redis配置文件
<code># mkdir /etc/redis</code>
<code># cp /root/redis/redis-2.8.17/redis.conf /etc/redis/</code>
3、建立redis服务启动用户
<code># useradd -s /sbin/nologin redis</code>
4、简单的修改常用的配置选项
<code># vim /etc/redis/redis.conf </code>
<code>daemonize yes #redis以守护进程的方式运行,no表示不以守护进程的方式运行(会占用一个终端)</code>
<code>timeout 300 #客户端闲置多长时间后断开连接,默认为0关闭此功能</code>
<code>loglevel verbose #设置redis日志级别</code>
<code>logfile stdout #设置日志文件的输出方式,如果以守护进程的方式运行redis并且日志输出设置为stdout,那么日志信息就输出到/dev/null里面去了</code>
5、提供redis的SysV脚本
注意:用这个脚本管理之前,需要先配置下面的内核参数,否则Redis脚本在重启或停止redis时,将会报错,并且不能自动在停止服务前同步数据到磁盘上
<code># echo "vm.overcommit_memory = 1" >>/etc/sysctl.conf</code>
<code>此参数可用的值为0,1,2</code>
<code> </code><code>0表示当用户空间请求更多的内存时,内核尝试估算出可用的内存</code>
<code> </code><code>1表示内核允许超量使用内存直到内存用完为止</code>
<code> </code><code>2表示整个内存地址空间不能超过swap+(vm.overcommit_ratio)%的RAM值</code>
<code># sysctl -p #立刻生效</code>
# vim /etc/init.d/redis
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<code>#!/bin/bash </code>
<code># </code>
<code># Init file for redis </code>
<code># chkconfig: - 80 12 </code>
<code># description: redis daemon </code>
<code># processname: redis </code>
<code># config: /etc/redis.conf </code>
<code># pidfile: /var/run/redis.pid </code>
<code>source /etc/init.d/functions</code>
<code>#BIN="/usr/local/bin" </code>
<code>BIN=</code><code>"/usr/local/bin"</code>
<code>CONFIG=</code><code>"/etc/redis/redis.conf"</code>
<code>PIDFILE=</code><code>"/var/run/redis.pid"</code>
<code>### Read configuration </code>
<code>[ -r </code><code>"$SYSCONFIG"</code> <code>] && source </code><code>"$SYSCONFIG"</code>
<code>RETVAL=0</code>
<code>prog=</code><code>"redis-server"</code>
<code>desc=</code><code>"Redis Server"</code>
<code>start() {</code>
<code> </code><code>if</code> <code>[ -e $PIDFILE ];then</code>
<code> </code><code>echo </code><code>"$desc already running...."</code>
<code> </code><code>exit</code> <code>1</code>
<code> </code><code>fi</code>
<code> </code><code>echo -n $</code><code>"Starting $desc: "</code>
<code> </code><code>daemon $BIN/$prog $CONFIG</code>
<code> </code><code>RETVAL=$?</code>
<code> </code><code>echo </code>
<code> </code><code>[ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog</code>
<code> </code><code>return</code> <code>$RETVAL</code>
<code>}</code>
<code>stop() {</code>
<code> </code><code>echo -n $</code><code>"Stop $desc: "</code>
<code> </code><code>killproc $prog</code>
<code> </code><code>[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog $PIDFILE</code>
<code>restart() {</code>
<code> </code><code>stop</code>
<code> </code><code>start</code>
<code>case</code> <code>"$1"</code> <code>in</code>
<code> </code><code>start)</code>
<code> </code><code>;;</code>
<code> </code><code>stop)</code>
<code> </code><code>restart)</code>
<code> </code><code>restart</code>
<code> </code><code>condrestart)</code>
<code> </code><code>[ -e /var/lock/subsys/$prog ] && restart</code>
<code> </code><code>status)</code>
<code> </code><code>status $prog</code>
<code> </code><code>*)</code>
<code> </code><code>echo $</code><code>"Usage: $0 {start|stop|restart|condrestart|status}"</code>
<code> </code><code>RETVAL=1</code>
<code>esac</code>
<code>exit</code> <code>$RETVAL</code>
增加为服务列表并设置开机启动
<code># chmod +x /etc/init.d/redis </code>
<code># chkconfig --add redis</code>
<code># chkconfig --level 345 redis on</code>
6、启动redis服务
<code># redis-server</code>
<code># redis-server /etc/redis/redis.conf &</code>
<code># service redis start</code>
7、查看redis服务监听的地址和端口
<code># netstat -tnlp |grep redis</code>
<code>tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 25350/redis-server</code>
三、客户端测试Redis服务
<code>第一种方法:通过redis客户端命令redis-cli</code>
<code># redis-cli </code>
<code># redis-cli -h 192.168.1.127 -p 6379</code>
<code>127.0.0.1:6379> set name zhengyansheng</code>
<code>OK</code>
<code>127.0.0.1:6379> get name</code>
<code>"zhengyansheng"</code>
<code>127.0.0.1:6379> quit</code>
<code># redis-cli set mykey 'hello world!'</code>
<code># redis-cli get mykey</code>
<code>"hello world!"</code>
<code># redis-cli type mykey</code>
<code>string</code>
<code># redis-cli strlen mykey</code>
<code>(integer) 12</code>
<code>第二种方法:通过telnet方法</code>
<code># telnet 127.0.0.1 6379</code>
<code>Trying 127.0.0.1...</code>
<code>Connected to 127.0.0.1.</code>
<code>Escape character is </code><code>'^]'</code><code>.</code>
<code>set test </code><code>"Welcome to BeiJing."</code>
<code>+OK</code>
<code>get test</code>
<code>$19</code>
<code>Welcome to BeiJing.</code>
<code>strlen</code> <code>test</code>
<code>:19</code>
<code>quit</code>
<code>Connection closed by foreign host.</code>
四、phpredis扩展安装
1、下载phpredis扩展包
<code>wget https:</code><code>//github.com/nicolasff/phpredis/archive/master.zip</code>
2、安装phpredis扩展
<code># unzip phpredis-master.zip </code>
<code># cd phpredis-master</code>
<code># /usr/local/php/bin/phpize </code>
<code># ./configure --with-php-config=/usr/local/php/bin/php-config </code>
<code># make </code>
<code>#安装完成后会输出一下信息,提示redis.so生成的目录路径</code>
<code>Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/</code>
3、添加redis扩展
<code># vim /usr/local/php/etc/php.ini </code>
<code>添加一行</code>
<code>extension = </code><code>"redis.so"</code>
4、重启nginx服务
<code># service nginx restart</code>
5、访问phpinfo查看redis扩展的详细信息
<a href="http://s3.51cto.com/wyfs02/M02/4C/7E/wKiom1Q-gEeB_aOQAABpXOd0WbI218.jpg" target="_blank"></a>
四、Redis的用户认证
redis没有实现访问控制这个功能,但是它提供了一个轻量级的认证方式,可以编辑redis.conf配置来启用认证。
Redis的用户认证有两种方法
1、临时的用户认证口令
2、永久的用户认证口令
<code>临时设置Redis用户认证,重新启动Redis服务后就会失效</code>
<code>[root@Redis ~]# redis-cli </code>
<code>127.0.0.1:6379> config set requirepass zhengyansheng</code>
<code>127.0.0.1:6379> config get requirepass</code>
<code>(error) NOAUTH Authentication required.</code>
<code>127.0.0.1:6379> auth zhengyansheng</code>
<code>1) "requirepass"</code>
<code>2) "zhengyansheng"</code>
<code>#重启Redis服务</code>
<code>[root@Redis ~]# service redis restart</code>
<code>Stop Redis Server: [确定]</code>
<code>Starting Redis Server: [确定]</code>
<code>#再次认证是否还要认证?</code>
<code>[root@Redis ~]# redis-cli</code>
<code>127.0.0.1:6379> set name tomcat</code>
<code>"tomcat"</code>
<code>永久设置Redis用户,重启动Redis服务后依然生效</code>
<code>1、设置Redis密码</code>
<code>requirepass zhengyansheng13260071987</code>
<code>2、重新加载Redis服务</code>
<code># service redis restart</code>
<code>3、登陆Redis访问测试</code>
<code>(error) NOAUTH Authentication required. #错误:提示没有认证通过</code>
<code>127.0.0.1:6379> auth zhengyansheng13260071987 #采用认证方式</code>
五、与Memcache的比较
memcache和redis都是内存型数据库,数据保存在内存中,通过tcp直接存取,memcached优势是速度快,并发高,缺点是数据类型有限,查询功能不强,一般用作缓存。在我们团队的项目中,一开始用的是memcached,后来用redis替代。
相比memcached:
1、redis具有持久化机制,可以定期将内存中的数据持久化到硬盘上。
2、redis具备binlog功能,可以将所有操作写入日志,当redis出现故障,可依照binlog进行数据恢复。
3、redis支持virtual memory,可以限定内存使用大小,当数据超过阈值,则通过类似LRU的算法把内存中的最不常用数据保存到硬盘的页面文件中。
4、redis原生支持的数据类型更多,使用的想象空间更大。
5、前面有位朋友所提及的一致性哈希,用在redis的sharding中,一般是在负载非常高需要水平扩展时使用。我们还没有用到这方面的功能,一般的项目,单机足够支撑并发了。redis 3.0将推出cluster,功能更加强大
六、redis-clie的命令行参数
<code>SET 创建一个key;</code>
<code>GET 获取一个key的值;</code>
<code>DEL ***一个key;</code>
<code>TYPE 获取一个key的类型;</code>
<code>EXISTS 判断一个key是否存在,</code><code>0</code><code>:存在,</code><code>1</code><code>,不存在;</code>
<code>KEYS 获取给定模糊匹配的key;</code>
<code>EXPIRE 设置一个key过期的秒数;</code>
<code>PERSTST ***一个key过期的秒数;</code>
<code>PEXPIRE 设置一个key过期的毫秒数;</code>
<code>RENAME 将一个key重命名;</code>
<code>RENAMENX 将一个key重命名,且新的key必须是不存在的可以;</code>
<code>TTL 获取key的有效时间;</code>
<code></code>
本文转自zys467754239 51CTO博客,原文链接:http://blog.51cto.com/467754239/1564581,如需转载请自行联系原作者