Redis知识点总结

总结主要包括以下几方面,有需要的看官可以选择性查看:

v  Redis安装

v  Redis的启动、关闭

v  Redis权限控制

v  Redis支持的value类型

v  Redis排序

v  Redis事务、key的过期时间设置、队列、优先级队列

v  Redis的数据持久化、复制

v  Redis性能查看

v  Redispython

Redis是什么?

B格是这么说的:“Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010315日起,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

 配置redispid文件的位置,关键字:pidfile ,确保有写的权限

 如果只启动一个实例的话port可以保持默认,根据需要修改。注意和刚刚脚本里的pid路径保持一致

 Loglevel定义日志的级别,支持debugverbosenoticewarning级别,配置文件中都有解释每种日志级别的含义

 定义日志文件的位置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

通过psredis日志文件可以查看redis的启动情况,这里配置了两个实例。

从这里也可以看到,单个redis实例只有一个进程,没有子进程。

如何进入redis实例呐?

命令行输入redis-cli -p 实例port,如果省略p参数,默认为6379

单个Redis实例默认支持16database,可以通过修改配置文件中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的操作权限

eg:auth mdspku


Redis支持的value类型

Redis支持以下value类型:

1) String

2) HASH

3) LIST

4) SET

5) ZSET

通过type key-name可以查看定义key的类型,例如:

通过EXISTS 方法,判断key是否存在,返回1为存在,0为不存在

删除key,方法:DEL key-name

1.string类型:

a.设置key

  单个keyset key-name value

           setnx key-name value //如果没定义,定义为value值,已经定义了返回为0

  多个keymset 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.定义:

   HsetHSET key field value

   

   hmsetHMSET key field value [field value ...]

   

B.获取:

   Hget

   Hmget

C.查看定义的键 filed是否存在

  Hexists

 

D.filed的个数

  HLEN

E:获取filedvalues相关值

 HGETALL   获取定义的hash key所有filedvalue的对应关系

 HKEYS      获取定义的hash key所有fileds

 HVALS      获取定义的hash key所有values

F.删除hash-keyfiled

 HDELHDEL  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:valueindex值: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

  AB的交集:SINTER

  AB的并集:SUNION

  可以将结果存放到另外的key中,相关的方法为:

SDIFFSTORESINTERSTORESUNIONSTORE

 

5.zset类型:

a.定义:ZADD key score member [score member ...]

b.获取keymemeber

  按照score的升序:ZRANGE key start stop [WITHSCORES]

  按照score的降序:ZREVRANGE key start stop [WITHSCORES]

  

 

C.获取score的区间值member

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

加上(,表示不包含

D.获取memberindex

 Zrank

E:获取memberscore

 Zscore

F:获取scoreminmax区间值的member的个数

ZCOUNT

G:删除相关:

删除memberZREM

按照scores区间值删除:ZREMRANGEBYSCORE

ZREMRANGEBYSCORE key min max

按照index区间值删除:ZREMRANGEBYRANK

ZREMRANGEBYRANK key start stop

H:集合运算:支持差、交、并的操作,aggregate不指定默认为sumweights为权重,numkeyskey的个数

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还有多久时间过期

队列:

可以通过BRPOPBLPOP实现队列和优先级队列

 

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方式支持手工强制备份,通过savebgsave控制,前者是由主进程进行快照操作,会阻塞住其他请求,后者会通过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.复制

Redismysql一样,支持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的服务状况。

 

v  Redispython

Redis提供多种与外部数据交换的接口,由于运维对python比较熟悉,常使用这种方式与redis交互。

通过pythonredis交互,需要安装redis的一个python模块。

下载地址:https://pypi.python.org/pypi/redis/2.10.3,下载完以后安装即可。

使用方法:

l  加载redis模块: import redis

l  创建一个访问redis的模块的连接,通过StrictRedis方法。可以查看下方法的用法。默认连接的是6379db0

Pspython调试个人喜欢在ipython中,比python自带的提供自动补全和更好的帮助信息

接下来就可以操作redis实例中的数据了,妥妥的。


你可能感兴趣的:(redis,redis)