redis入门知识

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

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的服务状况。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容