设为首页 收藏本站
查看: 1218|回复: 0

[经验分享] 关于redis

[复制链接]

尚未签到

发表于 2018-11-6 13:11:54 | 显示全部楼层 |阅读模式
#!/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 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
  

  
限制同时连接的客户数量。当连接数超过这个值时,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> 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>
  

  
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>
  

  

  
(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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-631582-1-1.html 上篇帖子: redis入门——redis常用命令 下篇帖子: linux下集成脚启动本编写——Rabbitmq mysql redis apache
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表