关于redis

来源:互联网 发布:基恩士plc编程指令大全 编辑:程序博客网 时间:2024/05/13 03:14

Redis是一个key-value存储系统。和Memcached类似,但是解决了断电后数据完全丢失的情况,而且她支持更多无化的value类型,除了和string外,还支持lists(链表)、sets(集合)和zsets(有序集合)几种数据类型。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。

2.Redis的性能
3.安装Redis

Redis的代码遵循ANSI-C编写,可以在所有POSIX系统(如Linux, *BSD, Mac OS X, Solaris等)上安装运行。而且Redis并不依赖任何非标准库,也没有编译参数必需添加。redis的安装出奇的简单,这可能也是他风靡的一个原因,让人很容易上手,不像某些东西,编译阶段就能让人完全绝望。

先去官网下载源码:

wget http://redis.googlecode.com/files/redis-2.4.6.tar.gz

解压:

tar –zxvf redis-2.4.6.tar.gz

编译

需要说明的事,redis的安装非常简单,已经有现成的Makefile文件,直接运行make命令即可。

make

make install

Redis 由四个可执行文件:redis-benchmarkredis-cliredis-serverredis-stat 这四个文件,加上一个redis.conf就构成了整个redis的最终可用包。它们的作用如下:

  • redis-server:Redis服务器的daemon启动程序

  • redis-cli:Redis命令行操作工具。当然,你也可以用telnet根据其纯文本协议来操作

  • redis-benchmark:Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能

  • redis-stat:Redis状态检测工具,可以检测Redis当前状态参数及延迟状况

现在就可以启动redis了,redis只有一个启动参数,就是他的配置文件路径。

redis-server /etc/redis.conf 

关闭redis

 /usr/local/redis/redis-cli -h 127.0.0.1 -p 6379 shutdown 关闭redis服务器,关闭时一定要指定好药关闭的redis服务器的ip和port.

注意,默认复制过去的redis.conf文件的daemonize参数为no,所以redis不会在后台运行,这时要测试,我们需要重新

开一个终端。修改为yes则为后台运行redis。另外配置文件中规定了pid文件,log文件和数据文件的地址,如果有需要先修

改,默认log信息定向到stdout.

下面是redis.conf的主要配置参数的意义:

  • daemonize:是否以后台daemon方式运行

  • pidfile:pid文件位置

  • port:监听的端口号

  • timeout:请求超时时间

  • loglevel:log信息级别

  • logfile:log文件位置

  • databases:开启数据库的数量

  • save * *:保存快照的频率,第一个*表示多长时间,第三个*表示执行多少次写操作。在一定时间内执行一定数量的写操作时,自动保存快照。可设置多个条件。

  • rdbcompression:是否使用压缩

  • dbfilename:数据快照文件名(只是文件名,不包括目录)

  • dir:数据快照的保存目录(这个是目录)

  • appendonly:是否开启appendonlylog,开启的话每次写操作会记一条log,这会提高数据抗风险能力,但影响效率。

  • appendfsync:appendonlylog如何同步到磁盘(三个选项,分别是每次写都强制调用fsync、每秒启用一次fsync、不调用fsync等待系统自己同步)

这时你可以打开一个终端进行测试了,配置文件中默认的监听端口是6379

我们可以开启一个Redis客户端进行测试

[root@SNDA-192-168-1-114 ~]# redis-cli 
Could not connect to Redis at 127.0.0.1:6379: Connection refused 
not connected> exit 
[root@SNDA-192-168-1-114 ~]# redis-server /etc/redis.conf 
[root@SNDA-192-168-1-114 ~]# redis-cli 
redis 127.0.0.1:6379> quit

4.redis数据结构

redis 的作者antirez曾称其为一个数据结构服务器(data structures server),这是一个非常准确的表述,redis的所有功能就是将数据以其固有的几种结构保存,并提供给用户操作这几种结构的接口。我们可以想象我们在各种语言中的那些固有数据类型及其操作。

redis目前提供四种数据类型:string,list,setzset(sorted set)和Hash

  • string是最简单的类型,你可以理解成与Memcached一模一个的类型,一个key对应一个value,其上支持的操作与Memcached的操作类似。但它的功能更丰富。

  • list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等。操作中key理解为链表的名字。

  • set是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合求交并差等操作。操作中key理解为集合的名字。

  • zset是set的一个升级版本,他在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。可以理解了有两列的mysql表,一列存value,一列存顺序。操作中key理解为zset的名字。

  • Hash数据类型允许用户用Redis存储对象类型,Hash数据类型的一个重要优点是,当你存储的数据对象只有很少几个key值时,数据存储的内存消耗会很小.更多关于Hash数据类型的说明请

5.redis数据存储

redis的存储分为内存存储、磁盘存储和log文件三部分,配置文件中有三个参数对其进行配置。

save seconds updatessave配置,指出在多长时间内,有多少次更新操作,就将数据同步到数据文件。这个可以多个条件配合,比如默认配置文件中的设置,就设置了三个条件。

appendonly yes/no appendonly配置,指出是否在每次更新操作后进行日志记录,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面的save条件来同步的,所以有的数据会在一段时间内只存在于内存中。

appendfsync no/always/everysec appendfsync配置,

no表示等操作系统进行数据缓存同步到磁盘

always表示每次更新操作后手动调用

fsync()将数据写到磁盘,

everysec表示每秒同步一次。

6.redis主从配置

redis支持master-slave的主从配置,配置方法是在从机的配置文件中指定slaveof参数为主机的ip和port即可




Redis和Memcache的区别分析

2013-11-07 09:59:17|  分类: php |  标签:redis  memcache  区别  缓存  高级缓存  |举报|字号 订阅

1. Redis中,并不是所有的数据都一直存储在内存中的,这是和Memcached相比一个最大的区别。

2. Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。

3. Redis支持数据的备份,即master-slave模式的数据备份。

4. Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。

Redis在很多方面具备数据库的特征,或者说就是一个数据库系统,而Memcached只是简单的K/V缓存



1、 Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过memcache还可用于缓存其他东西,例如图片、视频等等。

2、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。

3、虚拟内存--Redis当物理内存用完时,可以将一些很久没用到的value 交换到磁盘

4、过期策略--memcache在set时就指定,例如set key1 0 0 8,即永不过期。Redis可以通过例如expire 设定,例如expire name 10

5、分布式--设定memcache集群,利用magent做一主多从;redis可以做一主多从。都可以一主一从

6、存储数据安全--memcache挂掉后,数据没了;redis可以定期保存到磁盘(持久化)

7、灾难恢复--memcache挂掉后,数据不可恢复; redis数据丢失后可以通过aof恢复

8、Redis支持数据的备份,即master-slave模式的数据备份。




redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便。问题是这个项目还很新,可能还不足够稳定,而且没有在实际的一些大型系统应用的实例。此外,缺乏mc中批量get也是比较大的问题,始终批量获取跟多次获取的网络开销是不一样的。

性能测试结果:

SET操作每秒钟 110000 次,GET操作每秒钟 81000 次,服务器配置如下:

Linux 2.6, Xeon X3320 2.5Ghz.

stackoverflow 网站使用 Redis 做为缓存服务器。

安装过程:


Redis是一种高级key-value数据库

它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富。

有字符串,链表,集 合和有序集合。支持在服务器端计算集合的并,交和补集(difference)等,还支持多

种排序功能。所以Redis也可以被看成是一个数据结构服务 器。

Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”);也可以把每一次数据变化都写入到一个append only file(aof)里面(这称为“全持久化模式”)。

一、下载最新版

wget http://redis.googlecode.com/files/redis-2.0.0-rc4.tar.gz

二、解压缩

tar redis-2.0.0-rc4.tar.gz

三、安装C/C++的编译组件(非必须)

apt-get install build-essential

四、编译

cd redis-2.0.0-rc4
make

make命令执行完成后,会在当前目录下生成本个可执行文件,分别是redis-server、redis-cli、redis-benchmark、redis-stat,它们的作用如下:

  • redis-server:Redis服务器的daemon启动程序

  • redis-cli:Redis命令行操作工具。当然,你也可以用telnet根据其纯文本协议来操作

  • redis-benchmark:Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能

  • redis-stat:Redis状态检测工具,可以检测Redis当前状态参数及延迟状况 

在后面会有这几个命令的说明,当然是从网上抄的。。。

五、修改配置文件

/etc/sysctl.conf

添加

vm.overcommit_memory=1

刷新配置使之生效

sysctl vm.overcommit_memory=1 

补充介绍:

 **如果内存情况比较紧张的话,需要设定内核参数:
echo 1 > /proc/sys/vm/overcommit_memory

 内核参数说明如下:

overcommit_memory文件指定了内核针对内存分配的策略,其值可以是0、1、2。


0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。


1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。


2, 表示内核允许分配超过所有物理内存和交换空间总和的内存


 **编辑redis.conf配置文件(/etc/redis.conf),按需求做出适当调整,比如:
daemonize yes #转为守护进程,否则启动时会每隔5秒输出一行监控信息


save 60 1000 #减小改变次数,其实这个可以根据情况进行指定


maxmemory 256000000 #分配256M内存


在我们成功安装Redis后,我们直接执行redis-server即可运行Redis,此时它是按照默认配置来运行的(默认配置甚至不是后台运 行)。我们希望Redis按我们的要求运行,则我们需要修改配置文件,Redis的配置文件就是我们上面第二个cp操作的redis.conf文件,目前 它被我们拷贝到了/usr/local/redis/etc/目录下。修改它就可以配置我们的server了。如何修改?下面是redis.conf的主 要配置参数的意义:

  • daemonize:是否以后台daemon方式运行

  • pidfile:pid文件位置

  • port:监听的端口号

  • timeout:请求超时时间

  • loglevel:log信息级别

  • logfile:log文件位置

  • databases:开启数据库的数量

  • save * *:保存快照的频率,第一个*表示多长时间,第三个*表示执行多少次写操作。在一定时间内执行一定数量的写操作时,自动保存快照。可设置多个条件。

  • rdbcompression:是否使用压缩

  • dbfilename:数据快照文件名(只是文件名,不包括目录)

  • dir:数据快照的保存目录(这个是目录)

  • appendonly:是否开启appendonlylog,开启的话每次写操作会记一条log,这会提高数据抗风险能力,但影响效率。

  • appendfsync:appendonlylog如何同步到磁盘

  • 三个选项,分别是每次写都强制调用fsync、每秒启用一次fsync、不调用fsync等待系统自己同步

 

下面是一个略做修改后的配置文件内容:

daemonize yes
pidfile /usr/local/redis/var/redis.pid
port 6379
timeout 300
loglevel debug
logfile /usr/local/redis/var/redis.log
databases 16
save 900 1
save 300 10
save 60 10000
rdbcompression yes
dbfilename dump.rdb
dir /usr/local/redis/var/
appendonly no
appendfsync always
glueoutputbuf yes
shareobjects no
shareobjectspoolsize 1024

 

将上面内容写为redis.conf并保存到/usr/local/redis/etc/目录下

然后在命令行执行:

1
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

即可在后台启动redis服务,这时你通过

1
telnet 127.0.0.1 6379

即可连接到你的redis服务。

六、启动服务并验证

启动服务器

 

./redis-server 
或 
$redis-server /etc/redis.conf
查看是否成功启动 
$ ps -ef | grep redis   
或 
./redis-cli ping 
PONG

七、启动命令行客户端赋值取值

 

redis-cli set mykey somevalue

 

./redis-cli get mykey

 

八、关闭服务

$ redis-cli shutdown     

#关闭指定端口的redis-server  

$redis-cli -p 6380 shutdown 

九、客户端也可以使用telnet形式连接。

[root@dbcache conf]# telnet 127.0.0.1 6379 
Trying 127.0.0.1... 
Connected to dbcache (127.0.0.1). 
Escape character is '^]'. 
set foo 3 
bar 
+OK 
get foo 
$3 
bar 
^] 
telnet> quit 
Connection closed.


 

1.安装Redis

下载地址http://redis.io/download

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


解压: tar xzf redis-2.6.16.tar.gz


cd redis-2.6.16


编译安装:

make

make install


2、配置Redis


cp redis.conf /etc/redis.conf


vi /etc/redis.conf

修改如下内容:

daemonize yes#是否作为守护进程运行

logfile /dev/null #关闭日志

dir /var/lib/redis/



useradd redis


mkdir -p /var/lib/redis

chown redis.redis /var/lib/redis #db文件放在这里


编辑启动脚本

vi /etc/init.d/redis


#!/bin/bash 

# Init file for redis 

# chkconfig: - 80 12 

# description: redis daemon 

# processname: redis 

# config: /etc/redis.conf 

# pidfile: /var/run/redis.pid 

source /etc/init.d/functions 

#BIN="/usr/local/bin" 

BIN="/usr/local/bin" 

CONFIG="/etc/redis.conf" 

PIDFILE="/var/run/redis.pid" 

### Read configuration 

[ -r "$SYSCONFIG" ] && source "$SYSCONFIG" 

RETVAL=0 

prog="redis-server" 

desc="Redis Server" 

start() { 

if [ -e $PIDFILE ];then 

echo "$desc already running...." 

exit 1 

fi 

echo -n $"Starting $desc: " 

daemon $BIN/$prog $CONFIG 

RETVAL=$? 

echo 

[ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog 

return $RETVAL 

stop() { 

echo -n $"Stop $desc: " 

killproc $prog 

RETVAL=$? 

echo 

[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog $PIDFILE 

return $RETVAL 

restart() { 

stop 

start 

case "$1" in 

start) 

start 

;; 

stop) 

stop 

;; 

restart) 

restart 

;; 

condrestart) 

[ -e /var/lock/subsys/$prog ] && restart 

RETVAL=$? 

;; 

status) 

status $prog 

RETVAL=$? 

;; 

*) 

echo $"Usage: $0 {start|stop|restart|condrestart|status}" 

RETVAL=1 

esac 

exit $RETVAL

######

启动:/etc/init.d/redis start

检查是否启动:ps -ef|grep redis

netstat -nat


也可使用redis-cli

set test test

get test

测试

3、设置开机启动,添加到系统服务中


chmod 775 /etc/init.d/redis


开机启动redis

chkconfig redis on  



即可在后台启动redis服务,这时你通过 1 telnet 127.0.0.1 6379 即可连接到你的redis服务。 六、启动服务并验证 启动服务器 ./redis-server 或 

$redis-server /etc/redis.conf   查看是否成功启动 $ ps -ef | grep redis    或 

./redis-cli ping  

PONG 

七、启动命令行客户端赋值取值  

redis-cli set mykey somevalue  ./redis-cli get mykey   

八、添加到开机启动 

vi /etc/rc.d/rc.local 

redis-server /usr/local/redis/etc/redis.conf   

最后还要开放redis的端口,否则客户端无法连接。方法如下: vi /etc/sysconfig/iptables #需要具备其修改权限 增加一行: # redis 

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT 保存后重启iptables: 

service iptables restart (PATH中加入了/sbin/)或者 /etc/init.d/iptables restart   

九.关闭服务 

[wap@hanqunfeng redis-1.2.6]$ redis-cli shutdown   

 如果端口变化可以指定端口: redis-cli -p 6380 shutdown 

这时内存中的数据会自动写入到硬盘,文件地址是在redis.conf里配置的: dbfilename dump.rdb 

说明:数据备份可以通过定期备份该文件实现。 

另 外,从网上看到说redis不能将内存数据转存到硬盘上,这个问题我也遇到了,后来发现是用户权限的问题,最开始启动redis我使用的root用户,后 来使用wap用户就发现不能将数据写入硬盘,这是因为dump.rdb已经是root权限了,不知道说redis不能存储到硬盘的人是不是和我犯了同样的 错误。 

另外,我发现执行redis-benchmark命令时也会将内存数据写入硬盘。 redis-benchmark:检查当前机器的处理性能。 重启服务后再次取值,取值成功 [wap@hanqunfeng redis-1.2.6]$    




  



[wap@hanqunfeng redis-1.2.6]$ redis-server /etc/redis.conf    New pid: 12797   

[wap@hanqunfeng redis-1.2.6]$ redis-cli get name   value   

强制保存内存数据到硬盘 

因为redis是异步写入磁盘的,如果要让内存中的数据马上写入硬盘可以执行如下命令: redis-cli save 或者 redis-cli -p 6380 save(指定端口) 

注意,以上部署操作需要具备一定的权限,比如复制和设定内核参数等。 ok,redis配置完成。

Redis安装配置完成后,启动过程非常简单,执行命令/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf即可。停止Redis的最简单的方法是在启动实例的session中,直接使用Control-C命令。当然还可以通过客户端来停止服务,如可以用shutdown来停止Redis实例,具体命令为src/redis-cli shutdown。

下面是一个Shell脚本(供参考),用于管理Redis(启动、停止、重启)。为其赋予可执行权限,即可像其他服务一样使用。

#!/bin/sh  #  # redis - this script starts and stops the redis-server daemon  #  # chkconfig:   - 85 15  # description:  Redis is a persistent key-value database  # processname: redis-server  # config:      /usr/local/redis-2.4.X/bin/redis-server  # config:      /usr/local/ /redis-2.4.X/etc/redis.conf  # Source function library.  . /etc/rc.d/init.d/functions  # Source networking configuration.  . /etc/sysconfig/network  # Check that networking is up.  [ "$NETWORKING" = "no" ] && exit 0  redis="/usr/local/webserver/redis-2.4.X/bin/redis-server" prog=$(basename $redis)  REDIS_CONF_FILE="/usr/local/webserver/redis-2.4.X/etc/redis.conf" [ -f /etc/sysconfig/redis ] && . /etc/sysconfig/redis  lockfile=/var/lock/subsys/redis  start() {      [ -x $redis ] || exit 5      [ -f $REDIS_CONF_FILE ] || exit 6      echo -n $"Starting $prog: "      daemon $redis $REDIS_CONF_FILE      retval=$?      echo      [ $retval -eq 0 ] && touch $lockfile      return $retval  }  stop() {      echo -n $"Stopping $prog: "      killproc $prog -QUIT      retval=$?      echo      [ $retval -eq 0 ] && rm -f $lockfile      return $retval  }  restart() {      stop      start  }  reload() {      echo -n $"Reloading $prog: "      killproc $redis -HUP      RETVAL=$?      echo  }  force_reload() {      restart  }  rh_status() {      status $prog  }  rh_status_q() {      rh_status >/dev/null 2>&1  }  case "$1" in      start)          rh_status_q && exit 0          $1          ;;      stop)          rh_status_q || exit 0          $1          ;;      restart|configtest)          $1          ;;      reload)          rh_status_q || exit 7          $1          ;;      force-reload)          force_reload          ;;      status)          rh_status          ;;      condrestart|try-restart)          rh_status_q || exit 0      ;;      *)                       11.2.4  Redis的配置文件详解(1)#daemonize: 默认情况下,Redis不在后台运行,如果需要在后台运行Redis,需要把该项的值更改为yes。#pidfile 在后台运行的时候,Redis默认将pid文件放在/var/run/redis.pid中,也可以设置为其他地址。需要注意的是,当运行多个Redis服务时,需要指定不同的pid文件和端口。#bind 指定Redis只接收来自于该IP地址的请求,如果不进行设置,那么将处理所有请求,在生产环境中最好设置该项参数。#port Redis监听的端口,默认为6379。#timeout 设置客户端连接时的超时时间,单位为秒。若客户端在这段时间内没有发出任何指令,那么就会关闭相应连接。#loglevel log等级分为4级:debug、verbose、notice和warning。生产环境中一般开启notice就足够应对大多状况。#logfile 配置log文件的地址,默认使用标准输出,即打印在命令行终端的窗口上。#databases 设置数据库的个数,可以使用SELECT命令来切换数据库。默认使用的数据库是0。#save  <seconds> <changes> 设置Redis进行数据库备份的频率。指出在某时间内进行多少次更新操作,并将数据同步到数据文件rdb。相当于条件触发抓取快照,可以多条件配合设置。save 900 1  900秒内至少有1个key被改变save 300 10  300秒内至少有300个key被改变save 60 10000  60秒内至少有10000个key被改变这里只是写了一条,如果在86400秒之内有1个keys发生变化时就进行备份。如果没有特别的设定,就是一天一备份。#rdbcompression 设置在进行镜像备份时是否进行压缩。#dbfilename 镜像备份文件的文件名。#dir 数据库镜像备份文件的放置路径。路径跟文件名要分开配置,因为Redis在进行备份时,会先将当前数据库的状态写入一个临时文件,等备份完成时,再把该临时文件替换为所指定的文件,而临时文件和所配置的备份文件都存放在指定路径当中。#slaveof 设置该数据库为其他数据库的从数据库。#masterauth 当主数据库连接需要密码验证时,用该指令指定。#requirepass 设置客户端连接后进行任何其他指定前需要使用的密码。需要注意的是,因为Redis速度相当快,所以在配置比较好的服务器下,外部用户可以在一秒钟内进行150000次的密码尝试,这意味着需要指定非常强大的密码来防止他人进行暴力破解。#maxclients 11.2.4  Redis的配置文件详解(2)限制同时连接的客户数量。当连接数超过这个值时,Redis将不再接收其他连接请求,客户端尝试连接时将收到error信息提示。#maxmemory 设置Redis能够使用的最大内存。当内存被完全占用时,再接收到set命令,Redis将先尝试剔除设置过expire信息的key,而不管该key过期与否,将按照过期时间进行删除,最先过期的key最先被删除。如果带有expire信息的key已被全部删除,那么将返回出错提示,Redis将不再接收写请求,只接收get请求。maxmemory的设置比较适合把redis当作类似memcached的缓存来使用。#appendonly 默认情况下,Redis会在后台异步把数据库镜像备份到磁盘,但是这样备份非常耗时,而且备份也不能很频繁,如果发生断电,将造成大量的数据丢失。所以Redis提供了另外一种更加高效的数据库备份及灾难恢复方式。开启append only模式之后,Redis会把所接收到的每一次写操作请求都追加到appendonly.aof文件中,当Redis重新启动时,会从该文件恢复到之前的状态。但是这样容易造成appendonly.aof文件过大,所以Redis还支持BGREWRITEAOF指令,可以对appendonly.aof文件进行重新整理。#appendfsync 设置对appendonly.aof文件进行同步的频率。always表示每次只要有写操作就进行同步;everysec表示对写操作进行累积,每秒同步一次。可根据实际业务场景自行配置。#vm-enabled 是否开启虚拟内存支持。因为Redis是一个内存数据库,而且当内存满时,无法接收新的写请求,所以Redis 2.X版本提供了虚拟内存支持功能。但是,要注意:Redis将所有的key都放在内存中,当内存不够时,只会把value值放入交换区。这样,虽然使用虚拟内存,但性能基本不受影响。同时,vm-max-memory要设置到足够大才能放下所有的key。#vm-swap-file 设置虚拟内存的交换文件路径。#vm-max-memory 设置开启虚拟内存之后,Redis将使用的最大物理内存的大小,默认为0。Redis将所有的能放到交换文件的内容都放到交换文件中,以尽量减少对物理内存的占用。在生产环境下,需要根据实际情况设置该值,最好不要使用默认的0值。#vm-page-size 设置虚拟内存的页面大小,如果要在value中放置博客、新闻之类的文章内容,就将空间设置大一些;如果要放置的都是很小的内容,则空间设置可以小一点。#vm-pages 设置交换文件的总的页数。需要注意的是,page table信息存放在物理内存中,每8个page就会占据RAM中的1个byte。总的虚拟内存大小为vm-page-size * vm-pages。#vm-max-threads 设置VM、I/O同时使用的线程数量。因为在进行内存交换时,会进行数据编码和解码,所以尽管I/O设备本身不能支持很多的并发读写,如果环境中所保存的vlaue值比较大,那么将该值设置大一些,仍然能够提升其性能。如果该值非零,当主线程检测到使用的内存超过最大上限,会将选中的要交换对象的信息放到一个队列中,并交由工作线程进行后台处理,主线程则继续处理客户端的   请求。如果有客户端请求的key被换出,主线程先阻塞发出命令的客户端,然后将加载对象的信息放到队列中,让工作线程去加载。加载完毕后,工作线程通知主线程,主线程再执行客户端的命令。这种方式只阻塞请求value被换出key的客户端请求。#glueoutputbuf 把较小的输出缓存放在一起,以便能够在一个TCP packet中为客户端发送多个响应。Redis2.X版本引入了hash数据结构。当hash中包含超过指定元素个数并且最大的元素没有超过临界时,hash将以一种特殊的编码方式(大大减少内存使用)来存储,临界值设置参数如下。#hash-max-zipmap-entries  #activerehashing 开启之后,Redis将在每100毫秒时使用1毫秒的CPU时间来对Redis的hash表进行重新hash,以降低内存的使用。生产环境往往有非常严格的实时性要求,如不能够接受Redis时不时对请求有所延迟,可以把这项配置设置为no。如果没有这么严格的实时性要求,可以设置为yes,以便能够尽可能快地释放内存。11.2.5  Redis的管理(1)Redis配置文件一旦写好既无需更改,除非需要再次调整及优化。所以对其操作一般使用命令行的形式。接下来介绍Redis常用的命令-键值相关命令1.ping测试连接是否存活:redis 127.0.0.1:6379> ping  PONG ​执行下面命令之前,停止redis服务器redis 127.0.0.1:6379> ping  Could not connect to Redis at 127.0.0.1:6379: Connection refused 执行下面命令之前,启动redis服务器not connected> ping  PONG  redis 127.0.0.1:6379> 第一次ping时,说明连接正常;第二次ping之前,因为将Redis服务器停止,那么ping是失败的;第三次ping之前,因为将Redis服务器启动,则ping是成功的。2.echo在命令行打印某些内容:redis 127.0.0.1:6379> echo test  "test"  redis 127.0.0.1:6379> 3.select选择数据库。Redis数据库编号为0~15,可以选择任意一个数据库来进行数据存取。redis 127.0.0.1:6379> select 1  OK  redis 127.0.0.1:6379[1]> select 16  (error) ERR invalid DB index  redis 127.0.0.1:6379[16]> 当选择16号数据库时,系统报错,说明没有编号为16的数据库。4.quit退出连接。redis 127.0.0.1:6379> quit  [root@localhost  /]# 5.dbsize返回当前数据库中key的数目。redis 127.0.0.1:6379> dbsize  (integer) 18  redis 127.0.0.1:6379> 结果说明此库中有18个key。6.info获取服务器的信息和统计。redis 127.0.0.1:6379> info  redis_version:2.4.X  redis_git_sha1:00000000  redis_git_dirty:0  arch_bits:32  multiplexing_api:epoll  process_id:28480  uptime_in_seconds:2515  uptime_in_days:0  redis 127.0.0.1:6379> 7.monitor实时转储收到的请求。redis 127.0.0.1:6379> config get dir  1) "dir"  2) "/root/4setup/redis-2.4.X"  redis 127.0.0.1:6379> 11.2.5  Redis的管理(2)8.config get获取服务器配置信息。redis 127.0.0.1:6379> config get dir  1) "dir"  2) "/root/4setup/redis-2.4.X"  redis 127.0.0.1:6379> 这里获取了dir参数配置的值,如果想获取全部参数的配置值,只需执行config get *命令即可将全部的值都显示出来。9.flushdb删除当前数据库中的所有key。redis 127.0.0.1:6379> dbsize  (integer) 18  redis 127.0.0.1:6379> flushdb  OK  redis 127.0.0.1:6379> dbsize  (integer) 0  redis 127.0.0.1:6379> 这里选择清除将0号数据库中的key。10.flushall删除所有数据库中的所有key。redis 127.0.0.1:6379[1]> dbsize  (integer) 1  redis 127.0.0.1:6379[1]> select 0  OK  redis 127.0.0.1:6379> flushall  OK  redis 127.0.0.1:6379> select 1  OK  redis 127.0.0.1:6379[1]> dbsize  (integer) 0  redis 127.0.0.1:6379[1]> 这里首先查看1号数据库中的1个key,然后切换到0号数据库执行flushall命令,结果1号库中的key也被清除了。以上是对Redis的一些基本操作,一般只需查看其运行情况即可。如对其有所操作,大多开发来做。也可以自己写客户端来进行测试。下面介绍Redis各类型的基本操作1.strings类型及操作string类型是二进制安全的。即Redis的string可以包含任何数据,比如jpg图片文件或序列化的对象。从内部实现过程来看,其实string可以看作byte数组,最大上限是1GB,定义如下:struct sdshdr {   long len;   long free;   char buf[];   };  len是buf数组的长度。free是数组中剩余的可用字节数,由此可以理解为什么string类型是二进制安全的了,因为它本质上就是个byte数组,可以包含任何数据。buf是char数组,用于存贮实际的字符串内容。其实char和C#中的byte是等价的,都是一个字节。另外string类型可以被部分命令按int处理,比如incr等命令。如果只用string类型,Redis就可以被看作具有持久化特性的Memcached。当然Redis对string类型的操作比Memcached复杂得多,具体操作方法如下。(1)set设置key对应的值为string类型的value。例如,添加一个name= Test的键值对,可以这样做:redis 127.0.0.1:6379> set name Test   OK   redis 127.0.0.1:6379> 11.2.5  Redis的管理(3)(2)setnx设置key对应的值为string类型的value。如果key已经存在,则返回0。nx是not exist的意思。例如,添加一个name= Test_new的键值对,可以这样做:redis 127.0.0.1:6379> get name   "Test"   redis 127.0.0.1:6379> setnx name Test_new   (integer) 0   redis 127.0.0.1:6379> get name    "Test"   redis 127.0.0.1:6379> 由于原来的name有一个对应的值,所以本次修改不生效,且返回值为0。(3)setex设置key对应的值为string类型的value,并指定此键值对应的有效期。例如,添加一个haircolor= red的键值对,并指定其有效期是10秒,可以这样做: redis 127.0.0.1:6379> setex haircolor 10 red   OK   redis 127.0.0.1:6379> get haircolor   "red"   redis 127.0.0.1:6379> get haircolor   (nil)   redis 127.0.0.1:6379> 可见由于最后一次调用的时间已超出10秒范围,所以无法取得haicolor键对应的值。(4)setrange设置指定key的value值的子字符串。例如,将Test的126邮箱替换为gmail邮箱,可以这样做:redis 127.0.0.1:6379> get name   "Test@126.com"   redis 127.0.0.1:6379> setrange name 8 gmail.com   (integer) 17   redis 127.0.0.1:6379> get name   "Test@gmail.com"   redis 127.0.0.1:6379> 其中的8是指从下标为8(包含8)的字符开始替换。(5)mset一次设置多个key的值,成功后返回ok,表示所有的值都设置完毕;失败则返回0,表示没有任何值被设置。redis 127.0.0.1:6379> mset key1 Test1 key2 Test2   OK   redis 127.0.0.1:6379> get key1   "Test1"   redis 127.0.0.1:6379> get key2   "Test2"   redis 127.0.0.1:6379> (6)msetnx一次设置多个key的值,成功后返回ok,表示所有的值都设置完华;失败则返回0,表示没有任何值被设置,但是不会覆盖已经存在的key。redis 127.0.0.1:6379> get key1   "Test1"   redis 127.0.0.1:6379> get key2   "Test2"   redis 127.0.0.1:6379> msetnx key2 Test2_new key3 Test3   (integer) 0   redis 127.0.0.1:6379> get key2   "Test2"   redis 127.0.0.1:6379> get key3   (nil)  可以看出,如果这条命令返回0,那么内部的操作都会回滚,都不会被执行。11.2.5  Redis的管理(4)(7)get获取key对应的string值,如果key不存在则返回nil。例如,获取一个库中存在的键-name,可以很快得到与之对应的value,可以这样做:redis 127.0.0.1:6379> get name   "Test"   redis 127.0.0.1:6379> 获取一个库中不存在的键-name1,那么会返回一个nil以表示无此键值对。redis 127.0.0.1:6379> get name1   (nil)   redis 127.0.0.1:6379> (8)getset设置key的值,并返回key的旧值。redis 127.0.0.1:6379> get name   "Test"   redis 127.0.0.1:6379> getset name Test_new   "Test"   redis 127.0.0.1:6379> get name   "Test_new"   redis 127.0.0.1:6379> 接下来我们看一下,如果key不存会出现什么状况呢?redis 127.0.0.1:6379> getset name1 aaa   (nil)   redis 127.0.0.1:6379> 可见,如果key不存在,那么将返回nil。(9)getrange获取指定key的value值的子字符串。具体样例如下:redis 127.0.0.1:6379> get name   "Test@126.com"   redis 127.0.0.1:6379> getrange name 0 6   "Test"   redis 127.0.0.1:6379> 字符串左面下标是从0开始的。redis 127.0.0.1:6379> getrange name -7 -1   "126.com"   redis 127.0.0.1:6379> 字符串右面下标是从?1开始的。redis 127.0.0.1:6379> getrange name 7 100   "@126.com"   redis 127.0.0.1:6379> 11.2.5  Redis的管理(5)当下标超出字符串长度时,将默认为是同方向的最大下标。(10)mget一次获取多个key的值,如果对应的key不存在,则对应返回nil。具体样例如下:redis 127.0.0.1:6379> mget key1 key2 key3   1) "Test1"   2) "Test2"   3) (nil)   redis 127.0.0.1:6379> 由于没有对key3定义,所以该键返回nil。(11)incr对key的值进行加加操作,并返回新的值。注意:incr不是int的value会返回错误信息,incr一个不存在的key,则将该key设置为1。redis 127.0.0.1:6379> set age 20   OK   redis 127.0.0.1:6379> incr age   (integer) 21   redis 127.0.0.1:6379> get age   "21"   redis 127.0.0.1:6379> (12)incrby同incr类似,与指定值相加,key不存在时候会设置key,并认为原来的value为0。redis 127.0.0.1:6379> get age   "21"   redis 127.0.0.1:6379> incrby age 5   (integer) 26   redis 127.0.0.1:6379> get name   "Test@gmail.com"   redis 127.0.0.1:6379> get age   "26"   redis 127.0.0.1:6379> (13)decr对key的值进行减减操作,decr一个不存在的key,则设置该key为?1。redis 127.0.0.1:6379> get age   "26"   redis 127.0.0.1:6379> decr age   (integer) 25   redis 127.0.0.1:6379> get age   "25"   redis 127.0.0.1:6379> (14)decrby同decr类似,与指定值相减。redis 127.0.0.1:6379> get age   "25"   redis 127.0.0.1:6379> decrby age 5   (integer) 20   redis 127.0.0.1:6379> get age   "20"   redis 127.0.0.1:6379> decrby完全是为了增加代码的可读性,完全可以通过incrby一个负值来实现同样的效果;反之一样。redis 127.0.0.1:6379> get age   "20"   redis 127.0.0.1:6379> incrby age -5   (integer) 15   redis 127.0.0.1:6379> get age   "15"   redis 127.0.0.1:6379> 
0 0
原创粉丝点击