Redis学习心得

Redis学习心得

没看redis入门指南这本书以前,我是经过别人的博客和手册来学习redis的,所获得的知识零零碎碎,最近两个星期看完了入门指南这本书get到了许多知识,因而打算分享一篇学习笔记。php

redis的key键你真的会命名吗?

提示 Redis 对于键的命名并无强制的要求,但比较好的实践是用“对象类型:对象ID:对象属性”来命名一个键,如使用键user:1:friends来存储ID为1的用户的好友列表。对于多个单词则推荐使用“.”分隔,一方面是沿用之前的习惯(Redis之前版本的键名不能包含空格等特殊字符),另外一方面是在 redis-cli 中容易输入,无需使用双引号包裹。另外为了往后维护方便,键的命名必定要有意义,如 u:1:f的可读性显然不如user:1:friends好.html

例如:文章ID为1的这篇文章的观看量要如何命名?redis

$key = "article:1:view";
复制代码

ps:虽然采用较短的名称能够节省存储空间,但因为键值的长度每每远远大于键名的长度,因此这部分的节省大部分状况下并不如可读性来得重要。数据库

redis几条命令一块儿执行的时候如何保证原子性?

1.事务

Redis中的事务(transaction)是一组命令的集合。事务同命令同样都是 Redis 的最小执行单位,一个事务中的命令要么都执行,要么都不执行。事务的应用很是广泛,如银行转帐过程当中A给B汇款,首先系统从A的帐户中将钱划走,而后向B的帐户增长相应的金额。这两个步骤必须属于同一个事务,要么全执行,要么全不执行。不然只执行第一步,钱就凭空消失了,这显然让人没法接受。缓存

redis> MULTI

OK

redis> SADD "user:1:following" 2

QUEUED

redis> SADD "user:2:followers" 1

QUEUED

redis> EXEC

1) (integer) 1

2) (integer) 1


复制代码

上面的代码演示了事务的使用方式。首先使用MULTI命令告诉Redis:“下面我发给你的命令属于同一个事务,你先不要执行,而是把它们暂时存起来。”Redis回答:“OK。”安全

然后咱们发送了两个 SADD命令来实现关注和被关注操做,能够看到 Redis 遵照了承诺,没有执行这些命令,而是返回QUEUED表示这两条命令已经进入等待执行的事务队列中了。网络

当把全部要在同一个事务中执行的命令都发给 Redis 后,咱们使用 EXEC 命令告诉Redis将等待执行的事务队列中的全部命令(即刚才全部返回QUEUED的命令)按照发送顺序依次执行。EXEC 命令的返回值就是这些命令的返回值组成的列表,返回值顺序和命令的顺序相同。app

Redis保证一个事务中的全部命令要么都执行,要么都不执行。若是在发送EXEC命令前客户端断线了,则 Redis 会清空事务队列,事务中的全部命令都不会执行。而一旦客户端发送了EXEC命令,全部的命令就都会被执行,即便此后客户端断线也不要紧,由于Redis中已经记录了全部要执行的命令。性能

2.脚本

有些状况下会不适合使用事务来保证数据操做的原子性,这时候就要用到脚本。学习

使用脚本的好处有以下几点: (1)减小网络开销:若是五条命令最多须要向Redis发送5次请求,而使用脚本功能完成一样的操做只须要发送一个请求便可,减小了网络往返时延。

(2)原子操做:Redis 会将整个脚本做为一个总体执行,中间不会被其余命令插入。换句话说在编写脚本的过程当中无需担忧会出现竞态条件,也就无需使用事务。事务能够完成的全部功能均可以用脚原本实现。

(3)复用:客户端发送的脚本会永久存储在 Redis 中,这就意味着其余客户端(能够是其余语言开发的项目)能够复用这一脚本而不须要使用代码完成一样的逻辑。

redis的持久化

AOF

当使用Redis存储非临时数据时,通常须要打开AOF持久化来下降进程停止致使的数据丢失。AOF能够将Redis执行的每一条写命令追加到硬盘文件中,这一过程显然会下降Redis 的性能,可是大部分状况下这个影响是能够接受的,另外使用较快的硬盘能够提升AOF的性能。

虽然每次执行更改数据库内容的操做时,AOF都会将命令记录在AOF文件中,可是事实上,因为操做系统的缓存机制,数据并无真正地写入硬盘,而是进入了系统的硬盘缓存。在默认状况下系统每30秒会执行一次同步操做,以便将硬盘缓存中的内容真正地写入硬盘,在这30秒的过程当中若是系统异常退出则会致使硬盘缓存中的数据丢失。通常来说启用AOF持久化的应用都没法容忍这样的损失,这就须要Redis在写入AOF文件后主动要求系统将缓存内容同步到硬盘中。在 Redis 中咱们能够经过 appendfsync 参数设置同步的时机:

# appendfsync always

appendfsync everysec

# appendfsync no

复制代码

默认状况下Redis采用everysec规则,即每秒执行一次同步操做。always表示每次执行写入都会执行同步,这是最安全也是最慢的方式。no表示不主动进行同步操做,而是彻底交由操做系统来作(即每30秒一次),这是最快但最不安全的方式。通常状况下使用默认值everysec就足够了,既兼顾了性能又保证了安全。

结语

看完书中的redis内部编码优化,我仍是挺不解的,直到看到一篇博客才恍然大悟。

博客地址:sunznx.com/redis/insta…

相关文章
相关标签/搜索