超详细的redis学习(2)-进阶篇

redis多数据库

说明:一个redis实例可以包含多个数据库,客户端可以指定连接某个数据库(与MySql客户端我们创建多个数据库类似)一个redis实例最多可以提供16个数据库,下标是从0到15,默认连接的是第0号数据库。

代码相关演示:

127.0.0.1:6379> select 1  //选择数据库1
OK
127.0.0.1:6379[1]> keys *
(empty list or set)
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> set string1 2 
OK
127.0.0.1:6379> keys *  //查询所有的key
1) "hsah1"
2) "list1"
3) "set1"
4) "list2"
5) "string1"
6) "hash1"
7) "string2"
127.0.0.1:6379> move list1 1  //移动list1到数据库1
(integer) 1
127.0.0.1:6379> move set1 1
(integer) 1
127.0.0.1:6379> keys *
1) "hsah1"
2) "list2"
3) "string1"
4) "hash1"
5) "string2"
127.0.0.1:6379> select 1 
OK
127.0.0.1:6379[1]> keys *
1) "list1"
2) "set1"
127.0.0.1:6379[1]> type set1 //获取数据类型
set
127.0.0.1:6379[1]>

可以试着敲一遍,查看注释基本明白了redis多数据库的使用

redis事务的概念

  • 事务的基本命令

1)multi 标记一个事务的开始

2)exec 执行所有事务块内的命令

3)discard 取消事务,放弃执行事务块内的所有命令

  • 事务特性

1)事务中的命令都是串行执行的。

2)事务执行期间redis不会再对其它的客户端提供任何服务,从而保证事务中的命令能够原子化执行。

3)单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。

  • 代码实例
redis 127.0.0.1:6379> MULTI   //开启事务
OK
redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"
QUEUED
redis 127.0.0.1:6379> GET book-name
QUEUED
redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"
QUEUED
redis 127.0.0.1:6379> SMEMBERS tag
QUEUED
redis 127.0.0.1:6379> EXEC //提交事务
1) OK
2) "Mastering C++ in 21 days"
3) (integer) 3
4) 1) "Mastering Series"
   2) "C++"
   3) "Programming"

redis数据持久化

  • RDB数据持久化方式

优势

1)redis数据库会只包含一个文件存储在硬盘中,对于文件备份会简单很多。

2)对于灾难恢复,RDB是更好的选择,因为一个文件可以直接拷贝走,拷贝回来。

3)性能最大化,redis开始持久化的时候只分出一些子进程,之后这些子进程会完成持久化工作,避免了服务器进程执行io的操作。数据集很大的时候,启动效率会更高。

缺点

1)最大限度的避免数据丢失,RDB做的不是特别好,系统一定在定时持久化之前出现一些档期的情况,还没有来得及往硬盘上写,数据已经丢失掉。

2)因为RDB是通过开启子进程的方式来进行持久化操作的,因此当数据集比较大的时候,这个过程可能会导致服务器停止一定事件,几十毫秒甚至1秒。

配置

linux目录中/usr/local/redis/redis-conf目录中找到这样的几行代码

save 900 1
save 300 10
save 60 10000

第一行代码表示:900秒,也就是15分钟至少又一个key发生变化就会持久化一次。

第二行代码表示:300秒,至少有10个key发生变化就会往硬盘中持久化一次。

第三行代码表示:60秒,至少有10000个key发生变化就会往硬盘中持久化一次。

dbfilename dump.rdb

配置中继续往下看,看到这样一行代码,这个dump是数据库的名字。

往下一段代码

dir ./

保存路径位置,就是当前目录下的上面的名字,就是持久化的数据库

  • AOF数据持久化方式

优势

1)可以带来更高的数据安全性,这种数据持久化方式有三种同步策略,每秒同步,每修改同步(每一次发生数据的变化都会立即被记录到磁盘中,效率最低但是最安全),不同步。

2)日志的写入操作是采用append追加的模式,在写入过程中即使出现服务器档期问题,也不会破坏日志文件中已经写入的内容。

3)如果日志过大,redis可以自动启动重写机制,redis会不断的将修改的数据写入到老的磁盘当中,同时redis会创建一个新的文件来记录此期间产生了哪些修改命令被执行了。

4)AOF包含一个格式非常清晰易于理解的日志文件,用于记录所有的修改操作。通过这个文件就可以完成数据的重建。

劣势

1)对于相同的数据集文件,AOF要比RDB文件大。

2)根据同步策略的不同,AOF在运行效率上往往低于RDB,AOF每修改就同步到硬盘上效率肯定是没有RDB高的。

>   配置

linux目录中/usr/local/redis/redis-conf目录中找到这样的几行代码

appendonly no

# The name of the append only file(default:"appendonly.aof")

appendfilename "appendonly.aof"

如果使用AOF的持久还方式,需要把appendonly 后面的属性变为yes

appendonly.aof是用来记录所有修改操作的文件,这个文件还可以用来进行数据的恢复等,例如一条删除操作成功后,我们在appendonly.aof文件中把删除命令去掉,重新运行redis,之前的数据又都会恢复

# appendfsync always
appendfsync everysec
# appendfsync no

这段代码是关于同步策略的一个设置,第一条是每修改就同步持久化,第二条是每秒同步持久化一次,第三条是不同步持久化。

说明:按照redis之后默认选择的是RDB方式,还有在修改过redis-config之后注意要重新启动redis服务才能生效

高难度
http://blog.51cto.com/hmtk520/2115789

redis中的key设置过期时间

设置时间格式
EXPIRE key secords

  • 设置过期时间后的一些说明
  1. 当给定的key设置了生存时间,当key过期时(生存/过期为0),它会被自动删除
  2. redis中带有生存时间的key被称为易失(volatile)的
  3. 生存时间可以通过使用 DEL 命令来删除整个 key 来移除,或者被 SET 和 GETSET 命令覆写(overwrite),这意味着,如果一个命令只是修改(alter)一个带生存时间的 key 的值而不是用一个新的 key 值来代替(replace)它的话,那么生存时间不会被改变。
  4. 对一个 key 执行 INCR 命令,对一个列表进行 LPUSH 命令,或者对一个哈希表执行 HSET 命令,这类操作都不会修改 key 本身的生存时间。
  5. 使用 RENAME 对一个 key 进行改名,那么改名后的 key 的生存时间和改名前一样。RENAME 命令的另一种可能是,尝试将一个带生存时间的 key 改名成另一个带生存时间的 another_key ,这时旧的 another_key (以及它的生存时间)会被删除,然后旧的 key 会改名为 another_key ,因此,新的 another_key 的生存时间也和原本的 key 一样。
  6. 使用 PERSIST 命令可以在不删除 key 的情况下,移除 key 的生存时间,让 key 重新成为一个『持久的』(persistent) key 。
  • 更新过期(生存)时间

可以对一个已经带有生存时间的 key 执行 EXPIRE 命令,新指定的生存时间会取代旧的生存时间。

代码如下:

redis> SET cache_audio "hello koala"
OK
 
redis> EXPIRE cache_audio 30  # 设置过期时间为 30 秒
(integer) 1
 
redis> EXPIRE cache_audio 30000   # 更新过期时间
(integer) 1
 
redis> TTL cache_audio    # 查看剩余生存时间
(integer) 29996 

注意在设置过期时间的时候:
返回值:

设置成功返回 1 。

当 key 不存在或者不能为 key 设置生存时间时(比如在低于 2.1.3 版本的 Redis 中你尝试更新 key 的生存时间),返回 0 。

  • 过期时间的精确度

在Redis2.4版本中,过期时间的延迟在一秒之内,可以简单的说,就算key已经过期,但它还是可能在过期一秒之内被访问到,在新的Redis2.6版本中,延迟被降低到了一毫秒之内。

  • 不同版本redis设置过期时间的问题

在redis2.1.3之前的版本中,修改一个带有生存时间的key会导致整个key被删除,这一行为是受当时复制(replication)层的限制而作出的,现在这一限制已经被修复。

  • 如何查看剩余时间
    使用TT
    代码如下:
redis> SET cache_audio "hello koala"
OK
 
redis> EXPIRE cache_audio 30  # 设置过期时间为 30 秒
(integer) 1
 
redis> TTL cache_audio    # 查看剩余生存时间
(integer) 23
  • 如何为redis文件夹下的所有key设置过期时间
    图在电脑桌面有(redis设置过期时间)
    我本地的redis 怎么设置haha.* 的所有过期时间而不是一个固定的key

觉得本文对你有帮助?请分享给更多人

我的公众号.jpg

欢迎大家关注我的公众号——程序员成长指北。请自行微信搜索——“程序员成长指北”

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

推荐阅读更多精彩内容

  • 一、Redis高可用概述 在介绍Redis高可用之前,先说明一下在Redis的语境中高可用的含义。 我们知道,在w...
    空语阅读 1,593评论 0 2
  • 原帖地址:https://www.jianshu.com/p/2f14bc570563 redis概述 Redis...
    onlyHalfSoul阅读 2,148评论 0 28
  • 五种数据结构简介 Redis是使用C编写的,内部实现了一个struct结构体redisObject对象,通过结构体...
    彦帧阅读 6,923评论 0 14
  • 企业级redis集群架构的特点 海量数据 高并发 高可用 要达到高可用,持久化是不可减少的,持久化主要是做灾难恢复...
    lucode阅读 2,191评论 0 7
  • 1.1 资料 ,最好的入门小册子,可以先于一切文档之前看,免费。 作者Antirez的博客,Antirez维护的R...
    JefferyLcm阅读 17,028评论 1 51