《Redis实战》读书笔记

《Redis实战》读书笔记

Redis的重要性不必多说,所以我将从0开始学习Redis,并记录下来。我将把《Redis实战》这本书作为我的入门书籍,没有多少原因,找书的时候发现这个比较适合我,既介绍了基础的语法等知识,也用一些实战项目来应用Redis,下面开始学习之旅吧~~~

Ubunut下Redis安装

书上介绍了Linux, OS X, Windows三种系统下的Redis安装步骤,我自己的电脑为Ubuntu 16.04,所以只记录Linux相关步骤。

简单方法

apt-get install redis-server

不推荐这个方法,因为根据Ubuntu版本的不同,这种安装方法会安装旧版本的Redis。

源码编译安装

  1. 安装构建工具
sudo apt-get update
sudo apt-get install make gcc python-dev
  1. 下载Redis源码

    1. Redis官网下载最新stable版本的Redis源码
    2. 解压源码,编译,安装并启动Redis
    ~:$ tar -xzf redis-4.0.7.tar.gz 解压源码
    ~:$ cd redis-4.0.7/             
    ~/redis-4.0.7:$ make                        编译Redis
    cd src && make all
    ...                         编译信息
    ...                         注意观察编译信息,不应看到错误
    make[1]: leaving directory '~/redis-4.0.7/src
    ~/redis-4.0.7:$ sudo make install     安装Redis
    cd src && make install
    ...                         安装信息不应有错
    make[1]: leaving directory '~/redis-4.0.7/src
    
    ~/redis-4.0.7:$ redis-server redis.conf     启动Redis
    

    3.下载安装Python语言的Redis客户端库

    pip3 install redis hiredis
    

    hiredis包是一个C库,提高Python的Redis客户端速度。

  2. 在Ipython中测试是否可以连接(省略)

问题

我的步骤跟书上不是完全一样,以上操作是根据我自己的实际操作写出。我在Ipython中连接redis失败,因为redis没有启动。原来用redis-server启动不能够保持Redis在后台一直运行,在终端被关闭时就关闭,有两种解决办法。

  1. 运行命令时添加'&',redis-server &

  2. 修改redis.conf文件,将默认的daemonize no改为yes

第一部分 入门

第一部分包括前两章,前两章简单的介绍了一下Redis,以及两个入手的小例子。

Redis是一个速度非常快的非关系数据库,是一个内存数据库。因此Redis不需要事先定义表结构等操作,Redis提供了5种不同类型的数据结构来帮助我们更高效的解决问题。这五种数据结构分别是:

  1. STRING 字符串
  2. LIST 列表
  3. SET 集合
  4. HASH 散列
  5. ZSET 有序集合

前两章包括了两个例子,一个是在博客网站上对文章进行评分和展示,一个是用Redis构建Web应用,因为还没有讲解Redis命令,且对Redis的数据结构还不够熟悉,看示例代码时有些命令看得有些费力,但是命令的理解不是前两章的重点,代码的整体思路也是能看看明白的,重点在于观念的改变,理解Redis可以用在什么场合,以及如何使用Redis。书本配套示例代码

在关系数据库中,我们遇到问题经常需要扭曲问题来适应数据库,但是Redis的数据结构可以自然而然的应用于我们的问题。

命令

第二部分深入介绍了Redis的命令,每个不同的数据结构有不同的命令,整体的掌握这些数据结构以及命令才能恰当地将Redis应用到具体的问题,达到更好的优化效果。

字符串 String

字符串是一个由字节组成的序列,可以存储字符串,整数或者浮点数,与编程语言中的字符串相去不大。

处理数值

  1. set key value 将键key的值设为value
  2. get key 获取存在键key里的值
  3. del key 删除key这个键值对
  4. incr key key存储的值加1(若key不存在,默认初值为0)
  5. decr key key存储的值减1(同上)
  6. incrby key amount key存储的值加整数amount(同上)
  7. decrby key amount key存储的值减整数amount(同上)
  8. incrbyfloat key amount 浮点数amount

处理子串

  1. append key value 将value追加到key值尾端
  2. getrane key start end 获取偏移量start到end(包括两端)的所有字符组成的子串
  3. setrange key start value 将从start偏移量开始的子串设置为value

列表 LIST

列表可以有序的存储多个字符串。

  1. rpush key value [value ...] 将一个或多个value推入列表右端
  2. lpush key value [value ...]
  3. rpop key 移除并返回列表最右端的值
  4. lpop key
  5. lindex key 返回列表中偏移量为offset的元素
  6. lrange key start end 返回列表从start到end的所有元素(包括两端)
  7. ltrim key start end 保留列表从start到end的所有元素(包括两端)

集合

集合以无序的方式存储多个各不相同的元素。

  1. sadd key item [item ...] 将一个或多个元素添加到集合key,返回被添加元素不在原始集合的元素数量
  2. srem key item [item ...] 从集合里移除一个或多个元素,返回被移除的元素数量
  3. sismember key item 检查item是否在集合Key中
  4. scard key 返回集合包含元素数量
  5. smembers 返回集合的所有元素
  6. srandmember key [count] 从集合里随机返回一个或多个元素。当count为正,元素不会重复,为负时可能重复
  7. spop key 从集合key随机移除一个元素并返回
  8. smove source-key dest-key item 如果集合source-key包含item,移除item并添加到dest-key集合;成功移除返回1,否则0
  9. sdiff key [key ...] 返回那些存在第一个集合,但不在其他集合的元素(差集)
  10. sdiffstore dest-key key [key ...] 将上一条命令的元素存储在dest-key集合中
  11. sinter key [key ...] 返回同时存在于所有集合的元素(交集)
  12. sinterstore dest-key key [key ...] 将上一条命令的元素存储在dest-key集合中
  13. sunion key [key ...] 返回至少在一个集合中出现过的元素(并集)
  14. sunionstore dest-key key [key ...] 将上一条命令的元素存储在dest-key集合中

散列 HASH

将多个键值对存储在一个键值里。

  1. hmget key-name key [key ...] 从散列里获取一个或多个值
  2. hmset key-name key [key ...] 为散列设置一个或多个值
  3. hdel key-name key [key ...] 删除,并返回成功删除数量
  4. hlen key-name 返回散列包含的键值对数量
  5. hexists key-name key 检查key键是否在散列中
  6. hkeys key-name 获取散列的所有键
  7. hvals key-name 获取散列的所有值
  8. hgetall key-name 获取散列的所有键值对
  9. hincrby key-name key increment 将键Key存储的值加上整数increment
  10. hincrbyfloat key-name key increment 浮点数

有序集合 ZSET

与散列存储着键和值之间的映射类似,有序集合存储着成员与分值之间的映射。

  1. zadd key-name score member [score member ...] 将带有给定分值score的成员member添加到有序集合
  2. zrem key-name member [member ...] 从有序集合删除给定成员,返回被移除成员数量
  3. zcard key-name 返回有序集合成员数量
  4. zincrby key-name increment member 将member的分值加上increment(python客户端参数位置有变化)
  5. zcount key-name min max 返回分值介于min和max之前的成员数量
  6. zrank key-name member 返回成员member在有序集合中的排名(从0开始)
  7. zscore key-name member 返回成员member的分值
  8. zrange key-name start stop [withscores] 返回排名介于start和stop之间的成员(包括两端),如果加上withscores,则成员的分值一并返回
  9. zrevrank key-name member 返回member的排名,成员按照分值从大到小排列
  10. zrevrange key-name start stop [withscores] 返回start到stop范围内的成员,按值从大到小排列
  11. zrangebyscore key min max [withscores] 返回分值介于min,max间的所有成员
  12. zrevrangebyscore key min max [withscores] 返回分值介于min,max间的所有成员,按值从大到小
  13. zremrangebyrank key-name start stop 移除排名介于start,stop的成员
  14. zremrangebyscore key-name min max 移除分值介于min,max的成员
  15. zinterstore dest-key key-count key [key...] [weights weight [weight]] [aggregate sum|min|max] 对给定有序集合执行类似于集合的交集运算
  16. zunionstore dest-key key-count key [key...] [weights weight [weight]] [aggregate sum|min|max] 执行并集运算

关于5种数据结构的常用命令,上面已经列出来很多,但是其实还有很多。我个人觉得记住所有的是有难度的(记性差),这些命令的命名规则还是有许多相似之处,可以方便记忆,但是更好的办法是记住一些常用的,然后了解Redis的命令可以实现什么样的操作,当需要这样的操作时再去查命令。

其他命令

  1. sort source-key 相当于关系数据库的order by(有很多可选参数)
  2. persist key-name 移除键的过期时间
  3. ttl key-name 查看距离过期时间还有多少秒
  4. expire key-name seconds 让给定键在指定秒数之后过期
  5. expireat key-name timestamp 将给定键的过期时间设置为给定的UNIX时间戳
  6. 事务命令
  7. 发布订阅命令

更多命令参考 官网

数据安全与性能保障

与关系数据库类似,Redis也需考虑数据的安全,需要备份数据,保障出现故障后能够全部或最大化的恢复损失。但与关系数据库不同的是,Redis是内存数据库,数据是存储在内存里的,在程序崩溃、重启等情况下内存数据就会丢失,还需要考虑数据持久化,即将内存的数据写入磁盘。Redis提供了两种数据持久化的方法,一种为快照持久化,另一种为只追加文件(append-only file AOF)。可以单独使用,或者同时使用,甚至都不使用。

持久化后的数据就是安全的了吗?不是的,现在面临的就是和关系数据库类似的备份数据问题了。需要将数据复制到多台服务器来保证数据安全,这就是主从服务器的一部分。

Redis复制启动过程

步骤 主服务器操作 从服务器操作
1 (等待命令进入) 连接(重连接)主服务器,发送SYNC命令
2 开始执行BGSAVE,并使用缓冲区记录BGSAVE之后执行的所有写命令 根据配置决定是否使用现有数据来处理客户端请求,还是向客户端返回错误
3 BGSAVE执行完毕,向从服务器发送快照文件,在发送期间继续使用缓冲区记录被执行的写命令 丢弃旧数据,载入主服务器的快照文件
4 快照发送完毕,向从服务器发送存储在缓冲区里的写命令 完成对快照文件的解释操作,像往常一样开始接受命令请求
5 缓冲区存储的写命令发送完毕;现在开始,每执行一个写命令,向从服务器发送相同的写命令 执行主服务器发来的所有存储在缓冲区里面的写命令,并开始接受并执行主服务器发来的每个写命令

性能优化

大家都知道在程序运行过程中,IO访问速度是远远不如CPU计算速度的,在Redis中也有类似的问题存在。Redis客户端发送命令到Redis服务器、Redis服务器响应发送到客户端的过程是相对较慢的,因此要减少客户端与服务器的通信次数,通过使用pipeline技术将多个命令放在一次通信过程中会大大提高Redis的效率。

最后

写到这其实只占了书本篇幅的2/5,但是后面的篇幅大多数都是结合着具体例子,介绍了一些Redis常用场景,通过分析例子需求实现的一个个小功能,是一些Python代码片段,包含着Redis命令和逻辑处理,记录下来的意义不大,因为实际需求总在发生变化,总是不同的。

Redis的相关知识肯定远远不止这些,这些只是最最基础的,我以后可能会继续分享Redis的相关文章,学习过程等等。一起加油!!!

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

推荐阅读更多精彩内容