关于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
;;
*)
#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
设置Redis进行数据库备份的频率。指出在某时间内进行多少次更新操作,并将数据同步到数据文件rdb。相当于条件触发抓取快照,可以多条件配合设置。
save 900 1900秒内至少有1个key被改变
save 300 10300秒内至少有300个key被改变
save 60 1000060秒内至少有10000个key被改变
这里只是写了一条,如果在86400秒之内有1个keys发生变化时就进行备份。如果没有特别的设定,就是一天一备份。
#rdbcompression
设置在进行镜像备份时是否进行压缩。#dbfilename
镜像备份文件的文件名。#dir
数据库镜像备份文件的放置路径。路径跟文件名要分开配置,因为Redis在进行备份时,会先将当前数据库的状态写入一个临时文件,等备份完成时,再把该临时文件替换为所指定的文件,而临时文件和所配置的备份文件都存放在指定路径当中。#slaveof
设置该数据库为其他数据库的从数据库。#masterauth
当主数据库连接需要密码验证时,用该指令指定。#requirepass
设置客户端连接后进行任何其他指定前需要使用的密码。
需要注意的是,因为Redis速度相当快,所以在配置比较好的服务器下,外部用户可以在一秒钟内进行150000次的密码尝试,这意味着需要指定非常强大的密码来防止他人进行暴力破解。
#maxclients
限制同时连接的客户数量。当连接数超过这个值时,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,以便能够尽可能快地释放内存。
Redis配置文件一旦写好既无需更改,除非需要再次调整及优化。所以对其操作一般使用命令行的形式。接下来介绍Redis常用的命令-键值相关命令
1.ping
测试连接是否存活:
redis 127.0.0.1:6379> pingPONG
执行下面命令之前,停止redis服务器redis 127.0.0.1:6379> pingCould not connect to Redis at 127.0.0.1:6379: Connection refused
执行下面命令之前,启动redis服务器not connected> pingPONGredis 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 1OKredis 127.0.0.1:6379> select 16(error) ERR invalid DB indexredis 127.0.0.1:6379>
当选择16号数据库时,系统报错,说明没有编号为16的数据库。
4.quit
退出连接。
redis 127.0.0.1:6379> quit#
5.dbsize
返回当前数据库中key的数目。
redis 127.0.0.1:6379> dbsize(integer) 18redis 127.0.0.1:6379>
结果说明此库中有18个key。
6.info
获取服务器的信息和统计。
redis 127.0.0.1:6379> inforedis_version:2.4.Xredis_git_sha1:00000000redis_git_dirty:0arch_bits:32multiplexing_api:epollprocess_id:28480uptime_in_seconds:2515uptime_in_days:0redis 127.0.0.1:6379>
7.monitor
实时转储收到的请求。
redis 127.0.0.1:6379> config get dir1) "dir"2) "/root/4setup/redis-2.4.X"redis 127.0.0.1:6379>
8.config get
获取服务器配置信息。
redis 127.0.0.1:6379> config get dir1) "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) 18redis 127.0.0.1:6379> flushdbOKredis 127.0.0.1:6379> dbsize(integer) 0redis 127.0.0.1:6379>
这里选择清除将0号数据库中的key。
10.flushall
删除所有数据库中的所有key。
redis 127.0.0.1:6379> dbsize(integer) 1redis 127.0.0.1:6379> select 0OKredis 127.0.0.1:6379> flushallOKredis 127.0.0.1:6379> select 1OKredis 127.0.0.1:6379> dbsize(integer) 0redis 127.0.0.1:6379>
这里首先查看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>
(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,那么内部的操作都会回滚,都不会被执行。
(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>
当下标超出字符串长度时,将默认为是同方向的最大下标。
(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>
页:
[1]