由于blog各种垃圾评论太多,而且本人审核评论周期较长,所以懒得管理评论了,就把评论功能关闭,有问题可以直接qq骚扰我

nosql——redis详解

数据库 西门飞冰 6693℃
[隐藏]

1.Redis概述

Redis是一个开源的使用c语言编写、支持网络、可持久化的日志性、key-value数据库,并提供多种语言的API,使用起来很方便。

Redis和memcached很像,但是redis支持的数据存储类型比memcached更丰富,包括strings(字符串)、lists(列表)、sets(集合)和sorted sets(有序集合等)。

Redis和memcached一样为了保证效率,数据都是缓存在内存中提供服务,和memcache不同的是,redis持久化缓存服务还会周期把更新的数据写入磁盘以及把修改的操作记录追加到文件里记录下来,比memcached更有优势的是,redis还支持master-slave(主从同步)。

1.1.Redis优点

  • 与memcached相比,redis可以持久化存储数据。
  • 性能很高,据说redis能支持超过10W每秒的读写频率。
  • 丰富的数据类型:redis支持二进制的strings,lists,hashes,sets及sorted sets等数据类型操作。
  • 原子:redis的所有操作都是原子性的,同时redis还支持对几个操作全并后的原子性执行。
  • 丰富的特性:redis还支持publish/subscribe(发布订阅),通知,key过期等等特性。
  • Redis支持主从复制。

1.2.Redis数据类型

作为key-value型存储系统数据库,redis提供了键(key)和键值(value)的映射关系。但是,除了常规的数值或字符串,redis的键值还可以是以下形式之一,下面是redis最为常用的数据类型:

  • String字符串
  • Hash哈希表
  • List列表
  • Set集合
  • Sorted set有序集合

1.3.Redis持久化

通常,redis将数据存储于内存中,或被配置为使用虚拟内存。通常两种方式可以实现数据持久化:使用快照(snapshot)的方式,将内存中的数据不断写入磁盘,或使用类型MySQL的binlog日志(aof)方式,记录每次更新的日志。前者性能较高,但是可能会引起一定程序的数据丢失;后者相反。

1.4.Redis应用场景

  • Redis最佳应用场景是全部数据in-memory。
  • Redis更多常见是作为memcached替代品来使用。
  • 数据比较重要,对数据一致性有一定要求的业务。
  • 当需要出key/value之外的更多数据类型支持,使用redis更合适。
  • 需要使用主从同步以及负载均衡分布式应用的场景(redis主从同步)。

Redis作者谈redis应用场景:http://blog.nosqlfan.com/html/2235.html

1.5.Redis的生产经验教训

  • 要进行master-slave主从同步配置,并且在出现服务故障时可以切换。
  • 在master禁用数据持久化,只需要在slave上配置数据持久化。(到时候就哭吧)
  • 物理内存+虚拟内存不足,这个似乎后dump一致死着,时间久了机器挂掉。这个情况就是灾难。
  • Redis物理内存使用超过内存总容量的3/5时就开始比较危险了,就开始做swap,内存碎片大!
  • 当达到最大内存时,会情况带有过期时间的key,即使key未到过期时间。
  • 推荐redis配置64~128内存,SSD硬盘。

2.安装配置redis

2.1.环境说明

[root@redis ~]# cat /etc/redhat-release
CentOS release 6.6 (Final)
[root@redis ~]# uname -r
2.6.32-504.el6.x86_64
[root@redis ~]# ifconfig eth0 | grep 'inet addr:'| cut -d: -f2 | awk '{ print $1}'
172.16.4.101
[root@redis ~]# hostname
redis.fblinux.com

2.2.安装redis

配置好阿里和epel源,就可以使用如下命令安装redis了

[root@redis ~]# yum localinstall redis-3.0.2-1.el6.remi.x86_64.rpm

Redis的rpm获取地址:http://www.rpmfind.net/linux/rpm2html/search.php?query=redis(x86-64)

官方源码安装redis参考:

http://www.redis.io/download

2.3.Redis命令工具说明:

  • redis-cli:redis命令行操作工具。
  • redis-server:redis服务器的daemon启动程序。
  • redis-benchmark:redis性能测试工具,测试redis在你的系统配置下的读写性能。
  • redis-check-dump:用于本地数据库rdb文件的检查
  • redis-check-aof:对更新日志appendonly.aof检查,是否可用。
  • redis-sentinel:管理redis sentinel集群的命令
  • redis-shutdown:关闭redis服务

注意:redis没有man文档,只有command –h帮助。

2.4.Redis配置文件说明:

Redis配置文件说明参数说明(如果是单机使用,只需要修改bind,和开启持久化即可)

[root@redis ~]# vim /etc/redis.conf
15 ################################## INCLUDES ###################################
30 # include /path/to/local.conf       			#包含子配置文件
33 ################################ GENERAL  #####################################
37 daemonize yes                       			#是否运行为守护进程
41 pidfile /var/run/redis.pid          			#pid文件位置
45 port 6379                           			#监听端口
54 tcp-backlog 511                    			#本地接收缓冲满了,缓存在tcp队列
65 bind 127.0.0.1                     			#指明监听的地址
71 # unixsocket /tmp/redis.sock       			#sock文件位置
72 # unixsocketperm 700               			#sock文件权限
75 timeout 0                          			#客户端超时,0表示不超时	
99 loglevel notice                    			#指定日志级别,推荐级别大些
104 logfile /var/log/redis/redis.log  			#指定日志文件位置
114 # syslog-facility local0          			#如果使用syslog接受日志,这里设置syslog设备
119 databases 16                      			#指定数据库数量
121 ################################ 快照 ################################
141 #   save ""                       			#关闭save操作
143 save 900 1                        			#900秒内,一个键发生变化做一次sava
144 save 300 10                       			#300秒内,十个键发生变化做一次sava
145 save 60 10000                     			#60秒内,一万个键发生变化做一次sava    
160 stop-writes-on-bgsave-error yes   			#在进行快照备份时,一旦检测到快照发生错误,是否停止
166 rdbcompression yes                			#是否对文件进行压缩 
175 rdbchecksum yes                   			#是否对rdb的镜像文件做校验码检测
178 dbfilename dump.rdb               			#指明db文件名
188 dir /var/lib/redis/               			#指明db文件目录
190 ################################# 复制 #################################
206 # slaveof <masterip> <masterport>   		#指定redis主节点的ip地址和端口
213 # masterauth <master-password>				#指定redis主节点密码(如果没有则不指定)
226 slave-serve-stale-data yes					#当slave丢失master或者同步正在进行时,如果发生对slave的服务请求:设置为yes则slave正常提供服务,设置为no,则salve返回client错误
242 slave-read-only yes							#设置从库只读
273 repl-diskless-sync no						
285 repl-diskless-sync-delay 5		
291 # repl-ping-slave-period 10					#slave发送pings到master的间隔时间
303 # repl-timeout 60							#IO超时时间
318 repl-disable-tcp-nodelay no		
331 # repl-backlog-size 1mb						#同步的backlog(主库连接从库的队列)大小
340 # repl-backlog-ttl 3600						#backlog生存时间
355 slave-priority 100							#slave优先级
371 # min-slaves-to-write 3						#设置slave小于几个master停止写入操作
372 # min-slaves-max-lag 10						#设置slave落后master指定秒,master停止写入操作
379 ################################## 安全 ###################################
392 # requirepass foobared             			#设置redis连接密码
403 # rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52  #重命名CONFIG命令
408 # rename-command CONFIG ""        			#关闭CONFIG命令
413 ################################### 限制 ####################################
424 # maxclients 10000                 			#设置最大连接数
449 # maxmemory <bytes>                			#使用内存的限制,redis到达限制会删除key,就算key未过期
472 # maxmemory-policy noeviction      			#内存限制算法,使用此算法删除key
485 ############################## AOF持久化###############################
505 appendonly no                     			#是否启用aof功能         
509 appendfilename "appendonly.aof"   			#aof文件名
535 appendfsync everysec              			#每次收到写命令,立即写入到磁盘
557 no-appendfsync-on-rewrite no      			#每秒钟写一次
576 auto-aof-rewrite-percentage 100   			#appendfsyn不会执行写操作,而是有操作系统决定
577 auto-aof-rewrite-min-size 64mb    			#当前的aof大小是上次重写文件的2倍时,则自动启动日志重写过程
601 aof-load-truncated yes            			#当前aof启动日志过程的最小值
603 ################################ LUA 脚本  ###############################
619 lua-time-limit 5000                    		#lua脚本执行时间,单位为毫秒
621 ################################ 集群 ###############################
633 # cluster-enabled yes                  		#打开redis集群
641 # cluster-config-file nodes-6379.conf  		#redis集群配置文件
647 # cluster-node-timeout 15000           		#集群节点超时时间,单位毫秒
692 # cluster-slave-validity-factor 10     		#slave节点检测因素,开始failover的超时时限是通过factor与timeout的乘积来确定的
711 # cluster-migration-barrier 1          		#设置master只有在关联多少slave时才会触发迁移过程
724 # cluster-require-full-coverage yes    		#如果某一些key space没有被集群中任何节点 覆盖,集群将停止接受写入
729 ################################## 慢查询日志###################################
747 slowlog-log-slower-than 10000      			#它决定要对执行时间大于多少微妙(microsecond,1秒=1,000,000微妙)的查询进行记录
751 slowlog-max-len 128                			#最多能保存多少条日志,slow log本身是一个FIFO队列。
#如果需要查看慢查询日志,需要使用如下命令
127.0.0.1:6379> SLOWLOG get
753 ################################ 高级配置 ##############################
818 notify-keyspace-events ""        			#键空间通知,选项为空字符串功能关闭(默认)。
825 hash-max-ziplist-entries 512     			#当value这个map内部不超过512个成员时,会采用线性紧凑格式存储。
826 hash-max-ziplist-value 64        			#当value这个map内部的每个成员值长度不超过64字节就会采用线性紧凑存储来节省空间。
831 list-max-ziplist-entries 512     			#list成员数不超过512,会采用线性紧凑格式存储。      
832 list-max-ziplist-value 64        			#list成员值长度的字节数不超过64字节就会采用线性紧凑存储来节省空间。
839 set-max-intset-entries 512       			#限制set编码最大上限
844 zset-max-ziplist-entries 128     			#zset格式数据成员不超过512时,使用线性紧凑格式存储
845 zset-max-ziplist-value 64        			#zset值内部的每个成员值长度不超过64字节会采用线性紧凑格式存储
859 hll-sparse-max-bytes 3000        			#系数格式最大字节限制
879 activerehashing yes              			#不在意延迟,希望尽快释放内存,如果设置no表示关闭延迟
914 client-output-buffer-limit normal 0 0 0   	#显示分配的缓冲区大小,防止内存无节制分配。参数的默认值都为0,意思是不做任何限制。
915 client-output-buffer-limit slave 256mb 64mb 60  		#限制从库的复制客户端,缓冲区硬限制为256M,软限制64M,软限制超时时间为60秒(超过这个时间会断开和客户端的连接)
916 client-output-buffer-limit pubsub 32mb 8mb 60   		#显示发布订阅的客户端,缓冲区硬限制为32M,软限制为8M,软限制超时时间为60秒(超过这个时间会断开和客户端的连接)
933 hz 10                              						#redis执行后台任务(关闭客户端连接,清楚未被请求过的过期key)的频率
939 aof-rewrite-incremental-fsync yes  						#当一个子进程重写aof文件时,如果启用下面这个选项,则文件没生成32M数据会被同步。

 

2.5.启动redis

这里的配置文件,使用的就是默认配置文件,没有做修改就可以直接启动redis。如果需要对外提供服务,需要设置bind绑定外部地址。

[root@redis ~]# service redis start
Starting redis-server:                                     [  OK  ]
[root@redis ~]# netstat -lntp | grep redis
tcp        0      0 127.0.0.1:6379              0.0.0.0:*                   LISTEN      40004/redis-server  

3.通过shell客户端操作数据

连接redis:如果是使用的默认配置启动之后直接使用redis-cli命令就可以连接到redis对redis进行操作,方法如下所示:

[root@redis ~]# redis-cli 
127.0.0.1:6379>

设置key:使用set命令设置一个name的键,值是xmfb

127.0.0.1:6379> SET name xmfb
OK

获取值:使用get获取键name的值,可以看到name的值是刚刚设置的xmfb

127.0.0.1:6379> GET name
"xmfb"

删除key:删除key使用del命令跟键名即可

127.0.0.1:6379> DEL name
(integer) 1
127.0.0.1:6379> GET name
(nil)

验证键是否存在:使用

127.0.0.1:6379> EXISTS id
(integer) 0

查看所有的键

127.0.0.1:6379> KEYS *

Redis切换不同的数据库:(默认16个库0-15)

127.0.0.1:6379> SELECT 1     #切换到第一个库
OK
127.0.0.1:6379[1]> SELECT 2  #切换到第二个库
OK
127.0.0.1:6379[2]>

Redis非交互式方式连接redis:使用redis-cli命令后面直接跟redis命令就可以操作redis,方法如下所示:

[root@redis ~]# redis-cli set name xmfb
OK
[root@redis ~]# redis-cli get name
"xmfb"

4.redis获取帮助的方式

系统级帮助

[root@redis ~]# redis-cli --help

Redis命令行帮助

127.0.0.1:6379> help
redis-cli 3.0.2
Type: "help @<group>" to get a list of commands in <group>  #获取一组命令帮助,支持tab上下自动切换
      "help <command>" for help on <command>                #获取一个命令帮助,支持tab上下自动切换
      "help <tab>" to get a list of possible help topics
      "quit" to exit

其他获取帮助的方式:
Redis中文参考手册:http://redisdoc.com/
Redis官方参考手册:http://redisdoc.com/

5.redis授权和权限管理

5.1.为redis客户端设置外部连接密码

修改配置文件设置用户连接密码

[root@redis ~]# vim /etc/redis.conf
393 requirepass redispass

配置完成,重启redis生效

[root@redis ~]# service redis restart

验证:连接密码是否生效
直接连接redis命令行,提示权限不够,需要授权,说明连接密码配置成功

[root@redis ~]# redis-cli 
127.0.0.1:6379> set name xmfb
(error) NOAUTH Authentication required

使用连接密码连接redis

127.0.0.1:6379> AUTH redispass
OK
127.0.0.1:6379> set name xmfb
OK
127.0.0.1:6379> get name
"xmfb"

也可以直接使用redis-cli连接

[root@redis ~]# redis-cli -a redispass
127.0.0.1:6379> GET name
"xmfb"

5.2.禁用指定命令

修改配置文件关闭set命令

[root@redis ~]# vim /etc/redis.conf
408 rename-command set ""

修改完成重启redis服务,然后执行连接redis支持set就会提示命令找不到

[root@redis ~]# redis-cli 
127.0.0.1:6379> set a b
(error) ERR unknown command 'set'

5.3.命令改名

删除关闭set命令的配置,设置如下两条配置。

[root@redis ~]# vim /etc/redis.conf
409 rename-command set "abc"      #重命名set为abc
410 rename-command get "def"      #重命名get为def

设置完成重启服务,并连接redis验证

[root@redis ~]# redis-cli 
127.0.0.1:6379> AUTH redispass   #由于上面设置了连接密码,所以这里需要授权
OK 
127.0.0.1:6379> abc 123 456      #设置一个键值
OK
127.0.0.1:6379> def 123           #获取一个键值
"456"

上面的命令如果执行成功,说明get和set的重命名配置生效了

6.Redis多实例

复制redis配置文件,并修改相关内容

[root@redis ~]# cp /etc/redis.conf /etc/redis-6380.conf
logfile /var/log/redis/redis-6380.log
pidfile /var/run/redis-6380.pid
port 6380
dir /var/lib/redis-6380/       #设置数据文件目录

创建数据目录

[root@redis ~]# mkdir /var/lib/redis-6380/

使用redis-server命令手动启动第二个实例。

[root@redis ~]# nohup redis-server /etc/redis-6380.conf
[root@redis ~]# netstat -lntp | grep redis
tcp        0      0 127.0.0.1:6379              0.0.0.0:*                   LISTEN      40298/redis-server  
tcp        0      0 127.0.0.1:6380              0.0.0.0:*                   LISTEN      41162/redis-server  

连接第6380实例

[root@redis ~]# redis-cli -p 6380
127.0.0.1:6380> SET port 6380
OK
127.0.0.1:6380> GET port
"6380"

7.Redis数据过期

7.1.设置秒过期

设置一个键值,并查看过期时间

127.0.0.1:6380> SET name xmfb    
OK
127.0.0.1:6380> TTL name       #查看过期时间
(integer) -1                   #ttl等于-1表示永不过期

设置过期时间:单位只支持秒

127.0.0.1:6380> EXPIRE name 3  #设置name字段3秒过期
(integer) 1
127.0.0.1:6380> GET name       #3秒后查看数据为空
(nil)

7.2.设置时间戳过期

获取Unix时间戳

[root@redis ~]# date +%s -d "2015-11-25 23:30:00"
1448465400

设置指定键过期时间

[root@redis ~]# date +%s -d "2015-11-25 23:30:00"
1448465400

Unix时间戳转换工具

http://tool.chinaz.com/Tools/unixtime.aspx

8.redis持久化

redis持久化需要介绍的内容太多,网上已经有很多文章说明,这里不再赘述,redis持久化详细原理可以参考此文章。

http://redisdoc.com/topic/persistence.html

9.php程序操作redis

php操作redis需要安装redis扩展,才可以操作redis,扩展程序获取地址:https://github.com/nicolasff/phpredis/archive/master.tar.gz

编译安装php的redis:

tar xf master.tar.gz
cd phpredis-master/
phpize
./configure --enable-redis
make
make install

修改php.ini,添加redis.so插件

extension=redis.so

部署完成访问测试页验证

redis扩展

php操作redis脚本一例:

<?php
  $redis = new Redis();
  $redis ->connect('172.16.4.101',6379);
  $redis ->set('abc','def');
  $var = $redis ->get('abc');
  echo "$var\n";
?>

10.redis优化

  1. 根据业务需要选择合适的数据类型,并为不同的应用场景设置相同的紧凑存储参数。
  2. 当业务场景不需要数据持久化时,关闭所有的持久化方式可以获得最佳的性能以及最大的内存使用量。
  3. 如果需要使用持久化,根据是否可以容忍重启丢失部分数据在快照方式与语句追加方式之间选择其一,不要使用虚拟内存以及diskstore方式。
  4. 不要让你的redis所在机器物理内存使用超过实际内存总量的3/5。
  5. conf中的maxmemory选项,该选项是告诉redis当使用了多少物理内存后就开始拒绝后续的写入请求,该参数能很好的保护你的redis不会因为使用了过多的物理内存而导致swap,最终严重影响性能甚至崩溃。Redis.conf中的vm-enable为no。
  6. 大数量尽量按业务使用多个redis实例把数据分散开。

11.参考网站

http://redis.io/documentation

http://redisdoc.com/

转载请注明:西门飞冰的博客 » nosql——redis详解

喜欢 (5)or分享 (0)