总结主要包括以下几方面,有需要的看官可以选择性查看:
v Redis安装
v Redis的启动、关闭
v Redis权限控制
v Redis支持的value类型
v Redis排序
v Redis事务、key的过期时间设置、队列、优先级队列
v Redis的数据持久化、复制
v Redis性能查看
Redis是什么?
B格是这么说的:“Redis是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。”
说人话redis其实就是把数据全部放在内存中的键-值数据库(不开启swap功能)
Redis安装
安装包下载:
安装包的下载可以从官网下载:http://redis.io/download,目前已经支持到3.0的版本(支持cluster的功能),官网上说3.0的还是一个开发版本,不适合在生产环境上使用。
这里下载的是2.8的稳定版本。Redis的命名第二位minor为偶数代表稳定版本。
安装:
Redis的安装较其他的软件相比较简单,没有其他外部依赖。把包解压后就可以直接编译和安装了。
安装方法:make && make install
安装完后redis的相关工具都会拷贝到/usr/local/bin目录下。
Redis的启动、关闭
安装完后,在启动前先配置一下即将启动的redis实例的环境。
1.新建一个实例目录,里面可以放这个实例相关的配置文件、pid、日志、脚本和数据落地的文件
2.Redis的配置文件的模版可以从安装包的根目录拷贝,文件名:redis.conf
3.Redis安装包也提供了redis的启、停SHELL脚本:utils/redis_init_script
4.根据需要修改模版的起停脚本的pid文件和配置文件的存放地址,默认监听的端口是6379,根据需要可以修改,确保配置的相关目录有写的权限。
5.修改实例的配置文件
Redis默认情况下不是以守护进程的模式启动的,将daemonize修改成yes
配置redis的pid文件的位置,关键字:pidfile ,确保有写的权限
如果只启动一个实例的话port可以保持默认,根据需要修改。注意和刚刚脚本里的pid路径保持一致
Loglevel定义日志的级别,支持debug、verbose、notice、warning级别,配置文件中都有解释每种日志级别的含义
定义日志文件的位置logfile定义,如果不以守护进程的模式启动,日志会打印在屏幕上。如果以守护进程的模式启动,默认为空,日志将会丢弃在linux的垃圾箱里(/dev/null),为了查找问题方便和了解redis的工作场景,最好配上。
6.配置数据文件落地的路径,dir
到这里就可以愉快的通过脚本,启动redis进程了。
启动:sh redis_init_script start ==redis-server redis配置文件路径
关闭:sh sh redis_init_script stop == redis-cli -p 实例port shutdown
通过ps和redis日志文件可以查看redis的启动情况,这里配置了两个实例。
从这里也可以看到,单个redis实例只有一个进程,没有子进程。
如何进入redis实例呐?
命令行输入redis-cli -p 实例port,如果省略p参数,默认为6379
单个Redis实例默认支持16个database,可以通过修改配置文件中databases的个数。默认进入为0。进入后可以通过select dbid,切换进入相应的databases,超过最大个数redis会提示:(error) ERR invalid DB index。
redis不支持hup信号,重启只能stop 然后start。
但是某些配置的修改可以支持在线修改,不重启。通过config set配置,例如修改redis的日志级别为warning。
Redis权限控制
Redis的访问权限控制不像传统关系型数据库做的那么精细,安全性较低。默认情况下,redis可以被任何机器访问和修改key值。
可以通过以下方式提升redis的访问安全:
1.设置访问密码:打开默认注释的requirepass项,配置口令。
Redis的密码是明文的,因此也不担心忘记,但是相反的底裤也被人看的一清二楚。
2.设置可以访问的ip:配置bind,从2.8版本开始bind支持多个ip,用空格分开。
通过配置这两项提升redis的安全性,目前redis只做到了访问上的控制,取得了访问权限后,数据安全性还没做到精细化控制。
设置完密码后,如何获取redis的访问权限,操作数据?
a.redis-cli -a带上redis的密码
b.或者进入后输入 auth 密码,获取到redis的操作权限
Redis支持的value类型
Redis支持以下value类型:
ü String
ü HASH
ü LIST
ü SET
ü ZSET
通过type key-name可以查看定义key的类型,例如:
通过EXISTS 方法,判断key是否存在,返回1为存在,0为不存在
删除key,方法:DEL key-name
1.string类型:
a.设置key值
单个key:set key-name value
setnx key-name value //如果没定义,定义为value值,已经定义了返回为0
多个key:mset key-name1 v1 key-name2 v2 .........
msetnx
b获取key值
单个:get key-name
多个:mget keyname1 keyname2 ......
C.获取value长度
STRLEN key-name
D.对于数字型的字符串支持自增和自减
INCR
DECR
指定自增、自减的幅度
INCRBY keyname increment
DECRBY keyname increment
同时支持浮点数的自增、减
INCRBYFLOAT keyname float-increment
注意没有自减float,可以通过指定步长为负数来实现
E.字符串拼接:append方法,返回拼接后的字符串长度。
在redis-cli命令行里,方法不区分大小写,可以通过tab键补齐;通过 ? 方法名,获取方法的用法帮助信息
2.hash类型
A.定义:
Hset:HSET key field value
hmset:HMSET key field value [field value ...]
B.获取:
Hget:
Hmget
C.查看定义的键 filed是否存在
Hexists:
D.filed的个数
HLEN
E:获取filed和values相关值
HGETALL 获取定义的hash key所有filed和value的对应关系
HKEYS 获取定义的hash key所有fileds
HVALS 获取定义的hash key所有values
F.删除hash-key的filed
HDEL:HDEL key field
3.List
a.定义:lpush/rpush
B.取值/分片取值:LRANGE
C.list长度方法:LLEN
D.删除:LREM
LREM key count value
//count为删除的个数,为0为删除list所有的 value值,为正数从左开始删除,为负数从右开始,返回删除的个数
E:插入:LINSERT
LINSERT key BEFORE|AFTER pivot value
F:弹出
RPOP
LPOP
RPOPLPUSH:将从右边弹出的valuse放入另外一个list中
G:value的index值:LINDEX
H:修改index下的value值: LSET key index value
4.Set类型
a.定义:SADD key member [member ...]
b.获取key的值:SMEMBERS key
C.获取member的个数:SCARD key
D.集合操作
A-B:SDIFF
A与B的交集:SINTER
A与B的并集:SUNION
可以将结果存放到另外的key中,相关的方法为:
SDIFFSTORE、SINTERSTORE,SUNIONSTORE
5.zset类型:
a.定义:ZADD key score member [score member ...]
b.获取key的memeber:
按照score的升序:ZRANGE key start stop [WITHSCORES]
按照score的降序:ZREVRANGE key start stop [WITHSCORES]
C.获取score的区间值member:
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
加上(,表示不包含
D.获取member的index
Zrank
E:获取member的score
Zscore
F:获取score在min和max区间值的member的个数
ZCOUNT
G:删除相关:
删除member:ZREM
按照scores区间值删除:ZREMRANGEBYSCORE
ZREMRANGEBYSCORE key min max
按照index区间值删除:ZREMRANGEBYRANK
ZREMRANGEBYRANK key start stop
H:集合运算:支持差、交、并的操作,aggregate不指定默认为sum,weights为权重,numkeys为key的个数
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
I.score支持自增操作:ZINCRBY
ZINCRBY key increment member
补充:1.如何查看redis实例的某个databases定义了多少个key?
Dbsize这个命令可以获取到key的个数
Keys *,可以具体查看到定义了哪些key,在数据量大的情况下这样查看很耗性能
2.删除所有key(切勿在生成环境上尝试,哈哈)
Flushdb:删除当前database中的所有key
Flushall:清除redis中所有库中的key
redis-cli keys '*' | xargs redis-cli del
Redis排序
语法:SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ALPHA] [STORE destination]
单个key内部排序直接使用sort key就可,这里主要说下参考排序这种用法,结合一个排行榜例子来说下sort的这种用法:
通过hash类型的key记录了业务所有帐号的分数信息,相关帐号信息记录在list类型的key中。
排行榜分数记录key定义如下:
帐号信息list如下:
这里需要按照分数对帐号信息排序:
可以使用limit对排序后的数据进行分页。
如果想要获取到排序后的登录地址信息可以使用get。
Redis事务的支持、key的过期时间设置、队列、优先级队列
事务:
通过Multi命令开启事务,后续的命令并不是立即执行,而是先放到一 个队列中。当从此连接收到exec命令后,redis会顺序的执行队列中的所有命令。
可以通过DISCARD取消一个开启的事务。
Redis没有锁的概念,只能通过watch命令,用来实现乐观锁。在watch后修改跟踪的key值后续的整个事务都将失效。
Key的过期时间设置:
EXPIRE key seconds
通过ttl可以查看key还有多久时间过期
队列:
可以通过BRPOP、BLPOP实现队列和优先级队列
Redis的数据持久化、复制
所谓数据的持久化就是支持内存数据的落地,复制支持master-slave的数据同步机制。
1.数据持久化
Redis支持两种方式的持久化,一种是RDB方式,一种是AOF方式。可以单独使用其中一种或将二者结合使用。
a.RDB方式
Redis默认打开的是rdb方式,RDB方式的持久化是通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的所有数据进行快照并存储在硬盘上。
--RBD的配置
通过配置文件中的save控制:默认为:
,每个条件是或的关系,save的第一个参数表示时间,单位是秒,第二个参数表示的是key的变化个数,当满足其中一个条件时候,内存中的数据就会写入硬盘。
通过dbfilename配置写入硬盘的文件名。
----备份逻辑
通过redis的日志可以看到备份的逻辑:
l Redis主进程fork一个子进程响应备份请求
l 备份的文件写入到一个临时文件中
l 将临时文件替换老文件
备份出来的文件大小和内存一样大吗?
Rdb方式默认开启了文件压缩,通过rdbcompression控制,所以备份出来的文件是小于内存的大小。可以根据性能选择关闭此选项
---手工备份
Rdb方式支持手工强制备份,通过save和bgsave控制,前者是由主进程进行快照操作,会阻塞住其他请求,后者会通过fork子进程进行快照操作。
--缺点
通过RDB方式实现持久化,一旦Redis异常退出,就会丢失最后一次快照以后更改的所有数据
b.AOF方式
考虑到rdb方式的缺陷,redis支持另外一种方式AOF(append only file),这种方式特点是数据实时落地,保证了数据的安全。
---配置
修改appendonly 选项为yes,默认为no
根据需要修改落地文件的名,通过appendfilename选项
--数据落地更精细化控制
虽然每次执行更改数据库内容的操作时,AOF都会将命令记录在AOF文件中,但是事实上,由于操作系统的缓存机制,数据并没有真正地写入硬盘,而是进入了系统的硬盘缓存。为了更精细化的控制数据落地,兼顾数据安全和性能方面的抉择,
Aof提供了三种方式控制数据落地的频率:
默认是每秒钟执行一次同步操作。
always表示每次执行写入都会执行同步,这是最安全也是最慢的方式。no表示不主动进行同步操作,而是完全交由操作系统来做,这是最快但最不安全的方式。一般情况下使用默认值everysec就足够了,既兼顾了性能又保证了安全。
----AOF备份文件
可以通过查看AOF文件发现其实是纯文本文件,记录了key的变化。
当对一个key定义了多次值,每次变化都会记录,然而真正有作用的其实是最后一次。Redis开发者考虑了这个问题,当一定时候系统会自动将不要的日志剔除。可以通过这两项控制
auto-aof-rewrite-percentage:当目前的AOF文件大小超过上一次重写时的AOF文件大小的百分之多少时会再次进行重写,如果之前没有重写过,则以启动时的AOF文件大小为依据
auto-aof-rewrite-min-size参数限制了允许重写的最小AOF文件大小
通常可以不用关心这个,让Redis自动执行重写。另外redis提供手工强制重写的命令:BGREWRITEAOF
通过多次定义同一个key,观察aof文件内容的变化
同时开启了两种数据落地模式的话,redis重启使用的是aof文件,因为rdb可能有数据丢失,aof更能保证数据的完整性。
2.复制
Redis像mysql一样,支持master-slave模式,防止数据在一台机器上,硬件故障后的数据丢失。
---配置
Redis的复制配置只需要在slave的实例上更改配置文件,master上不需要做任何更改,配置起来比较简单
l 打开
选项,配置masterip和端口
l 如果master配置了requirepass,需要配置数据同步的口令。配置
选项
这样master-salve的模式就建立起来了,可以试试数据同步。
从数据库默认是只读的,可以通过slave-read-only选项修改。
当master故障后,可以通过salve no one命令来取消与master的同步,将slave调整成master
Redis性能查看
通过info命令可以查看redis的内存,cpu,数据同步、落地情况。
因为redis是内存数据库,对内存的使用情况比较关注。
used_memory表示redis使用的内存,单位为b
used_memory_rss表示redis实例申请的物理内存的大小,等同于redis实例进程占用的内存。通过ps aux 可以查看redis申请的物理内存,等于info里看到的。
mem_fragmentation_ratio表示内存使用的碎片率:used_memory/used_memory_rss
可以在配置文件中配置maxmemory设置redis实例使用的最大内存量,单位为b。
used_memory_peak:表示内存使用的峰值。
各项值的human是转化为kb后的值
有了info,运维就可以根据需要监控redis的各项性能指标,了解redis的服务状况。